• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

질문있습니다

21.12.02 00:05 작성 조회수 272

0

슈팅게임을 만든 후 실행을 하였는데 글자를 입력하는 커서?같은게 화면에 떠다닙니다. 또 위아래로 자연스럽게 움직여야할 player가 어느정도 밑으로가면 더이상 밑으로 내려가지않는 현상이 발생합니다ㅜ 

답변 3

·

답변을 작성해보세요.

1

콘솔커서는 안보이게하는 코드가있습니다.

#include <stdio.h>

#include <Windows.h>

 

void CursorView()

{

    CONSOLE_CURSOR_INFO cursorInfo = { 0, };

    cursorInfo.dwSize = 1; //커서 굵기 (1 ~ 100)

    cursorInfo.bVisible = FALSE; //커서 Visible TRUE(보임) FALSE(숨김)

    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);

}

 

int main() {

    CursorView();

    return 0;

}

 

밑으로 못가는건 더못가게 막은부분과

배열로 가로 80 세로 25 맵을만들어서  그안에서 움직이고 있어서 그렇습니다.

 

 

 

전찬영님의 프로필

전찬영

질문자

2021.12.02

그래도 보이는것 같습니다ㅜ

아래처럼 코드를 짯는데 사진에 보이는 커서잔상이 여기저기 날아다닙니다..

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <windows.h>

#include <time.h>

#include <stdbool.h>

#include <stdio.h>

#include <Windows.h>

 

 

 

void CursorView()

 

{

 

CONSOLE_CURSOR_INFO cursorInfo = { 0, };

 

cursorInfo.dwSize = 1; //커서 굵기 (1 ~ 100)

 

cursorInfo.bVisible = FALSE; //커서 Visible TRUE(보임) FALSE(숨김)

 

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);

 

}

struct BULLET

{

int x; //미사일 x좌표

int y; //미사일 y좌표

bool fire; //미사일 발사상태

};

 

//배열로 배경을 좌표를 만든다

char bg[25][80];

 

 

//플레이어좌표

int playerX;

int playerY;

 

//적 좌표

int enemyX;

int enemyY;

 

//미사일 갯수

struct BULLET playerBullet[20];

 

//함수설계

void ClearScreen(); //화면을 지운다

void GameMain(); //게임전체를 관리하는 함수

void PrintScreen(); //화면을 그려주는 함수

void KeyControl(); //키 관련 함수

void BulletDraw(); // 미사일을 그려주는 함수

void PlayerDraw(); //플레이어 그리는 함수

void EnemyDraw(); //적 그리는 함수

void EnemyMove(); // 적 움직이는 함수

void ClashEnemyAndBullet(); //충돌처리함수

void gotoxy(int x, int y);

 

int SetFontSize(HANDLE windowHandle, COORD size)

{

CONSOLE_FONT_INFOEX font = { sizeof(CONSOLE_FONT_INFOEX) };

 

if (!GetCurrentConsoleFontEx(windowHandle, 0, &font))

{

return 0;

}

 

font.dwFontSize = size;

 

if (!SetCurrentConsoleFontEx(windowHandle, 0, &font))

{

return 0;

}

 

return 1;

}

 

void main()

{

//랜덤함수 준비

srand((unsigned)time(NULL));

//플레이어 좌표위치

playerX = 0;

playerY = 12;

 

//적 좌표 위치

enemyX = 77;

enemyY = 12;

 

//플레이어 미사일 초기화(미사일 발사 전 준비상태)

for (int i = 0; i < 20; i++)

{

playerBullet[i].x = 0;

playerBullet[i].y = 0;

playerBullet[i].fire = false;

}

 

gotoxy(40, 20);

printf("Shooting Game!");

gotoxy(40, 12);

printf("방향: 이동키");

gotoxy(40, 13);

printf("공격: 스페이스바");

gotoxy(40, 15);

printf("시작하시려면 아무키나눌러주세요");

 

_getch();

system("cls");

 

HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

COORD size;

 

for (int i = 5; i > 0; i--)

{

gotoxy(0, 0);

printf("%d", i);

Sleep(1000);

}

 

system("cls");

size.X = 20;

size.Y = 20;

SetFontSize(h, size);

system("mode con cols=100 lines=25");

 

//현재 초단위 시간을 받아온다

int dwtime = GetTickCount();

 

//게임실행 무한루프

while (true)

{

 

//0.05초 딜레이

if (dwtime + 50 < GetTickCount())

{

dwtime = GetTickCount();

//지우고

ClearScreen();

//플레이어나 적이 움직이고

GameMain();

//그려주고

PrintScreen();

}

}

}

 

