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 == 0) std::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을 출력해줍니다.
잘못된 부분이나 개선 사항은 언제나 편하게 댓글로 지적해주세요.
감사합니다.
출처
'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 |
댓글