게임 질문
비내리던날
타겟과 총알 구조체를 만들어서 두 개가 접근하면 터지는 형식으로 게임을 만드려고 합니다.
그리고 타겟과 장애물이 한꺼번에 내려오지 않고 하나씩 차례차례 내려올 수 있게 조언이나 도움 부탁드려요.
(※빨간색으로 표시한 부분을 위주로 보면 됩니다)
#include stdlib.h#include stdio.h#include conio.h#include windows.h#include time.h // 랜덤함수#include mmsystem.h // 사운드#pragma comment(lib,winmm.lib) // 사운드
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 8 ////////////////////// 게임 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(){ srand((unsigned)time(NULL));//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; sndPlaySound(TEXT(Gunfire.wav), SND_ASYNC|SND_NODEFAULT); 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; R = (rand() % 11); game1enemy[i].game1eX=R;
game1enemy[i].game1eX= R * 3 + 2; // R값이 들어오면 적절한 좌표를 맞춰줌
game1enemy[i].game1eY=1; game1enemy[i].start=true; } if(game1enemy[i].game1eY22) // 장애물의 좌표가 화면을 벗어나면 { 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; Rt = (rand() % 10 + 1 ); game1TARGET[i].targetX=Rt;
game1TARGET[i].targetX= Rt * 3 + 2; ////////////////
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; // 변수 선언 R = (rand() % 7); // 랜덤숫자를 이용해서 game2enemy[i].game2eY=R * 3 + 2; // 좌표 설정
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) { sndPlaySound(TEXT(Crash.wav), SND_ASYNC|SND_NODEFAULT); color(BLUE); gotoxy(player1X,player1Y); printf(●); game1TARGET[i].start=false; } } int b=0; if(b==MAX_bullet) // 최대 총알수 3과 같아지면 { b=0; // b는 0이 됨. } if(game1TARGET[i].targetY==bullet[b].bulletY) // i번째 타겟과 0번째 총알Y 좌표가 같다면 { if(game1TARGET[i].targetX==bullet[b].bulletX) /span // i번째 타겟과 0번째 총알의 X좌표도 같다면 { sndPlaySound(TEXT(bang.wav), SND_ASYNC|SND_NODEFAULT); game1TARGET[i].start=false; gotoxy(bullet[b].bulletX,bullet[b].bulletY); printf( ); bullet[b].fire=false; // 총알이 타겟에 맞으면 총알값은 거짓이 됨 } ////else////////////////// } else // i번째 타겟과 0번째 총알Y 좌표가 다르면 { b++; // b값이 오름 if(game1TARGET[i].targetY==bullet[b].bulletY) // i번째 타겟과 1번째 총알 Y 좌표가 같다면 { if(game1TARGET[i].targetX==bullet[b].bulletX) // i번째 타겟과 1번째 총알의 X좌표도 같다면 { sndPlaySound(TEXT(bang.wav), SND_ASYNC|SND_NODEFAULT); game1TARGET[i].start=false; gotoxy(bullet[b].bulletX,bullet[b].bulletY); printf( ); bullet[b].fire=false; // 총알이 타겟에 맞으면 총알값은 거짓이 됨 } } else // i번째 타겟과 1번째 총알 Y좌표가 다르면 { b++; // b값이 오름 if(game1TARGET[i].targetY==bullet[b].bulletY) // i번째 타겟과 2번째 총알 Y 좌표가 같다면 { if(game1TARGET[i].targetX==bullet[b].bulletX) // i번째 타겟과 1번째 총알의 X좌표도 같다면 { sndPlaySound(TEXT(bang.wav), SND_ASYNC|SND_NODEFAULT); game1TARGET[i].start=false; gotoxy(bullet[b].bulletX,bullet[b].bulletY); printf( ); bullet[b].fire=false; // 총알이 타겟에 맞으면 총알값은 거짓이 됨 } } } }// }
if(game1TARGET[i].targetY22) { sndPlaySound(TEXT(GAMEOVER.wav), SND_ASYNC|SND_NODEFAULT); color(DARK_RED); system(cls); gotoxy(24,10); printf(GAME_OVER); gotoxy(20,11); printf(타겟을 놓쳤습니다.);// exit(1);/* if(kbhit()) //////////////////////// { Replay=getplay=getch(); if(Replay) { PORTAL; } } */ ////////////////////////////////////// } }}
void Game_Over(){ sndPlaySound(TEXT(GAMEOVER.wav), SND_ASYNC|SND_NODEFAULT); color(DARK_RED); system(cls); gotoxy(24,10); printf(GAME OVER); gotoxy(20,11); printf(장애물에 부딪혔습니다.); 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);}
-
꽃내음
...
-
푸르니
..
-
흰여울
.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |
2691618 | 링크드리스트 개념 질문이예요 (3) | 맨마루 | 2025-04-15 |