아래는 제공된 코드와 주석을 꼼꼼하게 분석한 결과입니다. 코드가 어떻게 작동하는지와 왜 그렇게 작성되었는지를 한 줄 한 줄 세세히 설명하겠습니다.
#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 로직이 적용됩니다. 대각선, 가로, 세로 줄을 확인하여 별(*)의 개수를 계산하고 빙고 줄 수를 갱신합니다.
이 모든 과정을 반복하며 게임이 종료될 때까지 진행합니다.