야구 게임

Jaemyeong Lee·2024년 10월 29일
0

어소트락2017

목록 보기
14/20

아래 코드와 주석을 한 줄 한 줄 분석하여 자세히 설명해드리겠습니다.


코드 분석 및 설명

  1. 랜덤 시드 초기화:

    srand((unsigned int)time(0));
    • 설명: srand 함수를 통해 난수 생성기의 시드를 현재 시간(time(0))을 기준으로 설정합니다. 이렇게 하면 프로그램을 실행할 때마다 다른 난수 시퀀스를 생성하게 됩니다.
  2. 배열 선언 및 초기화:

    int iNumber[9] = {};
    • 설명: iNumber는 크기가 9인 int 배열로, 1부터 9까지의 숫자를 저장할 공간입니다. {}로 초기화하여 배열의 모든 요소를 0으로 설정합니다.
  3. 1부터 9까지 숫자 배열 채우기:

    for (int i = 0; i < 9; i++)
    {
        iNumber[i] = i + 1;
    }
    • 설명: for 문을 사용해 배열 iNumber에 1부터 9까지의 숫자를 순서대로 넣습니다. iNumber[0]에는 1, iNumber[1]에는 2, ... , iNumber[8]에는 9가 들어갑니다.
  4. 배열 셔플 (Shuffle):

    int iTemp, idx1, idx2;
    for (int i = 0; i < 100; i++)
    {
        idx1 = rand() % 9;
        idx2 = rand() % 9;
    
        iTemp = iNumber[idx1];
        iNumber[idx1] = iNumber[idx2];
        iNumber[idx2] = iTemp;
    }
    • 설명: for 문을 100번 반복하며 배열을 무작위로 섞습니다.
      • idx1idx2는 0에서 8까지의 난수를 생성하여 배열 내 임의의 두 요소를 선택합니다.
      • iTempiNumber[idx1] 값을 임시 저장하여 iNumber[idx1]iNumber[idx2]를 서로 교환합니다.
      • 이렇게 100번 반복하여 배열을 잘 섞습니다.
  5. 숫자 숨김 출력:

    cout << "*\t*\t*" << endl;
    • 설명: 맞춰야 할 세 개의 숫자를 *로 표시해 사용자가 알 수 없도록 합니다.
  6. Strike와 Ball 변수 초기화:

    int iStrike = 0, iBall = 0;
    • 설명: iStrikeiBall은 각각 스트라이크와 볼의 개수를 저장하는 변수입니다. 매 회마다 사용자가 입력한 숫자에 따라 이 변수들을 업데이트합니다.
  7. 사용자 입력을 저장할 배열 선언:

    int iInput[3];
    • 설명: iInput 배열은 사용자가 입력한 세 개의 숫자를 저장하는 배열입니다.
  8. 게임 카운트 변수 선언:

    int iGameCount = 1;
    • 설명: iGameCount는 게임 진행 횟수를 카운트합니다. 이 변수는 각 회차가 끝날 때마다 1씩 증가합니다.
  9. 메인 게임 루프 (반복문):

    while (true)
    {
        cout << iGameCount << " 회" << endl;
        cout << "1 ~ 9 사이의 숫자중 3개를 입력하세요(0 : 종료) : ";
        cin >> iInput[0] >> iInput[1] >> iInput[2];
    • 설명: while 루프를 통해 사용자가 숫자를 맞출 때까지 반복합니다.
      • 매 회차마다 현재 회차를 출력하고, 사용자에게 1부터 9 사이의 숫자 3개를 입력받습니다.
      • cin을 사용해 사용자가 입력한 세 개의 숫자를 iInput[0], iInput[1], iInput[2]에 저장합니다.
  10. 종료 조건 확인:

    if (iInput[0] == 0 || iInput[1] == 0 || iInput[2] == 0)
    {
        break;
    }
    • 설명: 사용자가 입력한 숫자 중 하나라도 0이면 게임을 종료합니다.
  11. 유효성 검사 - 숫자 범위:

    else if (iInput[0] < 0 || iInput[0] > 9 || iInput[1] < 0 || iInput[1] > 9 || iInput[2] < 0 || iInput[2] > 9)
    {
        cout << "잘못된 숫자를 입력하였습니다." << endl;
        continue;
    }
    • 설명: 입력한 숫자가 1부터 9 사이에 있는지 확인합니다. 범위를 벗어난 숫자가 있으면 경고 메시지를 출력하고 다시 입력을 받습니다.
  12. 유효성 검사 - 중복 숫자 확인:

    else if (iInput[0] == iInput[1] || iInput[0] == iInput[2] || iInput[1] == iInput[2])
    {
        cout << "중복된 숫자를 입력하였습니다." << endl;
        continue;
    }
    • 설명: 사용자가 입력한 세 숫자가 서로 다른지 확인합니다. 중복된 숫자가 있으면 경고 메시지를 출력하고 다시 입력을 받습니다.
  13. Strike와 Ball 계산 초기화:

    iStrike = iBall = 0;
    • 설명: 매 회차마다 iStrikeiBall을 0으로 초기화하여 새롭게 계산합니다.
  14. Strike와 Ball 계산:

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (iNumber[i] == iInput[j])
            {
                if (i == j)
                {
                    ++iStrike;
                }
                else
                {
                    ++iBall;
                }
                break;
            }
        }
    }
    • 설명: 이중 for 문을 사용하여 스트라이크와 볼의 개수를 계산합니다.
      • iNumber[i] == iInput[j]: iNumber 배열의 값과 iInput 배열의 값이 같은지 확인합니다.
      • 만약 i == j인 경우, 숫자와 위치가 모두 일치하는 것이므로 스트라이크(iStrike)를 증가시킵니다.
      • 숫자는 같지만 위치가 다르면 볼(iBall)을 증가시킵니다.
      • break 문으로 현재 숫자 비교가 끝나면 내부 for 문을 빠져나가고, 다음 숫자로 비교를 계속합니다.
  15. 결과 출력 및 정답 확인:

    if (iStrike == 3)
    {
        cout << "숫자를 모두 맞췄습니다." << endl;
        break;
    }
    else if (iStrike == 0 && iBall == 0)
    {
        cout << "Out" << endl;
    }
    else
    {
        cout << iStrike << " Strike " << iBall << " Ball " << endl;
    }
    • 설명:
      • iStrike == 3이면 모든 숫자와 위치가 맞았다는 뜻으로 게임을 종료합니다.
      • iStrike == 0 && iBall == 0이면 사용자의 입력과 정답 숫자 사이에 공통된 숫자가 없으므로 Out을 출력합니다.
      • 그렇지 않으면 스트라이크와 볼의 개수를 출력합니다.
  16. 게임 횟수 증가:

    ++iGameCount;
    • 설명: 각 회차가 끝날 때마다 iGameCount를 1씩 증가시킵니다.
  17. 종료:

    return 0;
    • 설명: 프로그램이 성공적으로 종료됩니다.

코드 요약

이 코드는 1부터 9 사이의 서로 다른 3개의 숫자를 무작위로 생성하고, 사용자가 이를 맞출 때까지 계속 입력을 받습니다. 숫자와 위치가 모두 맞으면 Strike, 숫자는 맞지만 위치가 다르면 Ball로 표시하여 사용자에게 힌트를 줍니다.

profile
李家네_공부방

0개의 댓글