//DOS 모드에서 슈팅게임을 만들수 있다.
//스페이스바: 총알, 방향키 :이동
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define PLAYER_BULLET_MAX 20 //총알의 최대 개수를 20개로 정의한다.
typedef struct _bullet
{
int x;
int y;
bool fire;
} BULLET;
char bg[25][80]; //배경의 사이즈
int playerX;
int playerY;
int enemyX;
int enemyY;
BULLET playerBullet[PLAYER_BULLET_MAX]; //총알구조체 선언이다.
void PrintfScreen(void);
void ClearScreen(void);
void GameMain(void);
void KeyControl(void);
void BulletDraw(void);
void PlayerDraw(void);
void EnemyDraw(void);
void EnemyMove(void);
void ClashEenmyAndBullet(void);
void main(void)
{
playerX = 0;
playerY = 12;
enemyX = 77;
enemyY = 12;
for(int i=0; i<PLAYER_BULLET_MAX; i++) // 전체 총알 초기화
{
playerBullet[i].x = 0;
playerBullet[i].y = 0;
playerBullet[i].fire = false;
}
for(;;) //무한루프 구현
{
ClearScreen();
GameMain();
PrintfScreen();
}
}
void PrintfScreen(void)
{
bg[24][79] = 0; //DOS 화면의 마지막을 위해 마지막 문장을 0으로 세팅
printf("%s", bg);
}
void ClearScreen(void)
{
system("cls"); //이전 DOS화면 지우기
for(int y=0; y< 25; y++)
{
for(int x=0; x< 80; x++)
{
bg[y][x] = ' '; // 화면을 깨끗하게 빈칸으로 채움
}
}
}
void GameMain(void)
{
KeyControl();
BulletDraw();
PlayerDraw();
EnemyMove();
EnemyDraw();
ClashEenmyAndBullet();
}
void KeyControl(void)
{
char pressKey;
if(kbhit()) //아무키나 눌렸는지 확인
{
pressKey = getch(); // 여러개 눌려도 처음 한개만 키입력만 처리
switch(pressKey)
{
case 72: //위 방향키 아스키코드값
playerY--;
if(playerY < 1 )
playerY=1;
break;
case 75://좌 방향키 아스키코드값
playerX--;
if(playerX < 0 )
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<PLAYER_BULLET_MAX; i++)
{
if( playerBullet[i].fire == false)
{
playerBullet[i].fire = true;
playerBullet[i].x = playerX + 5; //총알 움직이는 간격, 숫자가 낮을수로 느려진다.
playerBullet[i].y = playerY;
break;
}
}
break;
}
}
}
void BulletDraw(void)
{
for(int i=0; i<PLAYER_BULLET_MAX; i++)
{
if( playerBullet[i].fire == true)
{
bg[playerBullet[i].y][playerBullet[i].x - 1]='-'; //총알 디자인
bg[playerBullet[i].y][playerBullet[i].x + 0]='>';
playerBullet[i].x++;
if(playerBullet[i].x > 79) // 총알이 범위 밖으로 나갔을때 처리
{
playerBullet[i].fire = false;
}
}
}
}
void PlayerDraw(void) //플레이어 비행선 디자인
{
bg[playerY - 1][playerX + 0]='-';
bg[playerY - 1][playerX + 1]='>';
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(void) //적기 디자인
{
bg[enemyY - 0][enemyX - 2]='<';
bg[enemyY + 0][enemyX - 1]='-';
bg[enemyY + 0][enemyX + 0]='0';
bg[enemyY + 0][enemyX + 1]='-';
bg[enemyY + 0][enemyX + 2]='>';
}
void EnemyMove(void) //적기의 움직임
{
enemyX--;
if(enemyX<2)
{
enemyX = 77;
enemyY = (rand()%20) + 2;
}
}
void ClashEenmyAndBullet(void) //적이 총알에 맞았는지 처리
{
for(int i=0; i<PLAYER_BULLET_MAX; i++)
{
if( playerBullet[i].fire == true)
{
if(playerBullet[i].y == enemyY )
{
if(( playerBullet[i].x >= (enemyX-1)) && ( playerBullet[i].x <= (enemyX+1)))
{
enemyX = 77;
enemyY = (rand()%20) + 2;
playerBullet[i].fire = false;
}
}
}
}
}