728x90
안녕하세요!
이번에는 C++로 폭탄 피하기 콘솔 게임을 만들어보겠습니다.
이 게임은 콘솔 창에서 폭탄맨을 조작하여 폭탄을 피하고 최대한 오래 살아남는 게임입니다.
게임 구현에 사용된 코드와 코드 해석을 자세하게 살펴보면서 즐거운 플레이와 함께 C++ 프로그래밍에 대해 배워보도록 합시다.
*콘솔 특성 상 텍스트를 지우고 쓰는 과정에서 깜빡임이 있고, 꾹 누르는 등의 연속적인 키입력이 불가합니다.
< 예제코드 >
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <vector>
const int WIDTH = 30;
const int HEIGHT = 20;
const char PLAYER_CHAR = '@';
const char BOMB_CHAR = 'O';
int playerX, playerY;
std::vector<std::pair<int, int>> bombs;
bool gameOver = false;
void setup()
{
playerX = WIDTH / 2;
playerY = HEIGHT - 1;
bombs.clear(); // 기존 폭탄들을 모두 제거
}
void draw()
{
system("cls");
for (int y = 0; y < HEIGHT; y++)
{
for (int x = 0; x < WIDTH; x++)
{
if (x == playerX && y == playerY)
std::cout << PLAYER_CHAR;
else
{
bool isBomb = false;
for (const auto& bomb : bombs)
{
if (x == bomb.first && y == bomb.second)
{
std::cout << BOMB_CHAR;
isBomb = true;
break;
}
}
if (!isBomb)
std::cout << " ";
}
}
std::cout << std::endl;
}
}
void input()
{
if (_kbhit())
{
char key = _getch();
switch (key)
{
case 'a':
if (playerX > 0)
playerX--;
break;
case 'd':
if (playerX < WIDTH - 1)
playerX++;
break;
case 'q':
gameOver = true;
break;
}
}
}
void update()
{
// 새로운 폭탄 추가
if (rand() % 10 == 0)
bombs.push_back({ rand() % WIDTH, 0 });
// 폭탄 이동
for (auto& bomb : bombs)
{
bomb.second++;
if (bomb.second == playerY && bomb.first == playerX)
gameOver = true;
if (bomb.second >= HEIGHT)
bomb.second = 0;
}
}
int main()
{
srand(static_cast<unsigned int>(time(0)));
setup();
while (!gameOver)
{
draw();
input();
update();
Sleep(50); // 적절한 속도 조절을 위한 잠시 멈춤
}
std::cout << "Game Over! Your score: " << bombs.size() << std::endl;
return 0;
}
< 코드해석 >
const int WIDTH = 30;
const int HEIGHT = 20;
const char PLAYER_CHAR = '@';
const char BOMB_CHAR = 'O';
int playerX, playerY;
std::vector<std::pair<int, int>> bombs;
bool gameOver = false;
- WIDTH / HEIGHT : 게임 화면의 가로와 세로 크기를 지정합니다.
- PLAYER_CHAT / BOMB_CHAR : 게임 화면에 플레이어와 폭탄을 나타내는 문자를 정의합니다.
- playerX / playerY : 플레이어의 위치를 저장하는 변수입니다.
- bombs : 폭탄들의 위치를 저장하는 벡터입니다. 벡터의 각 요소는 std::pair<int, int>로 이루어져 있으며, 첫 번째 요소는 폭탄의 가로 위치(x), 두 번째 요소는 폭탄의 세로 위치(y)를 나타냅니다.
- gameOver : 게임이 종료되었는지를 나타내는 변수입니다. 초기값은 false로 설정됩니다.
void setup()
{
playerX = WIDTH / 2;
playerY = HEIGHT - 1;
bombs.clear(); // 기존 폭탄들을 모두 제거
}
- 게임을 초기화하는 함수입니다. 플레이어의 초기 위치를 설정하고, 폭탄을 모두 제거합니다.
void draw()
{
system("cls");
for (int y = 0; y < HEIGHT; y++)
{
for (int x = 0; x < WIDTH; x++)
{
if (x == playerX && y == playerY)
std::cout << PLAYER_CHAR;
else
{
bool isBomb = false;
for (const auto& bomb : bombs)
{
if (x == bomb.first && y == bomb.second)
{
std::cout << BOMB_CHAR;
isBomb = true;
break;
}
}
if (!isBomb)
std::cout << " ";
}
}
std::cout << std::endl;
}
}
- 콘솔 창에 게임 화면을 그리는 함수입니다.
- 이중 for 루프를 사용하여 각 위치에 해당하는 문자를 출력합니다.
void input()
{
if (_kbhit())
{
char key = _getch();
switch (key)
{
case 'a':
if (playerX > 0)
playerX--;
break;
case 'd':
if (playerX < WIDTH - 1)
playerX++;
break;
case 'q':
gameOver = true;
break;
}
}
}
- 사용자의 입력을 받는 함수입니다.
- _kbhit() 함수를 사용하여 키보드 입력이 있는지 확인하고, _getch() 함수를 사용하여 입력된 키를 읽습니다.
- 입력된 키에 따라 플레이어의 위치를 변경하거나 게임을 종료합니다.
void update()
{
// 새로운 폭탄 추가
if (rand() % 10 == 0)
bombs.push_back({ rand() % WIDTH, 0 });
// 폭탄 이동
for (auto& bomb : bombs)
{
bomb.second++;
if (bomb.second == playerY && bomb.first == playerX)
gameOver = true;
if (bomb.second >= HEIGHT)
bomb.second = 0;
}
}
- 게임의 상태를 업데이트하는 함수입니다.
- 폭탄들의 이동과 충돌 검사를 수행합니다.
- 랜덤한 확률로 새로운 폭탄을 추가합니다.
int main()
{
srand(static_cast<unsigned int>(time(0)));
setup();
while (!gameOver)
{
draw();
input();
update();
Sleep(50); // 적절한 속도 조절을 위한 잠시 멈춤
}
std::cout << "Game Over! Your score: " << bombs.size() << std::endl;
return 0;
}
- 메인 함수입니다.
- srand() 함수를 사용하여 랜덤 시드를 설정하고, setup() 함수를 호출하여 게임을 초기화합니다.
- 게임 루프를 통해 draw(), input(), update() 함수를 반복하여 실행합니다.
- 게임이 종료되면 피한 폭탄의 개수를 출력합니다.
이렇게 C++로 구현한 폭탄 피하기 콘솔 게임은 간단한 콘솔 게임으로 구현하여 퀄리티는 조금 떨어질 수 있습니다.
게임에 대한 퀄리티는 낮지만, 코드를 자세히 분석하면서 C++의 기본 문법과 함수 사용 방법을 익힐 수 있을 것입니다.
감사합니다!
728x90
'[C++] > 콘솔 프로그래밍' 카테고리의 다른 글
[C++] 콘솔 프로그래밍 : switch case문 사용 (24) | 2023.06.17 |
---|---|
[C++] 콘솔 프로그래밍 : 소수점 반올림과 반내림 (20) | 2023.06.17 |
[C++] 콘솔 프로그래밍 : 생성자와 소멸자 (32) | 2023.06.15 |
[C++] 콘솔 프로그래밍 : 열거형(enum) 활용 (34) | 2023.06.12 |
[C++] 콘솔 프로그래밍 : 포인터 연산 (54) | 2023.06.11 |