강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của jcy9901133438
jcy9901133438

câu hỏi đã được viết

Cách làm game bắn súng bằng ngôn ngữ C

질문있습니다

Viết

·

463

0

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

c

Câu trả lời 3

1

cosart님의 프로필 이미지
cosart
Người chia sẻ kiến thức

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

#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 맵을만들어서  그안에서 움직이고 있어서 그렇습니다.

 

 

 

jcy9901133438님의 프로필 이미지
jcy9901133438
Người đặt câu hỏi

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

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

 

#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

cosart님의 프로필 이미지
cosart
Người chia sẻ kiến thức

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

void main()

{

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

}

0

jcy9901133438님의 프로필 이미지
jcy9901133438
Người đặt câu hỏi

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

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

 

#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;

}

}

}

}

}

Hình ảnh hồ sơ của jcy9901133438
jcy9901133438

câu hỏi đã được viết

Đặt câu hỏi