본문 바로가기

Programming

[C++] Shooting Game

//슈팅게임입니다.  키보드 좌우로 움직이고 스페이스로 총알 발사. 설명은 다음에 귀찮귀찮

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>

#include <windows.h>

#include "include.h"

#include <math.h>


#define random(num) (rand()%(num))

#define ESC 27

#define MAXENEMY 10

#define MAXBALL 20

#define TRUE 1

#define FALSE 0

#define SPACE 32





char *arEnemy[]={" ;;^:; ", " zZWZz "," oO@Oo "," <-=-> "}; //적 비행기 //좌우에 빈칸을 채움으로서 움직일때 글자가 남지 않게 함. 




tag_Enemy Enemy[MAXENEMY];

tag_Ball Ball[MAXBALL];


int fx; //본인 좌표

int bx,by;

int Score;




void main()

{

int ch;

int i,j;

bool bFound;

int count;


srand((unsigned)time(0));


system("cls");

setcursortype(NOCURSOR);

fx=40;

bx=-1;

Score=0;


//키보드 상태

for(count=0;;count++)

{

if(count%5==0)

{

if(IsKeyDown(VK_LEFT))

{

if(fx>6)fx--;

}


if(IsKeyDown(VK_RIGHT))

{

if(fx<72)fx++;

}

}


if(_kbhit())

{

ch=_getch();

if(ch==0xe0 || ch==0)

{

_getch();

}

else

{

switch(ch)

{

case SPACE:

if(bx==-1)

{

bx=fx;

by=23;

}

break;

case ESC:

goto end;

}

}

}

/*****************************************적 생성**********************************************/

if(random(100)==0)

{

for(i=0;i<MAXENEMY && Enemy[i].exist==true ; i++){;}


if(i!=MAXENEMY)

{

Enemy[i].x=5;

Enemy[i].Delta=1;

}

else

{

Enemy[i].x=75;

Enemy[i].Delta=-1;

}

for(;;)

{

Enemy[i].y=random(10)+1;

for(bFound=false,j=0;j<MAXENEMY;j++)

{

if(Enemy[j].exist==true && Enemy[j].y==Enemy[i].y)

{

bFound=true;

break;

}

}


if(bFound==false)

{

break;

}

}


Enemy[i].nFrame=Enemy[i].nStay=random(6)+1;

Enemy[i].Type=random(sizeof(arEnemy)/sizeof(arEnemy[0]));

Enemy[i].exist=true;

}


/*****************************************적 생성**********************************************/


//발사

if(bx!=-1)

{

gotoxy(bx,by);_putch(' ');

if(by==0)

{

bx=-1;

}

else{

by--;

gotoxy(bx,by);_putch('i');

}

}

for(i=0;i<MAXENEMY;i++)

{

if(Enemy[i].exist==false) continue;

if(Enemy[i].y==by && abs(Enemy[i].x-bx) <=2)

{

gotoxy(bx-4,by); printf("         ");

bx=-1;

Enemy[i].exist=false;

gotoxy(Enemy[i].x-3,Enemy[i].y);

puts(" ");

Score+=7-Enemy[i].nFrame;

break;

}

}


for (i=0;i<MAXBALL;i++) 

{

if (Ball[i].exist==FALSE) continue;

if (--Ball[i].nStay == 0)

{

Ball[i].nStay=Ball[i].nFrame;

gotoxy(Ball[i].x,Ball[i].y);_putch(' ');

if (Ball[i].y >= 23) 

{

Ball[i].exist=FALSE;

} else {

Ball[i].y++;

gotoxy(Ball[i].x,Ball[i].y);_putch('*');

}

}

}


// 적군 총알과 아군의 충돌 판정

for (i=0;i<MAXBALL;i++)

{

if (Ball[i].exist==FALSE) continue;

if (Ball[i].y==23 && abs(Ball[i].x-fx) <= 2)

{

gotoxy(fx-3,21);puts("   .   ");

gotoxy(fx-3,22);puts(" .  . .");

gotoxy(fx-3,23);puts("..:V:..");

//delay(2000);

Sleep(2000);

goto end;

}

}


// 적군 이동 및 출력

for (i=0;i<MAXENEMY;i++)

{

if (Enemy[i].exist==false) continue;

if (--Enemy[i].nStay == 0) 

{

Enemy[i].nStay=Enemy[i].nFrame;

if (Enemy[i].x >= 76 || Enemy[i].x <= 4)

{

Enemy[i].exist=FALSE;

gotoxy(Enemy[i].x-3,Enemy[i].y);

puts("       ");

}

else 

{

Enemy[i].x += Enemy[i].Delta;

gotoxy(Enemy[i].x-3,Enemy[i].y);

puts(arEnemy[Enemy[i].Type]);


// 총알 발사

if (random(40)==0)

{

for (j=0;j<MAXBALL && Ball[j].exist==TRUE;j++) {;}

if (j != MAXBALL) {

Ball[j].x=Enemy[i].x+2;



Ball[j].y=Enemy[i].y+1;

Ball[j].nFrame=Ball[j].nStay=Enemy[i].nFrame*6;

Ball[j].exist=TRUE;

}

}

}


}

}


// 파이터 및 점수 출력

gotoxy(fx-3,23);

puts(" <<A>> ");

gotoxy(0,24);

printf("점수=%d",Score);


// 초당 100 프레임

//delay(10);

Sleep(10);

}

end:

setcursortype(NORMALCURSOR);

}

/**********************************************include.h************************************************/

#include <stdio.h>

#include <windows.h>

typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;


void setcursortype(CURSOR_TYPE c)

{

 CONSOLE_CURSOR_INFO CurInfo;

 switch (c) {

 case NOCURSOR:

  CurInfo.dwSize=1;

  CurInfo.bVisible=FALSE;

  break;

 case SOLIDCURSOR:

  CurInfo.dwSize=100;

  CurInfo.bVisible=TRUE;

  break;

 case NORMALCURSOR:

  CurInfo.dwSize=20;

  CurInfo.bVisible=TRUE;

  break;

 }

 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&CurInfo);

}


void gotoxy(int x, int y)

{

    COORD pos = {x, y};

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}


bool IsKeyDown(int Key)

{

return ((GetAsyncKeyState(Key)&0x8000)!=0);

}



struct tag_Enemy

{

bool exist; //존재 유무

int Type; //비행기 타입

int x,y;

int Delta;

int nFrame;

int nStay;

};



struct tag_Ball

{

bool exist; //존재 유무

int x,y;

int nFrame;

int nStay;

};


'Programming' 카테고리의 다른 글

[perl] webhacking 4번 http get request  (3) 2012.12.10
[C++] 스택사이즈 변경(stack size)  (0) 2012.11.06
[C++] 리눅스 gotoxy();  (0) 2012.05.29
[C++] 리눅스 gotoxy, move  (0) 2012.05.29
[C++] Matrix(1)  (1) 2012.05.28