//슈팅게임입니다. 키보드 좌우로 움직이고 스페이스로 총알 발사. 설명은 다음에 귀찮귀찮
#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 |