신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

Baseball Game (야구 게임)

규칙

사용자는 1부터 9까지 중 3개의 숫자를 뽑아 컴퓨터가 랜덤으로 뽑은 숫자와 비교한다. (중복되는 숫자는 없다.)

숫자의 자리와 숫자값이 모두 같으면 스트라이크!

자리는 다르지만 3개의 숫자 중 포함 되어 있으면 볼!

 

예를들어,

컴퓨터

2

3

6

1

2

3

자리는 안맞지만 2와 3이 포함되어 있으므로 0 strike, 2 ball

 

컴퓨터

2

3

6

2

1

4

2 숫자가 자리와 숫자가 모두 같으므로 1 strike, 0 ball

 

컴퓨터

2 

3

6

2 

6

3

1 strike, 2 ball

 

컴퓨터

2

3

6

나 

2

3

6

모두 같으므로 3 strike, 게임 끝!

 

 

 

 

단계별 코딩

1부터 9까지 배열을 이용해서 할당한다. (컴퓨터의 수)

// 1 ~ 9 까지의 수를 할당
for (int i = 0; i < 9; i++) {
    iNum[i] = i + 1;
}​

 

 

배열의 인덱스 값을 랜덤으로 뽑아서 스완하는 형식이므로, 중복된 값은 나오지 않는다.

이렇게 100번 정도 스왑과 셔플을 해서 완벽한 난수를 만든다.

// 100번 셔플
int iTemp, idx1, idx2;
srand((unsigned int)time(0));
for (int i = 0; i < 100; i++) {
    idx1 = rand() % 9;
    idx2 = rand() % 9;
    
    // 스왑
    iTemp = iNum[idx1];
    iNum[idx1] = iNum[idx2];
    iNum[idx2] = iTemp;
}​

 

 

스트라이크 횟수롸 볼 횟수를 기록할 변수 선언 및 초기화.

유저가 입력한 수를 저장할 변수 선언 및 초기화

몇번만에 게임을 끝내는지 기록할 카운트 변수 선언 및 초기화

int iStrike = 0, iBall = 0; 
int input[3] = {};
int count = 0;​

 

 

while 반복문을 통해 게임을 맞출때까지 반복한다.

그리고 1 ~ 9 이외의 다른 수를 넣으면 게임을 종료한다.

cout << "1 ~ 9 사이의 숫자 중 3개 입력 하시오 (그 밖의 숫자 입력시 종료)" << endl;
cin >> input[0] >> input[1] >> input[2]; // 입력 받는다.
 
// 0 누르면 종료
if (input[0] < 1 || input[0] > 9
    || input[1] < 1 || input[1] > 9
    || input[2] <1 || input[2] > 9) {
    break;
}​

 

반복문을 이용해서 컴퓨터의 숫자와 내가 입력한 숫자 3개를 비교한다.

자리와 숫자 값 모두 같으면 스트라이크 횟수(iStrike)를 증가시킨다.

자리는 다르지만 숫자값은 같으면 볼 횟수(iBall)를 증가 시킨다.

for (int i = 0; i < 3; i++) {
 
    for (int j = 0; j < 3; j++) {
 
        // iNum과 user가 입력한 값들이 같은지 확인
        if (iNum[i] == input[j]) {
            
            if (i == j) {
                // 자리수랑 숫자가 모두 같으므로 Strike!
                iStrike++;
            }
            else {
                // 자리수는 다르지만 값은 같으므로 ball!
                iBall++;
            }
        }// end if
 
    }// end j for
}// end i for​

 

3개의 숫자 비교를 끝내고 카운트를 증가시켜 게임을 몇번했는지 기록한다.

count++;​

 

스트라이크가 3이면 모두 맞춘 경우 이므로, (즉 게임이 끝난 경우)

while문을 나와서 프로그램을 종료한다.

 

그 의외의 경우는 아직 게임을 못끝냈으므로 반복문 계속해서 실행 한다.

if (iStrike == 3) {
    // 모두 맞췄으므로 빠져나온다.
    cout << count << "번 만에 맞췄습니다." << endl;
    break;
}
else {
    cout << "Strike : " << iStrike << "\tBall : " << iBall << endl;
    // 아직 못맞춤. 다시 게임 시작 및 초기화
    iStrike = 0;
    iBall = 0;
}
​

 

 

 

 

전체 코드

#include <iostream>
#include <time.h>
 
using namespace std;
 
int main() {
 
    cout << "야구 게임" << endl;
 
    int iNum[9] = {};
 
    // 1 ~ 9 까지의 수를 할당
    for (int i = 0; i < 9; i++) {
        iNum[i] = i + 1;
    }
 
    // 100번 셔플
    int iTemp, idx1, idx2;
    srand((unsigned int)time(0));
    for (int i = 0; i < 100; i++) {
        idx1 = rand() % 9;
        idx2 = rand() % 9;
        
        // 스왑
        iTemp = iNum[idx1];
        iNum[idx1] = iNum[idx2];
        iNum[idx2] = iTemp;
    }
 
    int iStrike = 0, iBall = 0; 
    int input[3] = {};
    int count = 0; // 몇번만에 정답을 맞추는지
 
    while (true) {
        cout << "1 ~ 9 사이의 숫자 중 3개 입력 하시오 (그 밖의 숫자 입력시 종료)" << endl;
        cin >> input[0] >> input[1] >> input[2]; // 입력 받는다.
 
        // 0 누르면 종료
        if (input[0] < 1 || input[0] > 9
            || input[1] < 1 || input[1] > 9
            || input[2] <1 || input[2] > 9) {
            break;
        }
        
        for (int i = 0; i < 3; i++) {
 
            for (int j = 0; j < 3; j++) {
 
                // iNum과 user가 입력한 값들이 같은지 확인
                if (iNum[i] == input[j]) {
                    
                    if (i == j) {
                        // 자리수랑 숫자가 모두 같으므로 Strike!
                        iStrike++;
                    }
                    else {
                        // 자리수는 다르지만 값은 같으므로 ball!
                        iBall++;
                    }
                }// end if
 
            }// end j for
        }// end i for
        
        count++;
 
        if (iStrike == 3) {
            // 모두 맞췄으므로 빠져나온다.
            cout << count << "번 만에 맞췄습니다." << endl;
            break;
        }
        else {
            cout << "Strike : " << iStrike << "\tBall : " << iBall << endl;
            // 아직 못맞춤. 다시 게임 시작 및 초기화
            iStrike = 0;
            iBall = 0;
        }
        
    }// end while
 
    return 0;
}
​

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기