아래는 제공된 코드와 주석을 꼼꼼하게 분석한 결과입니다. 코드가 어떻게 작동하는지와 왜 그렇게 작성되었는지를 한 줄 한 줄 세세히 설명하겠습니다.
#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,
};
AI_MODE
열거형:
AM_EASY
는 쉬운 난이도, AM_HARD
는 어려운 난이도로 설정.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)))
: 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;
}
iNumber
와 iAINumber
를 무작위로 섞음.rand() % 25
: 0~24 사이의 난수를 생성하여 배열의 인덱스로 사용.iTemp
를 이용해 idx1
과 idx2
위치의 값을 교환. 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;
}
}
변수 초기화:
iBingo
: 플레이어의 빙고 줄 수.iAIBingo
: AI의 빙고 줄 수.iAIMode
: AI의 난이도를 저장.난이도 선택 루프:
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;
}
system("cls")
:
플레이어 빙고판 출력:
iNumber
배열을 5x5 형태로 출력.INT_MAX
값은 *
로 표시하여 선택된 숫자임을 나타냄.AI 빙고판 출력:
iAINumber
배열을 5x5 형태로 출력.AM_EASY
또는 AM_HARD
)를 표시. cout << "AIBingo Line : " << iAIBingo << endl;
if (iBingo >= 5)
{
cout << "Player 승리" << endl;
break;
}
else if (iAIBingo >= 5 )
{
cout << "AI 승리" << endl;
break;
}
cout << "숫자를 입력하세요 (0 : 종료) : ";
int iInput;
cin >> iInput;
if (iInput == 0)
{
break;
}
else if (iInput < 1 || iInput > 25)
{
continue;
}
숫자 입력 받기:
0
입력 시 게임 종료.입력값 유효성 검사:
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;
}
중복 검사:
선택된 숫자 처리:
INT_MAX
로 표시.이후에는 AI의 숫자 선택 및 빙고 계산이 진행됩니다. 이는 위에서 설명한 대로 AI의 난이도에 따라 Easy 또는
Hard 로직이 적용됩니다. 대각선, 가로, 세로 줄을 확인하여 별(*
)의 개수를 계산하고 빙고 줄 수를 갱신합니다.
이 모든 과정을 반복하며 게임이 종료될 때까지 진행합니다.