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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <time.h>
 
void intro(); // 스플래시 
void com_mkrand(); // 컴퓨터 난수 생성,저장
int human_input(); // 플레이어 숫자 입력, 난수와 비교
int Avoid_duplication(); // 중복 숫자 입력 체크
int Avoid_range(); // 인풋 범위 체크
void count_reset(); // 카운트 리셋
 
int output[4], input[4], strike = 0, ball = 0, out = 0, count = 0// 리턴을 주는것보다 전역함수로 제어하는게 효율적이라고 판단
 
int main() {
    int exit;
    srand((unsigned)time(NULL)); // 매번 다른 난수 발생 위해 시드값 부여
    intro(); // 스플래시
 
    com_mkrand(); // 난수 발생
 
    exit = human_input(); // 플레이어 숫자 입력
    if (exit == 0// -1 입력시 종료
        return 0;
 
    std::cout << "\n                  " << count << "\a회 만에 당신이 이겼습니다! \n" << "                  정답 - ";
 
    for (int i = 0; i < 4; i++)
        std::cout << output[i] << " ";
    std::cout << "\n\n";
}
 
void com_mkrand() {
    output[0= rand() % 10// 첫번째 자리0부터 9까지 난수 생성
    while (1) {
        output[1= rand() % 10// 첫번째 자리와 중복되지 않는 난수 발생할때 까지 반복
        if (output[1!= output[0])
            break;
    }
    while (1) { // 왼쪽에 위치한 숫자들과 중복되지 않는 난수 발생할때 까지 반복
        output[2= rand() % 10;
        if (output[2!= output[0] && output[2!= output[1])
            break;
    }
    while (1) { // 왼쪽에 위치한 숫자들과 중복되지 않는 난수 발생할때 까지 반복
        output[3= rand() % 10;
        if (output[3!= output[0] && output[3!= output[1] && output[3!= output[2])
            break;
    }
    std::cout.width(20);
    for (int i = 0; i < 4; i++)
        std::cout << output[i] << " ";
    std::cout << "\n";
}
 
int human_input() {
    int num; // 중복숫자입력 체크용
    while (strike < 4) {
        count++// 게임 횟수 체크
        count_reset();
        std::cout << count << "회 플레이어 숫자 입력 (스페이스 바로 자릿수 입력 -1 입력시 종료):";
        std::cin >> input[0];
        if (input[0== -1// 종료 플래그
            return 0;
        std::cin >> input[1>> input[2>> input[3];
 
        num = Avoid_duplication(); // 중복, 범위 검사
 
        if (num == 1) {
        case1:
            std::cout << count << "회 플레이어 10보다 작은 중복 되지 않는 숫자 입력 (스페이스 바로 자릿수 입력 -1 입력시 종료):";
            std::cin >> input[0];
            if (input[0== -1// 종료 플래그
                return 0;
            std::cin >> input[1>> input[2>> input[3];
            num = Avoid_duplication(); // 중복, 범위 재검사
            if (num == 1// 검사 통과시 num 0반환, 못할 시 1반환. num 1반환 시 다시 입력
                goto case1;
        }
 
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (input[i] == output[i]) {
                    strike++// 스트라이크 카운트
                    break;
                }
                if (input[i] == output[j]) {
                    ball++// 볼 카운트
                    break;
                }
            }
        }
        out = 4 - strike - ball; // 아웃 카운트
        std::cout << "-----------------------------------------------------------------\n";
        std::cout.width(19);
        std::cout << strike << " 스트라이크! " << ball << " 볼! " << out << " 아웃!\n";
        std::cout << "-----------------------------------------------------------------\n";
    }
}
 
int Avoid_duplication() { // 중복 숫자 검사 함수
    int num;
    count_reset();
    for (int i = 0, j = 1; i < 3; i++) { // 중복 숫자 검사
        j = i + 1;
        for (; j < 4; j++) {
            if (input[i] == input[j]) {
                ball++;
            }
        }
    }
 
    if (ball > 0) { // 중복 시 1 반환
        count_reset();
        return 1;
    }
    else { // 중복이 아닐시
        count_reset();
        ball = Avoid_range(); // 10보다 큰 수가 있는지 확인 후
        if (ball > 0)
            return 1// 있을 시 1 반환
        else
            return 0// 없을 시 0 반환
    }
}
 
void count_reset() {
    strike = 0; ball = 0; out = 0// 카운트 리셋 함수
}
 
int Avoid_range() { // 범위 검사 함수
    count_reset();
    for (int i = 0; i < 4; i++) { // 사용자 input이 10보다 큰 수가 있는지 검사
        if (input[i] >= 10)
            ball++// 있을 시 ball 카운트
    }
    if (ball > 0) { // 10보다 큰 수 있을 시 1 반환
        count_reset();
        return 1;
    }
    else { // 없으면  0반환
        count_reset();
        return 0;
    }
}
 
void intro() { // 스플래시
    std::cout << "┌──────────────────────────────────┐\n";
    std::cout << "│                           숫자야구                                 │\n";
    std::cout << "│        윈도우 프로그래밍           김종완 교수님                   │\n";
    std::cout << "│                                                                    │\n";
    std::cout << "│                             developed by - 고상욱(20130889)        │\n";
    std::cout << "└──────────────────────────────────┘\n";
    std::cout.width(24);
    std::cout << "Wait";
    std::cout << ".";
    std::cout << ".";
    std::cout << ".\n";
}
cs


+ Recent posts