빙고게임

Jaemyeong Lee·2024년 11월 19일
0

어소트락2017

목록 보기
16/20

아래는 제공된 코드와 주석을 꼼꼼하게 분석한 결과입니다. 코드가 어떻게 작동하는지와 왜 그렇게 작성되었는지를 한 줄 한 줄 세세히 설명하겠습니다.


코드 및 주석 분석


#include 및 기본 설정

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
  • #include <iostream>: 입출력을 위해 사용합니다. cout, cin 같은 표준 입출력 기능을 제공.
  • #include <cstdlib>: rand(), srand() 같은 함수 사용을 위한 헤더.
  • #include <ctime>: time() 함수 사용을 위한 헤더. 난수 생성을 위해 현재 시간을 기준으로 난수 시드(seed)를 설정.
  • using namespace std: std:: 네임스페이스를 생략하고 cin, cout 등을 사용할 수 있게 함.

enum 정의

enum AI_MODE
{
    AM_EASY = 1,
    AM_HARD
};

enum LINE_NUMBER
{
    LN_H1,
    LN_H2,
    LN_H3,
    LN_H4,
    LN_H5,
    LN_V1,
    LN_V2,
    LN_V3,
    LN_V4,
    LN_V5,
    LN_LT,
    LN_RT,
};
  1. AI_MODE 열거형:

    • AI의 난이도 설정.
    • AM_EASY는 쉬운 난이도, AM_HARD는 어려운 난이도로 설정.
  2. LINE_NUMBER 열거형:

    • 각 줄(가로, 세로, 대각선)을 의미.
    • LN_H1~LN_H5: 가로줄.
    • LN_V1~LN_V5: 세로줄.
    • LN_LT: 왼쪽 위에서 오른쪽 아래 대각선.
    • LN_RT: 오른쪽 위에서 왼쪽 아래 대각선.

메인 함수 시작

int main()
{
    srand((unsigned int)(time(nullptr)));
  • srand((unsigned int)(time(nullptr))):
    • 난수 생성을 위한 초기화. 현재 시간을 기준으로 난수 시드 설정.
    • 시드를 설정하지 않으면 프로그램 실행마다 동일한 난수가 생성됨.

플레이어와 AI의 숫자 배열 초기화

    int iNumber[25] = {};
    int iAINumber[25] = {};

    for (int i = 0; i < 25; i++)
    {
        iNumber[i] = i + 1;
        iAINumber[i] = i + 1;
    }
  • iNumber[25]: 플레이어의 빙고 숫자 저장 배열.
  • iAINumber[25]: AI의 빙고 숫자 저장 배열.
  • for 루프:
    • 1부터 25까지의 숫자를 배열에 순서대로 저장.

숫자 섞기

    int iTemp, idx1, idx2;
    for (int i = 0; i < 100; i++)
    {
        idx1 = rand() % 25;
        idx2 = rand() % 25;

        iTemp = iNumber[idx1];
        iNumber[idx1] = iNumber[idx2];
        iNumber[idx2] = iTemp;

        idx1 = rand() % 25;
        idx2 = rand() % 25;

        iTemp = iAINumber[idx1];
        iAINumber[idx1] = iAINumber[idx2];
        iAINumber[idx2] = iTemp;
    }
  • 난수를 이용해 iNumberiAINumber를 무작위로 섞음.
  • rand() % 25: 0~24 사이의 난수를 생성하여 배열의 인덱스로 사용.
  • iTemp를 이용해 idx1idx2 위치의 값을 교환.

AI 난이도 선택

    int iBingo = 0, iAIBingo = 0;
    int iAIMode;

    while (true)
    {
        system("cls");
        cout << "1. Easy" << endl;
        cout << "2. Hard" << endl;
        cout << "AI 모드를 선택하세요 : ";
        
        cin >> iAIMode;
        if (iAIMode >= AM_EASY && iAIMode <= AM_HARD)
        {
            break;
        }
    }
  1. 변수 초기화:

    • iBingo: 플레이어의 빙고 줄 수.
    • iAIBingo: AI의 빙고 줄 수.
    • iAIMode: AI의 난이도를 저장.
  2. 난이도 선택 루프:

    • 1(쉬움) 또는 2(어려움) 입력 시 루프 탈출.
    • 잘못된 입력 시 다시 입력받음.

선택되지 않은 숫자 관리 배열

    int iNoneSelect[25] = {};
    int iNoneSelectCount = 0;
  • iNoneSelect: 선택되지 않은 숫자 목록을 저장할 배열.
  • iNoneSelectCount: 선택되지 않은 숫자의 개수를 저장하는 변수.

메인 게임 루프

    while (true)
    {
        system("cls");

        // 숫자를 5*5로 출력한다.
        cout << "=========== Player ===========" << endl;
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                if (iNumber[i * 5 + j] == INT_MAX)
                {
                    cout << "*\t";
                }
                else
                {
                    cout << iNumber[i * 5 + j] << "\t";
                }
            }
            cout << endl;
        }

        cout << "Bingo Line : " << iBingo << endl << endl;

        // AI 빙고 판을 출력한다.
        cout << "=========== AI ===========" << endl;

        switch (iAIMode)
        {
        case AM_EASY:
            cout << "AIMode : Easy" << endl;
            break;
        case AM_HARD:
            cout << "AIMode : Hard" << endl;
            break;
        }
  1. system("cls"):

    • 화면을 지움. 게임 진행 상황을 최신 상태로 표시.
  2. 플레이어 빙고판 출력:

    • iNumber 배열을 5x5 형태로 출력.
    • INT_MAX 값은 *로 표시하여 선택된 숫자임을 나타냄.
  3. AI 빙고판 출력:

    • iAINumber 배열을 5x5 형태로 출력.
    • AI 난이도(AM_EASY 또는 AM_HARD)를 표시.