void gotoxy(int x, int y)

{

COORD Pos;

Pos.X = x;

Pos.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void ClearScreen()

{

//콘솔창에 그려진 모든걸 지움

system("cls");

 

//배열에 공백으로 넣어서 지움

for (int y = 0; y < 25; y++)

{

for (int x = 0; x < 80; x++)

{

bg[y][x] = ' ';

}

}

}

 

void GameMain()

{

//키를 입력하는부분

KeyControl();

//미사일을 그려준다.

BulletDraw();

//플레이어를 그려준다

PlayerDraw();

//적의 움직임

EnemyMove();

//적을 그려주는 부분

EnemyDraw();

//미사일 적의 충돌

ClashEnemyAndBullet();

}

 

void PrintScreen()

{

bg[24][79] = '\0'; //맨 마지막 배열에 널 문자를 넣어준다

 

for (int i = 0; i < 25; i++)

{

for (int j = 0; j < 80; j++)

{

printf("%c", bg[i][j]);

}

printf("\n");

}

}

 

void KeyControl()

{

char pressKey;

//키가 입력되면 잡아준다.

if (_kbhit())

{

pressKey = _getch(); //키가 입력되어 변수에 저장

 

switch (pressKey)

{

case 72:

//위쪽방향 화살표 키가 눌렸을 때

playerY--;

if (playerY < 1)

playerY = 1;

break;

 

case 75:

//왼쪽 화살표 키가 눌렸을 때

playerX--;

if (playerX < 0) //if문 한줄은 {}생략가능

playerX = 0;

break;

 

case 77:

//오른쪽 방향 키

playerX++;

 

if (playerX > 75)

playerX = 75;

break;

 

case 80:

//아래쪽 방향 키

playerY++;

if (playerY > 23)

playerY = 23;

break;

 

case 32:

//스페이스바 키가 눌리면

//스페이스바 키가 눌리면 총알 발사

for (int i = 0; i < 20; i++)

{

//미사일이 준비되어있는 상태인 경우에만 발사가능

if (playerBullet[i].fire == false)

{

playerBullet[i].fire = true;

//플레이어 앞에서 미사일을 쏘기 +5

playerBullet[i].x = playerX + 5;

playerBullet[i].y = playerY;

//한발만 발사

break;

}

}

break;

}

}

}

 

void BulletDraw()

{

//미사일 전체 20개 중에

for (int i = 0; i < 20; i++)

//플레이어 미사일 날아가고있는 상태 true

if (playerBullet[i].fire == true)

{

//미사일을 그린다.

bg[playerBullet[i].y][playerBullet[i].x - 1] = '-';

bg[playerBullet[i].y][playerBullet[i].x - 0] = '>';

//미사일 앞으로 +1

playerBullet[i].x++;

 

//미사일이 80을 넘어갈 경우

if (playerBullet[i].x > 79)

{

//미사일 준비상태로 전환

playerBullet[i].fire = false;

 

}

}

}

 

void PlayerDraw()

{

//플레이어그리기

bg[playerY - 1][playerX + 1] = '>';

bg[playerY - 1][playerX + 0] = '-';

bg[playerY + 0][playerX + 1] = '>';

bg[playerY + 0][playerX + 2] = '>';

bg[playerY + 0][playerX + 3] = '>';

bg[playerY + 1][playerX + 0] = '-';

bg[playerY + 1][playerX + 1] = '>';

}

 

void EnemyDraw()

{

 

//적그리기

bg[enemyY][enemyX - 2] = '<';

bg[enemyY][enemyX - 1] = '-';

bg[enemyY][enemyX + 0] = 'O';

bg[enemyY][enemyX + 1] = '-';

bg[enemyY][enemyX + 2] = '>';

 

 

 

}

 

void EnemyMove()

{

//적은 왼쪽으로 오게한다.

enemyX--;

 

//적이 왼쪽으로 다 왔을 경우

if (enemyX < 2)

{

//적을 랜덤하게 y쪽 좌표를 바꿔준다

enemyX = 77;

enemyY = (rand() % 20) + 2;

 

}

}

 

//충돌처리함수

void ClashEnemyAndBullet()

{

//미사일 20개 전체 판별

for (int i = 0; i < 20; i++)

{

//미사일이 살아있고

if (playerBullet[i].fire == true)

{

//적과 미사일의 y값이 같고

if (playerBullet[i].y == enemyY)

{

//플레이어 미사일 x값이 같은지 판별

//x값은 적의 크기만큼 x-1 0 x+1까지 세개좌표로 잘 충돌되게 판별

if (playerBullet[i].x >= (enemyX - 1)

&& playerBullet[i].x <= (enemyX + 1))

{

//충돌되면 적 y값 바꿔주기

enemyX = 77;

enemyY = (rand() % 20) + 2;

playerBullet[i].fire = false;

}

}

}

}

}

0

메인함수 첫줄에 함수를 적어주세요.

void main()

{

           CursorView();       //<-이거한줄추가해주시면 함수실행

}

0

전찬영님의 프로필

전찬영

질문자

2021.12.02

제가 추가한 코드도 있지만 코드도 같이 첨부하겠습니다

문제가되면 삭제하겠습니다!

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <windows.h>

#include <time.h>

#include <stdbool.h>

 

struct BULLET

{

int x; //미사일 x좌표

int y; //미사일 y좌표

bool fire; //미사일 발사상태

};

 

//배열로 배경을 좌표를 만든다

char bg[25][80];

 

 

//플레이어좌표

int playerX;

int playerY;

 

//적 좌표

int enemyX;

int enemyY;

 

//미사일 갯수

struct BULLET playerBullet[20];

 

//함수설계

void ClearScreen(); //화면을 지운다

void GameMain(); //게임전체를 관리하는 함수

void PrintScreen(); //화면을 그려주는 함수

void KeyControl(); //키 관련 함수

void BulletDraw(); // 미사일을 그려주는 함수

void PlayerDraw(); //플레이어 그리는 함수

void EnemyDraw(); //적 그리는 함수

void EnemyMove(); // 적 움직이는 함수

void ClashEnemyAndBullet(); //충돌처리함수

void gotoxy(int x, int y);

 

int SetFontSize(HANDLE windowHandle, COORD size)

{

    CONSOLE_FONT_INFOEX font = { sizeof(CONSOLE_FONT_INFOEX) };

 

    if (!GetCurrentConsoleFontEx(windowHandle, 0, &font))

        {

        return 0;

        }

 

    font.dwFontSize = size;

 

    if (!SetCurrentConsoleFontEx(windowHandle, 0, &font))

        {

        return 0;

        }

 

    return 1;

}

 

void main()

{

//랜덤함수 준비

srand((unsigned)time(NULL));

//플레이어 좌표위치

playerX = 0;

playerY = 12;

 

//적 좌표 위치

enemyX = 77;

enemyY = 12;

 

//플레이어 미사일 초기화(미사일 발사 전 준비상태)

for (int i = 0; i < 20; i++)

{

playerBullet[i].x= 0;

playerBullet[i].y = 0;

playerBullet[i].fire = false;

}

gotoxy(10,10);

printf("Shooting Game!");

gotoxy(10,12);

printf("방향: 이동키");

gotoxy(10,13);

printf("공격: 스페이스바");

gotoxy(10,15);

printf("시작하시려면 아무키나눌러주세요");

_getch();

system("cls");

HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);

    COORD size;

    size.X = 200;

    size.Y = 200;

    SetFontSize(h, size);

    system("mode con cols=1 lines=1"); 

    

    for(int i = 5; i > 0; i--)

    {

    gotoxy(0,0);

    printf("%d",i);

    Sleep(1000);

}

system("cls");

    size.X = 20;

    size.Y = 20;

    SetFontSize(h, size);

    system("mode con cols=100 lines=25");

//현재 초단위 시간을 받아온다

int dwtime = GetTickCount();

 

//게임실행 무한루프

while (true)

{

 

//0.05초 딜레이

if (dwtime + 50 < GetTickCount())

{

dwtime = GetTickCount();

//지우고

ClearScreen();

//플레이어나 적이 움직이고

GameMain();

//그려주고

PrintScreen();

}

}

}

 

