#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";
}