게임 만들기에서 구조체가 제대로 실행이 안됩니다.
그린나래
멀티태스킹 게임을 만드는 중인데 총알은 구조체가 잘 적용되었는데 나머지 구조체(타겟, 장애물)들은 정상 동작이 안됩니다.
참고로 총알은 스페이스 바를누르면i번째총알이 true가 되며화면에서 벗어나면 false값이 되어 다시 장전되는 형식입니다.코드가 쓸데없이 길기도 해서 좀 더 효과적으로 만들도록 조언도 부탁드려요.
-----------------------------------------------------------------
/*
멀티태스킹 게임
게임의 종류
1. ←→로 움직이며 위에서 내려오는 적을 쏘기.
2. ↑↓키로 장애물 피하기
(장애물의 크기는 랜덤함수로 어느 정도 잡고 총알 장전식으로) 장애물은 오른쪽에서 나옴.
*/
#include windows.h
#include stdlib.h
#include stdio.h
#include conio.h
#include time.h// 랜덤함수
void gotoxy(int x, int y)
{
COORD pos={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
enum
{
BLACK,/* 0 : 검은색 */
DARK_BLUE,/* 1 : 어두운 파란색 */
DARK_GREEN,/* 2 : 어두운 초록색 */
DARK_SKY_BLUE, /* 3 : 어두운 하늘색 */
DARK_RED,/* 4 : 어두운 빨간색 */
DARK_VOILET,/* 5 : 어두운 보라색 */
DARK_YELLOW,/* 6 : 어두운 노란색 */
GRAY,/* 7 : 회색 */
DARK_GRAY,/* 8 : 어두운 회색 */
BLUE,/* 9 : 파란색 */
GREEN,/* 10 : 초록색 */
SKY_BLUE,/* 11 : 하늘색 */
RED,/* 12 : 빨강색 */
VOILET,/* 13 : 보라색 */
YELLOW,/* 14 : 노란색 */
WHITE,/* 15 : 하얀색 */
};
enum {HIDDEN, SHOW};
void color(WORD color)// 색깔 넣기 함수
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define UP 72
#define DOWN 80
#define ESC 27
#define MAX_bullet 3// 게임1에서 사용되는 플레이어의 최대 총알수는 3
#define game1ENEMY 12////////////////////// 게임 1에서의 장애물 최대수
#define game1target 3////////////////////// 게임 1에서의 타겟 최대수
#define game2ENEMY 5////////////////////// 게임 2에서의 장애물 최대수
#define restart 114// 게임 재시작 값
void clear();
void GAME();
void Line();// 판의 경계
void control();
void player1print();// 첫번째 게임의 플레이어 1 출력
void player2print();
void printplayer1bullet();
void enemy();// 모든 게임에 나오는 적들을 이 함수안에 만듬
void Random1();
void Random2();// enemy2의 좌표 지정
void enemy1();
void enemy2();
void target1();// 게임 1의 타겟
void Crash();
void Game_Over();// 게임오버
void CursorView(char show);// 커서 표시 없애는 함수
int player1X,player1Y;// 첫번째 게임의 플레이어 좌표
int player2X,player2Y;// 두번째 게임의 플레이어 좌표
int count;// 오브젝트의 속도를 조절하기 위해 숫자를 셈
typedef struct bullet
{
int bulletX;// int x, y를 bulletX,bulletY로 수정할 것
int bulletY;
bool fire;
}BULLET;
typedef struct game1enemy// 게임 1의 적을 구조체로 구현
{
int game1eX;
int game1eY;
bool start;
}GAME1;
typedef struct game2enemy// 게임 2의 적을 구조체로 구현
{
int game2eX;
int game2eY;
bool start;
}GAME2;
typedef struct game1TARGET// 게임 1의 타겟을 구조체로 구현
{
int targetX;
int targetY;
bool start;
}TARGET;
int lineX=38,lineY=1;// 경계선
BULLET bullet[MAX_bullet];
GAME1 game1enemy[game1ENEMY];
GAME2 game2enemy[game2ENEMY];
TARGET game1TARGET[game1target];
void main()
{
//PORTAL: 포탈함수(?) 선언하면 여기서 다시 시작
CursorView(HIDDEN);
player1X=17;
player1Y=20;
player2X=42;
player2Y=20;
while(1)
{
  /Sleep(30);
clear();
Line();
GAME();
target1();// 1게임의 타겟
enemy1();
enemy2();
count++;
if(count5)/// 난이도 설정의 가장 중요한 부분
{
count=0;
}
}
}
void clear()
{
for(int i=0;iMAX_bullet;i++)// 총알의 최대 개수를 셈
{
if(bullet[i].fire==true)// 발사된 i번째 총알의 잔상을 지우는 if문
{
gotoxy(bullet[i].bulletX,bullet[i].bulletY);
bullet[i].bulletY--;
printf( );
}
if(bullet[i].bulletY0)// i번째 총알이 끝까지 가면
{
gotoxy(bullet[i].bulletX,bullet[i].bulletY);
printf( );
bullet[i].fire=false;// i번째 총알은 false값이 됨
}
}
}
void Line()
{
color(GREEN);
for(lineY=0;lineY24;lineY++)
{
gotoxy(lineX,lineY);
printf(│);
}
}
void GAME()
{
control();
printplayer1bullet();// 1게임의 플레이어 총알을 출력하는 함수
player1print();
player2print();
Random1();
Random2();// 랜덤함수를 통해 장애물의 출현좌표를 설정
Crash();// 타겟과 총알이 부딪혔는지 확인하고 처리하는 함수
}
void control()
{
char key;
if(kbhit())
{
key=getch();
switch(key)
{
case LEFT:// 게임 1에 사용되는 방향키
if(player1X4)
{
gotoxy(player1X,player1Y);
printf( );
player1X=2;
}
else
{
gotoxy(player1X,player1Y);
printf( );
player1X-=3;
}
break;
case RIGHT:// 게임 1에 사용되는 방향키
if(player1X29)
{
gotoxy(player1X,player1Y);
printf( );
player1X=32;
}
else
{
gotoxy(player1X,player1Y);
printf( );
player1X+=3;
}
break;
case SPACE:// 게임 1에 사용되는 총알
for(int i=0;iMAX_bullet;i++)
{
if(bullet[i].fire==false)
{
bullet[i].fire=true;
bullet[i].bulletX=player1X;
bullet[i].bulletY=player1Y;
break;
}
}
break;
case UP:// 게임 2에 사용되는 방향키
if(player2Y5)
{
gotoxy(player2X,player2Y);
printf( );// 가장 끝에 남는 플레이어 잔상 지우기
player2Y=2;
}
else
{
player2Y-=3;
gotoxy(player2X,player2Y+3);
printf( );
}
break;
case DOWN:// 게임 2에 사용되는 방향키
if(player2Y17)
{
gotoxy(player2X,player2Y);
printf( );
player2Y=20;
}
else
{
player2Y+=3;
gotoxy(player2X,player2Y-3);
printf( );
}
break;
case ESC:
exit(1);
break;
}
}
}
void printplayer1bullet()
{
color(YELLOW);
for(int i=0;iMAX_bullet;i++)
{
if(bullet[i].fire==true)// i번째 총알이 참이면
{
gotoxy(bullet[i].bulletX,bullet[i].bulletY);// 총알좌표 지정
printf(*);// 총알 출력
}
}
}
void player1print()
{
color(BLUE);
gotoxy(player1X,player1Y);
printf(○);
}
void player2print()
{
gotoxy(player2X,player2Y);
printf(○);
}
void Random1()// 총알이 한번만 나감
{
for(int i=0;igame1ENEMY;i++)// 1게임의 랜덤함수
{
if(game1enemy[i].start==false)// 처음 상태가 false일때 실행
{
int R;
srand((unsigned)time(NULL));
R = (rand() % 11);
game1enemy[i].game1eX=R;
if(R==0)
{
game1enemy[i].game1eX=2;
}
else if(R==1)
{
game1enemy[i].game1eX=5;
}
else if(R==2)
{
game1enemy[i].game1eX=8;
}
else if(R==3)
{
game1enemy[i].game1eX=11;
}
else if(R==4)
{
game1enemy[i].game1eX=14;
}
else if(R==5)
{
game1enemy[i].game1eX=17;
}
else if(R==6)
{
game1enemy[i].game1eX=20;
}
else if(R==7)
{
game1enemy[i].game1eX=23;
}
else if(R==8)
{
game1enemy[i].game1eX=26;
}
else if(R==9)
{
game1enemy[i].game1eX=29;
}
else
{
game1enemy[i].game1eX=32;
}
game1enemy[i].game1eY=1;
game1enemy[i].start=true;
}
if(game1enemy[i].game1eY22)// 장애물의 좌표가 화면을 벗어나면b어나면
{
gotoxy(game1enemy[i].game1eX,game1enemy[i].game1eY);
printf( );
game1enemy[i].start=false;// 펄스 값이 됨
}
}
for(int i=0;igame1target;i++)// 타겟의 좌표 설정
{
if(game1TARGET[i].start==false)
{
int Rt;
srand((unsigned)time(NULL));
Rt = (rand() % 10 + 1 );
game1TARGET[i].targetX=Rt;
if(Rt==0)//랜덤 값이 들어오면 적절한 좌표를 찍어 보내줌
{
game1TARGET[i].targetX=2;
}
else if(Rt==1)
{
game1TARGET[i].targetX=5;
}
else if(Rt==2)
{
game1TARGET[i].targetX=8;
}
else if(Rt==3)
{
game1TARGET[i].targetX=11;
}
else if(Rt==4)
{
game1TARGET[i].targetX=14;
}
else if(Rt==5)
{
game1TARGET[i].targetX=17;
}
else if(Rt==6)
{
game1TARGET[i].targetX=20;
}
else if(Rt==7)
{
game1TARGET[i].targetX=23;
}
else if(Rt==8)
{
game1TARGET[i].targetX=26;
}
else if(Rt==9)
{
game1TARGET[i].targetX=29;
}
else
{
game1TARGET[i].targetX=32;
}
game1TARGET[i].targetY=1;
game1TARGET[i].start=true;
}
}
}
void Random2()// 게임 2의 랜덤함수 사용
{
for(int i=0;igame2ENEMY;i++)// 적 최대수
{
if(game2enemy[i].start==false)// false 값이면
{
int R;// 변수 선언
srand((unsigned)time(NULL));
R = (rand() % 7);// 랜덤숫자를 이용해서
if(R==0)// 나온 숫자를 적당한 좌표에 맞춰줌
{
game2enemy[i].game2eY=2;// 랜덤함수 값이 0이면 Y좌표 2에 설정
}
else if(R==1)
{
game2enemy[i].game2eY=5;// 랜덤함수 값이 1이면 Y좌표 5에 설정
}
else if(R==2)
{
game2enemy[i].game2eY=8;
}
else if(R==3)
{
game2enemy[i].game2eY=11;
}
else if(R==4)
{
game2enemy[i].game2eY=14;
}
else if(R==5)
{
game2enemy[i].game2eY=17;
}
else
{
game2enemy[i].game2eY=20;
}
game2enemy[i].game2eX=73;
game2enemy[i].start=true;
}
}
}
void target1()
{
color(SKY_BLUE);// 하늘색
for(int i=0;igame1target;i++)
{
if(game1TARGET[i].start==true)
{
if(count==1)
{
gotoxy(game1TARGET[i].targetX,game1TARGET[i].targetY);
printf( );
gotoxy(game1TARGET[i].targetX,++game1TARGET[i].targetY);
printf(◈);
}
if(game1TARGET[i].targetY23)// 장애물이 X좌표 39까지 접근하면
{
gotoxy(game1TARGET[i].targetX,game1TARGET[i].targetY);
printf( );
game1TARGET[i].start=false;// i 번째 장애물이 초기화됨
}
}
}
}
void enemy1()
{
color(VOILET);// 보라색
for(int i=0;igame1ENEMY;i++)
{
if(game1enemy[i].start==true)
{
if((count==2) || (count==4))// 속도 조절~~~~~~~~~~~
{
gotoxy(game1enemy[i].game1eX,game1enemy[i].game1eY);
printf( );
gotoxy(game1enemy[i].game1eX,++game1enemy[i].game1eY);
printf(▼);
}
}
}
}
void enemy2()//
{
color(RED);
for(int i=0;igame2ENEMY;i++)
{
if(game2enemy[i].start==true)
{
if(count==2 || count==4)// 속도 조절, 카운트 값이 2와 4일 때에만 실행
{
gotoxy(game2enemy[i].game2eX,game2enemy[i].game2eY);
printf( );
gotoxy(--game2enemy[i].game2eX,game2enemy[i].game2eY);
printf(◀);
}
}
if(game2enemy[i].game2eX41)// 장애물이 X좌표 39까지 접근하면
{
gotoxy(game2enemy[i].game2eX,game2enemy[i].game2eY);
printf( );
game2enemy[i].start=false;// i 번째 장애물이 초기화됨
}
}
}
void Crash()
{
char Replay;// 재시작 ~~~~~~~
for(int i=0;igame2ENEMY;i++)// 2게임의 장애물 중 하나라도 맞았는지 확인하기 위해 반복
{
if(game2enemy[i].game2eY==player2Y)// 2게임의 플레이어와 장애물의 Y축 위치가 같으면
{
if(game2enemy[i].game2eX==player2X)// 2게임의 플레이어와 장애물의 X축 위치가 같으면
{
Game_Over();
/*if(kbhit())//////포탈함수///////////
{
Replay=getch();
if(Replay)
{
PORTAL;
}
}*///////////////////////
/}
}
}
for(int i=0;igame1ENEMY;i++)// 1게임의 장애물 중 하나라도 맞았는지 확인하기 위해 반복
{
if(game1enemy[i].game1eY==player1Y)// 1게임의 플레이어와 장애물의 Y축 위치가 같으면
{
if(game1enemy[i].game1eX==player1X)// 1게임의 플레이어와 장애물의 X축 위치가 같으면
{
Game_Over();
/*if(kbhit())//////////////////////
{
Replay=getch();
if(Replay)
{
PORTAL;
}
}*//////////////////////////
}
}
}
for(int i=0;igame1target;i++)
{
if(game1TARGET[i].targetY==player1Y)
{
if(game1TARGET[i].targetX==player1X)
{
color(RED);
gotoxy(player1X,player1Y);
printf(꽝!);
Sleep(10);
system(cls);
game1TARGET[i].start=false;
}
}
int b=0;///////////////////////////////////////////////// 총알과 타겟이 맞아도 구조체라서 잘 안됨~~
if(game1TARGET[i].targetY==bullet[b].bulletY)
{
if(game1TARGET[i].targetX==bullet[b].bulletX)
{
game1TARGET[i].start=false;
gotoxy(bullet[b].bulletX,bullet[b].bulletY);
printf( );
bullet[b].fire=false;// 총알이 타겟에 맞으면 총알값은 거짓이 됨
}//////////////
}///////////
b++;
if(b3)
{
b=0;
}/////////////////////////////
if(game1TARGET[i].targetY22)
{
color(DARK_RED);
system(cls);
gotoxy(24,10);
printf(GAME_OVER);
gotoxy(20,11);
printf(타겟을 놓쳤습니다.);
Sleep(600);
exit(1);
/*if(kbhit())////////////////////////
{
Replay=getch();
if(Replay)
{
PORTAL;
}
}*///////////////////////////////////////
}
}
}
void Game_Over()
{
color(DARK_RED);
system(cls);
gotoxy(24,10);
printf(GAME OVER);
gotoxy(20,11);
printf(장애물에 부딪혔습니다.);
Sleep(600);
exit(1);
}
void CursorView(char show)
{
HANDLE hConsole;
CONSOLE_CURSOR_INFO ConsoleCursor;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
ConsoleCursor.bVisible = show;
ConsoleCursor.dwSize = 1;
SetConsoleCursorInfo(hConsole , &ConsoleCursor);
}