void gotoxy(int x, int y)

{

COORD Pos;

Pos.X = x;

Pos.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);

}

 

void ClearScreen()

{

//콘솔창에 그려진 모든걸 지움

system("cls");

 

//배열에 공백으로 넣어서 지움

for (int y = 0; y < 25; y++)

{

for (int x = 0; x < 80; x++)

{

bg[y][x] = ' ';

}

}

}

 

void GameMain()

{

//키를 입력하는부분

KeyControl();

//미사일을 그려준다.

BulletDraw();

//플레이어를 그려준다

PlayerDraw();

//적의 움직임

EnemyMove();

//적을 그려주는 부분

EnemyDraw();

//미사일 적의 충돌

ClashEnemyAndBullet();

}

 

void PrintScreen()

{

bg[24][79] = '\0'; //맨 마지막 배열에 널 문자를 넣어준다

for(int i = 0; i < 25; i++)

{

for(int j = 0; j < 80; j++)

{

printf("%c",bg[i][j]);

}

printf("\n");

}

}

 

void KeyControl()

{

char pressKey;

//키가 입력되면 잡아준다.

if (_kbhit())

{

pressKey = _getch(); //키가 입력되어 변수에 저장

 

switch (pressKey)

{

case 72:

//위쪽방향 화살표 키가 눌렸을 때

playerY--;

if (playerY < 1)

playerY = 1;

break;

case 75:

//왼쪽 화살표 키가 눌렸을 때

playerX--;

if (playerX < 0) //if문 한줄은 {}생략가능

playerX = 0;

break;

case 77:

//오른쪽 방향 키

playerX++;

 

if (playerX > 75)

playerX = 75;

break;

case 80:

//아래쪽 방향 키

playerY++;

if (playerY > 23)

playerY = 23;

break;

case 32:

//스페이스바 키가 눌리면

//스페이스바 키가 눌리면 총알 발사

for (int i = 0; i < 20; i++)

{

//미사일이 준비되어있는 상태인 경우에만 발사가능

if (playerBullet[i].fire == false)

{

playerBullet[i].fire = true;

//플레이어 앞에서 미사일을 쏘기 +5

playerBullet[i].x = playerX + 5;

playerBullet[i].y = playerY;

//한발만 발사

break;

}

}

break;

}

}

}

 

