본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 24: 프로젝트 - 간단한 콘솔 게임 만들기 (2)

by cogito21_cpp 2024. 8. 1.
반응형

이번 단계에서는 간단한 콘솔 게임 프로젝트를 완성하겠습니다. 어제는 미로 생성과 플레이어 이동을 구현했습니다. 오늘은 게임 루프를 추가하고 승리 조건을 구현하여 게임을 완성할 것입니다.

 

1. 게임 루프와 승리 조건 추가

게임이 종료될 때까지 반복적으로 상태를 업데이트하고 화면을 출력하는 게임 루프를 추가합니다. 플레이어가 출구에 도달하면 게임이 종료됩니다.

 

코드 업데이트

#include <iostream>
#include <vector>

using namespace std;

const int WIDTH = 10;
const int HEIGHT = 10;

vector<vector<char>> maze = {
    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
    {'#', 'P', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#'},
    {'#', ' ', '#', ' ', '#', ' ', '#', '#', ' ', '#'},
    {'#', ' ', '#', ' ', ' ', ' ', ' ', '#', ' ', '#'},
    {'#', '#', '#', '#', '#', '#', ' ', '#', ' ', '#'},
    {'#', ' ', ' ', ' ', ' ', '#', ' ', '#', ' ', '#'},
    {'#', ' ', '#', '#', ' ', '#', ' ', '#', ' ', '#'},
    {'#', ' ', '#', 'E', ' ', ' ', ' ', '#', ' ', '#'},
    {'#', ' ', '#', '#', '#', '#', ' ', '#', ' ', '#'},
    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};

int playerX = 1;
int playerY = 1;

void printMaze() {
    for (int i = 0; i < HEIGHT; ++i) {
        for (int j = 0; j < WIDTH; ++j) {
            cout << maze[i][j] << ' ';
        }
        cout << endl;
    }
}

void movePlayer(char direction) {
    int newX = playerX;
    int newY = playerY;

    switch (direction) {
        case 'W': newY--; break;
        case 'A': newX--; break;
        case 'S': newY++; break;
        case 'D': newX++; break;
        default: return;
    }

    if (maze[newY][newX] == ' ' || maze[newY][newX] == 'E') {
        maze[playerY][playerX] = ' ';
        playerX = newX;
        playerY = newY;
        maze[playerY][playerX] = 'P';
    }
}

int main() {
    char input;
    while (true) {
        system("clear");  // 터미널 화면을 지웁니다 (Windows에서는 system("cls")를 사용하세요)
        printMaze();
        cout << "Move (WASD): ";
        cin >> input;
        movePlayer(input);

        if (maze[playerY][playerX] == 'E') {
            cout << "Congratulations! You found the exit!" << endl;
            break;
        }
    }
    return 0;
}

 

2. 추가 기능

게임을 더욱 재미있게 만들기 위해 다음과 같은 추가 기능을 고려해볼 수 있습니다:

  • 타이머: 게임이 얼마나 오래 진행되었는지 시간을 측정합니다.
  • 적 추가: 플레이어를 방해하는 적 캐릭터를 추가합니다.
  • 점수 시스템: 플레이어가 미로를 얼마나 빠르게 탈출했는지 점수를 매깁니다.
  • 난이도 조절: 다양한 난이도의 미로를 제공합니다.

 

타이머 추가

게임이 시작된 시점부터 경과된 시간을 측정하는 타이머를 추가합니다.

#include <iostream>
#include <vector>
#include <ctime>  // 타이머를 위한 헤더 파일

using namespace std;

const int WIDTH = 10;
const int HEIGHT = 10;

vector<vector<char>> maze = {
    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
    {'#', 'P', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#'},
    {'#', ' ', '#', ' ', '#', ' ', '#', '#', ' ', '#'},
    {'#', ' ', '#', ' ', ' ', ' ', ' ', '#', ' ', '#'},
    {'#', '#', '#', '#', '#', '#', ' ', '#', ' ', '#'},
    {'#', ' ', ' ', ' ', ' ', '#', ' ', '#', ' ', '#'},
    {'#', ' ', '#', '#', ' ', '#', ' ', '#', ' ', '#'},
    {'#', ' ', '#', 'E', ' ', ' ', ' ', '#', ' ', '#'},
    {'#', ' ', '#', '#', '#', '#', ' ', '#', ' ', '#'},
    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};

int playerX = 1;
int playerY = 1;

void printMaze() {
    for (int i = 0; i < HEIGHT; ++i) {
        for (int j = 0; j < WIDTH; ++j) {
            cout << maze[i][j] << ' ';
        }
        cout << endl;
    }
}

void movePlayer(char direction) {
    int newX = playerX;
    int newY = playerY;

    switch (direction) {
        case 'W': newY--; break;
        case 'A': newX--; break;
        case 'S': newY++; break;
        case 'D': newX++; break;
        default: return;
    }

    if (maze[newY][newX] == ' ' || maze[newY][newX] == 'E') {
        maze[playerY][playerX] = ' ';
        playerX = newX;
        playerY = newY;
        maze[playerY][playerX] = 'P';
    }
}

int main() {
    char input;
    time_t startTime = time(nullptr);  // 시작 시간 기록

    while (true) {
        system("clear");  // 터미널 화면을 지웁니다 (Windows에서는 system("cls")를 사용하세요)
        printMaze();
        cout << "Move (WASD): ";
        cin >> input;
        movePlayer(input);

        if (maze[playerY][playerX] == 'E') {
            time_t endTime = time(nullptr);  // 종료 시간 기록
            double elapsed = difftime(endTime, startTime);  // 경과 시간 계산
            cout << "Congratulations! You found the exit!" << endl;
            cout << "Time taken: " << elapsed << " seconds" << endl;
            break;
        }
    }
    return 0;
}

 

프로젝트 완료

이제 간단한 콘솔 게임이 완성되었습니다. 플레이어는 'W', 'A', 'S', 'D' 키를 사용하여 미로를 탐험하고 출구에 도달하면 게임이 종료됩니다. 추가로 타이머 기능을 추가하여 플레이어가 미로를 얼마나 빨리 탈출했는지 확인할 수 있습니다.

 

다음 단계

24일차의 목표는 간단한 콘솔 게임 프로젝트를 완성하는 것이었습니다. 다음 날부터는 스마트 포인터에 대해 다룰 것입니다.

 

내일은 "스마트 포인터 (unique_ptr, shared_ptr)"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형