-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
질문있습니다
21.12.02 00:05 작성 조회수 272
0
슈팅게임을 만든 후 실행을 하였는데 글자를 입력하는 커서?같은게 화면에 떠다닙니다. 또 위아래로 자연스럽게 움직여야할 player가 어느정도 밑으로가면 더이상 밑으로 내려가지않는 현상이 발생합니다ㅜ
답변을 작성해보세요.
1
코사트
지식공유자2021.12.02
콘솔커서는 안보이게하는 코드가있습니다.
#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
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;
}
}
}
}
}
답변 3