void BulletDraw()

{

//미사일 전체 20개 중에

for(int i=0;i<20;i++)

//플레이어 미사일 날아가고있는 상태 true

if (playerBullet[i].fire == true)

{

//미사일을 그린다.

bg[playerBullet[i].y][playerBullet[i].x - 1] = '-';

bg[playerBullet[i].y][playerBullet[i].x - 0] = '>';

//미사일 앞으로 +1

playerBullet[i].x++;

 

//미사일이 80을 넘어갈 경우

if (playerBullet[i].x > 79)

{

//미사일 준비상태로 전환

playerBullet[i].fire = false;

 

}

}

}

 

void PlayerDraw()

{

//플레이어그리기

bg[playerY - 1][playerX + 1] = '>';

bg[playerY - 1][playerX + 0] = '-';

bg[playerY + 0][playerX + 1]= '>';

bg[playerY + 0][playerX + 2]= '>';

bg[playerY + 0][playerX + 3]= '>';

bg[playerY + 1][playerX + 0] = '-';

bg[playerY + 1][playerX + 1] = '>';

}

 

void EnemyDraw()

{

 

//적그리기

bg[enemyY][enemyX - 2] = '<';

bg[enemyY][enemyX - 1] = '-';

bg[enemyY][enemyX + 0] = 'O';

bg[enemyY][enemyX + 1] = '-';

bg[enemyY][enemyX + 2] = '>';

 

 

 

}

 

void EnemyMove()

{

//적은 왼쪽으로 오게한다.

enemyX--;

 

//적이 왼쪽으로 다 왔을 경우

if (enemyX < 2)

{

//적을 랜덤하게 y쪽 좌표를 바꿔준다

enemyX = 77;

enemyY = (rand() % 20) + 2;

 

}

}

 

//충돌처리함수

void ClashEnemyAndBullet()

{

//미사일 20개 전체 판별

for (int i = 0; i < 20; i++)

{

//미사일이 살아있고

if (playerBullet[i].fire == true)

{

//적과 미사일의 y값이 같고

if (playerBullet[i].y ==enemyY)

{

//플레이어 미사일 x값이 같은지 판별

//x값은 적의 크기만큼 x-1 0 x+1까지 세개좌표로 잘 충돌되게 판별

if (playerBullet[i].x >= (enemyX - 1)

&& playerBullet[i].x <= (enemyX + 1))

{

//충돌되면 적 y값 바꿔주기

enemyX = 77;

enemyY = (rand() % 20) + 2;

playerBullet[i].fire = false;

}

}

}

}

}