게임 종료 조건

        cout << "AIBingo Line : " << iAIBingo << endl;

        if (iBingo >= 5)
        {
            cout << "Player 승리" << endl;
            break;
        }
        else if (iAIBingo >= 5 )
        {
            cout << "AI 승리" << endl;
            break;
        }
  • 플레이어와 AI 모두 빙고 줄이 5 이상인지 확인.
  • 플레이어가 5줄 이상일 경우 "Player 승리".
  • AI가 5줄 이상일 경우 "AI 승리".
  • 조건 만족 시 게임 종료.

숫자 입력

        cout << "숫자를 입력하세요 (0 : 종료) : ";
        int iInput;
        cin >> iInput;

        if (iInput == 0)
        {
            break;
        }
        else if (iInput < 1 || iInput > 25)
        {
            continue;
        }
  1. 숫자 입력 받기:

    • 플레이어가 선택할 숫자를 입력.
    • 0 입력 시 게임 종료.
  2. 입력값 유효성 검사:

    • 1~25 범위 외의 값은 무시하고 다시 입력받음.

중복 숫자 처리

        bool bAcc = true;

        for (int i = 0; i < 25; i++)
        {
            if (iInput == iNumber[i])
            {
                bAcc = false;
                iNumber[i] = INT_MAX;
                break;
            }
        }

        if (bAcc)
        {
            continue;
        }
  1. 중복 검사:

    • 입력한 숫자가 이미 선택된 숫자인지 확인.
    • 중복된 숫자라면 다시 입력받음.
  2. 선택된 숫자 처리:

    • 중복이 아니라면 INT_MAX로 표시.

AI 선택 및 빙고 계산

이후에는 AI의 숫자 선택 및 빙고 계산이 진행됩니다. 이는 위에서 설명한 대로 AI의 난이도에 따라 Easy 또는

Hard 로직이 적용됩니다. 대각선, 가로, 세로 줄을 확인하여 별(*)의 개수를 계산하고 빙고 줄 수를 갱신합니다.

이 모든 과정을 반복하며 게임이 종료될 때까지 진행합니다.

profile
李家네_공부방

0개의 댓글