본문 바로가기
C,C++/코드정리

[C/C++] 야구게임 구현

by 마두식 2022. 9. 7.
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <time.h>
 
int main() {
    int totalNum[9];
    int targetNum[3];
    srand((unsigned int)time(NULL));
    for (int i = 0; i < 9; i++) {
        totalNum[i] = i + 1;
    }
 
    int idx1, idx2, tmp;
    for (int i = 0; i < 100; i++) {
        idx1 = rand() % 9;
        idx2 = rand() % 9;
 
        tmp = totalNum[idx1];
        totalNum[idx1] = totalNum[idx2];
        totalNum[idx2] = tmp;
    }
 
    for (int i = 0; i < 3; i++) {
        targetNum[i] = totalNum[i];
    }
 
    std::cout << std::endl;
 
    std::cout << "TargetNum 설정이 완료되었습니다." << std::endl;
 
    int playerNum[3], strike, ball;
 
    while (1) {
        strike = 0, ball = 0;
 
        std::cout << std::endl << "*\t*\t*" << std::endl << std::endl;
        std::cout << "1~9 사이의 숫자 3개를 입력하세요(0 : 종료)" << std::endl << std::endl;
        std::cin >> playerNum[0>> playerNum[1>> playerNum[2];
 
        if (playerNum[0== 0 || playerNum[1== 0 || playerNum[2== 0) {
            std::cout << "게임을 종료합니다." << std::endl;
            return 0;
        }
 
        if (playerNum[0< 0 || playerNum[0> 9 || playerNum[1< 0 || playerNum[1> 9 || playerNum[2< 0 || playerNum[2> 9) {
            std::cout << "잘못된 숫자를 입력하였습니다." << std::endl;
            continue;
        }
 
        if (playerNum[0== playerNum[1|| playerNum[0== playerNum[2|| playerNum[1== playerNum[2]) {
            std::cout << "중복된 숫자를 입력하였습니다." << std::endl;
            continue;
        }
 
        for (int i = 0; i < 3++i) {
            if (targetNum[i] == playerNum[i])    ++strike;
 
            else {
                for (int j = 0; j < 3++j) {
                    if (i == j)    continue;
                    else {
                        if (targetNum[i] == playerNum[j]) {
                            ++ball;
                            break;
                        }
                    }
                }
            }
        }
 
        if (strike == 0 && ball == 0std::cout << "Out" << std::endl;
 
        else if (strike == 3) {
            std::cout << "정답입니다. 게임을 종료합니다." << std::endl;
            return 0;
        }
 
        else {
            std::cout << strike << "strike " << ball << "ball" << std::endl;
        }
    }
 
    return 0;
}
cs

 

1 ~ 9 사이의 중복 없는 임의의 숫자 3개를 맞히는 야구게임을 구현한 전체 코드입니다.

컴퓨터가 고른 3개의 숫자와 플레이어가 고른 3개의 숫자를 비교하여 자리와 숫자가 같으면 strike, 숫자만 같으면 ball, 같은 게 하나도 없으면 out이 출력됩니다.

플레이어가 고른 숫자와 컴퓨터가 고른 숫자가 일치하면 게임이 종료됩니다.

 

 

먼저 5번째 라인은 1 ~ 9 사이의 숫자를 저장할 배열, 6번째 라인은 컴퓨터가 고를 임의의 숫자 3개를 저장할 배열입니다.

7 ~ 29 번째 라인은 앞의 로또 구현에서 배웠던 셔플 알고리즘을 적용하는 과정입니다.

- 참고 링크 : [C/C++] 로또 구현 (tistory.com)

 

30 번째 라인에서 플레이어가 고를 임의의 숫자 3개를 저장할 배열과 strike, ball 값을 저장할 변수를 선언합니다.

 

 

위의 코드는 사용자로부터 3개의 임의의 숫자를 입력받은 후 아래의 순서대로 동작합니다.

 

1. 입력받은 숫자에 0이 포함되면 프로그램을 종료한다.

2. 입력받은 숫자 중 1 ~ 9 범위 밖의 값이 있을 경우 에러를 출력하고 사용자로부터 값을 다시 입력받는다.

3. 입력받은 숫자 중 중복된 값이 있을 경우 에러를 출력하고 사용자로부터 값을 다시 입력받는다.

 

 

54 ~ 68 번째 라인에서 Strike와 Ball 값을 계산합니다.

55 번째 라인에서 플레이어가 고른 숫자와 컴퓨터가 고른 숫자의 자리와 값이 같다면 Strike 값을 1 증가시킵니다. 중복된 숫자는 존재하지 않으므로 if - else 문을 이용하여 Strike 가 먼저 나온다면 더이상 해당 숫자로 검사를 수행하지 않고 다음 숫자로 넘어갑니다.

57 ~ 67 번째 라인은 Strike가 검출되지 않아 Ball을 조사하는 부분입니다.

59 번째 라인에서 i와 j 가 같은 경우 Strike인데, 앞에서 이미 Strike는 없다는 것을 확인했으므로 continue를 이용해 i == j 인 경우는 해당 번호에 아무런 동작도 하지 않고 스킵합니다.

60 ~ 64 번째 라인에서 번호의 위치는 다르지만 값은 같은 경우 Ball 값을 1 증가시킵니다. 마찬가지로 중복은 존재하지 않으므로 Ball 값이 1 증가한다면 2 번째 반복문을 종료합니다.

 

70 번째 라인에서 strike와 ball 검사 결과 모두 0이라면 Out을 출력합니다.

72 ~ 75 번째 라인에서 3 Strike라면 컴퓨터가 고른 숫자를 정확하게 맞혔으므로 게임을 종료합니다.

77 ~ 79 번째 라인에서 Out 혹은 클리어가 아닌 경우 Strike와 Ball을 출력해줍니다.

 

 

잘못된 부분이나 개선 사항은 언제나 편하게 댓글로 지적해주세요.

감사합니다.

 

출처

(7) C언어/C++ 강의 14화 야구게임 [어소트락 게임아카데미] - YouTube

반응형

'C,C++ > 코드정리' 카테고리의 다른 글

[C/C++] 빙고 게임 구현  (0) 2022.09.07
[C/C++] 숫자 퍼즐 게임 구현  (0) 2022.09.07
[C/C++] 로또 구현 (셔플 알고리즘)  (0) 2022.09.07
[C/C++] 별찍기 구현  (0) 2022.09.07
[C/C++] 가위바위보 게임 구현  (0) 2022.09.07

댓글