숫자 퍼즐 게임 코드와 주석을 한 줄씩 자세히 설명해드리겠습니다.
헤더 파일 포함:
#include <conio.h>
using namespace std;
<conio.h>
는 콘솔에서 입력과 출력 기능을 제공하는 헤더 파일입니다. 여기서 _getch()
와 같은 함수를 사용하기 위해 포함했습니다.랜덤 시드 초기화:
srand((unsigned int)time(0));
srand
함수를 통해 난수 생성기를 초기화합니다. time(0)
을 이용해 현재 시간을 시드로 설정하여 실행 시마다 다른 난수가 생성되도록 합니다.숫자 배열 선언 및 초기화:
int iNumber[25] = {};
int
배열 iNumber
를 선언하고, 모든 값을 0으로 초기화합니다. 이 배열은 5x5 퍼즐의 숫자 상태를 저장하는 데 사용됩니다.1부터 24까지 배열 채우기:
for (int i = 0; i < 24; i++)
{
iNumber[i] = i + 1;
}
for
문을 통해 iNumber
배열에 1부터 24까지 순서대로 숫자를 저장합니다. i = 0
일 때 iNumber[0]
에 1이 저장되고, i = 23
일 때 iNumber[23]
에 24가 저장됩니다.공백 칸 설정:
iNumber[24] = INT_MAX;
iNumber[24]
에 INT_MAX
를 저장해 마지막 칸을 공백으로 지정합니다. INT_MAX
는 int
로 표현할 수 있는 최대값으로, 여기서는 공백을 의미하는 특수 값으로 사용됩니다.공백 위치 변수 선언:
int iStarIndex = 24;
iStarIndex
변수는 공백의 위치를 저장합니다. 처음에는 24
로 설정해 마지막 칸이 공백임을 나타냅니다.숫자 배열 섞기 (셔플):
int iTemp, idx1, idx2;
for (int i = 0; i < 100; i++)
{
idx1 = rand() % 24;
idx2 = rand() % 24;
iTemp = iNumber[idx1];
iNumber[idx1] = iNumber[idx2];
iNumber[idx2] = iTemp;
}
for
문을 통해 배열을 100번 섞어줍니다.idx1
과 idx2
는 0부터 23 사이의 무작위 인덱스를 생성합니다.iTemp
를 사용해 iNumber[idx1]
과 iNumber[idx2]
를 교환합니다.퍼즐 출력 루프:
while (true)
{
system("cls");
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;
}
while
루프를 통해 사용자가 종료 명령을 내릴 때까지 게임을 반복합니다.system("cls");
로 콘솔 화면을 지우고 새로 출력합니다.for
문(i
)은 행을, 두 번째 for
문(j
)은 열을 의미합니다.i * 5 + j
를 통해 현재 배열에서 올바른 인덱스를 찾고, iNumber[i * 5 + j]
가 INT_MAX
면 *
로 출력합니다. 그렇지 않으면 해당 숫자를 출력합니다.퍼즐 완성 체크:
bool bWin = true;
for (int i = 0; i < 24; i++)
{
if (iNumber[i] != i + 1)
{
bWin = false;
break;
}
}
if (bWin == true)
{
cout << "숫자를 모두 맞췄습니다." << endl;
break;
}
bWin
을 true
로 가정하고, iNumber[i]
가 i + 1
과 일치하지 않으면 bWin
을 false
로 설정한 뒤 for
문을 빠져나옵니다.사용자 입력 및 이동 명령:
cout << "w : 위 s : 아래 a : 왼쪽 d : 오른쪽 q : 종료 : ";
char cInput = _getch();
if (cInput == 'q' || cInput == 'Q')
{
break;
}
w
, s
, a
, d
)을 입력받아 동작을 수행합니다. _getch()
는 Enter
없이 입력 즉시 문자를 반환합니다.cInput
이 q
또는 Q
면 게임을 종료합니다.별 위치 이동 처리:
switch (cInput)
{
case 'w':
case 'W':
if (iStarIndex > 4)
{
iNumber[iStarIndex] = iNumber[iStarIndex - 5];
iNumber[iStarIndex - 5] = INT_MAX;
iStarIndex -= 5;
}
break;
case 's':
case 'S':
if (iStarIndex < 20)
{
iNumber[iStarIndex] = iNumber[iStarIndex + 5];
iNumber[iStarIndex + 5] = INT_MAX;
iStarIndex += 5;
}
break;
case 'a':
case 'A':
if (iStarIndex % 5 != 0)
{
iNumber[iStarIndex] = iNumber[iStarIndex - 1];
iNumber[iStarIndex - 1] = INT_MAX;
iStarIndex -= 1;
}
break;
case 'd':
case 'D':
if ((iStarIndex % 5) != 4)
{
iNumber[iStarIndex] = iNumber[iStarIndex + 1];
iNumber[iStarIndex + 1] = INT_MAX;
iStarIndex += 1;
}
break;
default:
break;
}
switch
문을 통해 w
, s
, a
, d
명령에 따라 공백 위치를 이동시킵니다.iStarIndex
의 값을 업데이트하여 별 위치를 새로 설정합니다.게임 종료 메시지:
cout << endl;
cout << "게임을 종료합니다" << endl;
이 프로그램은 5x5 숫자 퍼즐로, w
, s
, a
, d
키로 공백 위치를 이동하여 숫자 순서를 맞추는 게임입니다. INT_MAX
를 공백으로 설정하고, 사용자가 모든 숫자를 올바르게 배열하면 "숫자를 모두 맞췄습니다" 메시지를 출력하고 종료됩니다.