[C++] 간단한 슈팅게임 만들기(DOS Ver.)

in c •  7 years ago 

//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;
}

        }
    }
}

}

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!