숫자 퍼즐 게임

Jaemyeong Lee·2024년 10월 29일
0

어소트락2017

목록 보기
15/20

숫자 퍼즐 게임 코드와 주석을 한 줄씩 자세히 설명해드리겠습니다.


코드 분석 및 설명

  1. 헤더 파일 포함:

    #include <conio.h>
    using namespace std;
    • 설명: <conio.h>는 콘솔에서 입력과 출력 기능을 제공하는 헤더 파일입니다. 여기서 _getch()와 같은 함수를 사용하기 위해 포함했습니다.
  2. 랜덤 시드 초기화:

    srand((unsigned int)time(0));
    • 설명: srand 함수를 통해 난수 생성기를 초기화합니다. time(0)을 이용해 현재 시간을 시드로 설정하여 실행 시마다 다른 난수가 생성되도록 합니다.
  3. 숫자 배열 선언 및 초기화:

    int iNumber[25] = {};
    • 설명: 크기가 25인 int 배열 iNumber를 선언하고, 모든 값을 0으로 초기화합니다. 이 배열은 5x5 퍼즐의 숫자 상태를 저장하는 데 사용됩니다.
  4. 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가 저장됩니다.
  5. 공백 칸 설정:

    iNumber[24] = INT_MAX;
    • 설명: iNumber[24]INT_MAX를 저장해 마지막 칸을 공백으로 지정합니다. INT_MAXint로 표현할 수 있는 최대값으로, 여기서는 공백을 의미하는 특수 값으로 사용됩니다.
  6. 공백 위치 변수 선언:

    int iStarIndex = 24;
    • 설명: iStarIndex 변수는 공백의 위치를 저장합니다. 처음에는 24로 설정해 마지막 칸이 공백임을 나타냅니다.
  7. 숫자 배열 섞기 (셔플):

    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번 섞어줍니다.
      • idx1idx2는 0부터 23 사이의 무작위 인덱스를 생성합니다.
      • iTemp를 사용해 iNumber[idx1]iNumber[idx2]를 교환합니다.
      • 이 과정을 반복해 배열 내 숫자를 무작위로 배치합니다.
  8. 퍼즐 출력 루프:

    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*로 출력합니다. 그렇지 않으면 해당 숫자를 출력합니다.
  9. 퍼즐 완성 체크:

    bool bWin = true;
    for (int i = 0; i < 24; i++)
    {
        if (iNumber[i] != i + 1)
        {
            bWin = false;
            break;
        }
    }
    if (bWin == true)
    {
        cout << "숫자를 모두 맞췄습니다." << endl;
        break;
    }
    • 설명: 배열에 저장된 숫자가 1부터 24까지 순서대로 맞춰졌는지 확인합니다.
      • bWintrue로 가정하고, iNumber[i]i + 1과 일치하지 않으면 bWinfalse로 설정한 뒤 for문을 빠져나옵니다.
      • 배열이 올바른 순서라면 "숫자를 모두 맞췄습니다"를 출력하고 게임을 종료합니다.
  10. 사용자 입력 및 이동 명령:

    cout << "w : 위 s : 아래 a : 왼쪽 d : 오른쪽 q : 종료 : ";
    char cInput = _getch();
    if (cInput == 'q' || cInput == 'Q')
    {
        break;
    }
    • 설명: 사용자에게 이동 명령(w, s, a, d)을 입력받아 동작을 수행합니다. _getch()Enter 없이 입력 즉시 문자를 반환합니다.
    • cInputq 또는 Q면 게임을 종료합니다.
  11. 별 위치 이동 처리:

    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의 값을 업데이트하여 별 위치를 새로 설정합니다.
  12. 게임 종료 메시지:

    cout << endl;
    cout << "게임을 종료합니다" << endl;

코드 요약

이 프로그램은 5x5 숫자 퍼즐로, w, s, a, d 키로 공백 위치를 이동하여 숫자 순서를 맞추는 게임입니다. INT_MAX를 공백으로 설정하고, 사용자가 모든 숫자를 올바르게 배열하면 "숫자를 모두 맞췄습니다" 메시지를 출력하고 종료됩니다.

profile
李家네_공부방

0개의 댓글