/*규칙
1 ~ 9 사이의 랜덤한 숫자중 3개를 얻어온다.
숫자는 중복되면 안된다.
3개의 숫자는
* * *
이런식으로 표시를 한다.
플레이어는 숫자 3개를 입력한다.
5 9 2 를 맞춰야 한다면
플레이어가 1 3 4 입력했다면
서로 같은 숫자가 없으므로 Out을 표시한다.
플레이어가 5 7 8 을 입력했다면
5는 숫자도 같고 위치도 같으므로 strike
나머지 2개는 같은 숫자가 없으므로
1strike 0ball이다.
5 2 9 를 입력했다면
5는 위치도 같고 2 와 9는 숫자는 같지만
위치가 다르므로
1strike 2ball 출력한다.
5 9 2 를 입력하면 종료된다.
*/
#include <iostream>
#include <time.h>
int main()
{
srand((unsigned int)time(0));
int random = rand(); //시간 설정 및 rand()함수 첫번째 값 제거
//rand()함수는 첫번째 값이 규칙적으로 보이는 값이 나오므로 첫번째 값을 제거해주어야 한다.
/*코딩순서
1.랜덤한 수 3개 생성
2.배열에 값 입력받고 저장(1~9 또는 0을 눌러 종료)
3.
*/
while (true)
{
system("cls");
std::cout << "********숫자 야구********\n";
//std::cout << "PRESS ANY KEY TO START\n\n";
system("pause");
//1.1~9까지 수를 넣은 배열을
int shuffle[9] = {};
for (int i = 0; i < 9; i++)
{
shuffle[i] = i + 1;
}
//2.배열 셔플 100회
for (int i = 0; i < 100; ++i)
{
int index1 = rand() % 9;
int index2 = rand() % 9;
int temp = shuffle[index1];
shuffle[index1] = shuffle[index2];
shuffle[index2] = temp;
}
//3.섞은 배열에서 첫 번째 값 3개를 꺼내와서 저장하기. 변수 셔플 완료.
int answer[3] = {};
for (int i = 0; i < 3; ++i)
{
answer[i] = shuffle[i];
//값 확인. 실제로 할떄는 여기 주석처리해줄것
std::cout << "DEBUG :: " << answer[i] << std::endl;
}
//4.사용자의 값 입력받기. 여기부터 맞출때까지 무한루프를 또 돌려야 함.
while (true)
{
int checkArr[9] = {};//값이 중복되었는지 체크하기 위한 용도의 배열(입력된 값을 인덱스로 해서 해당 값을 1로 변경)
int input[3] = {};//값을 입력받고 저장할 길이 3개의 배열 생성
for (int i = 0; i < 3; ++i)
{
while (true)
{
std::cout << "\n* " << i + 1 << "번째 숫자를 입력해 주세요 (1 ~ 9)\n 0번을 누르시면 종료됩니다.\n>> ";;
std::cin >> input[i];
if (0 == checkArr[input[i]])//중복값 확인. 중복되지 않았을 시
{
std::cout << checkArr[input[i]];
checkArr[input[i]] = 1;//체크용 배열의 인덱스에 해당 값이 사용되었다고 표시해주기.
if (0 == input[i])//종료
{
return 0;
//이후에 코드가 복잡해졌을때 막무가내로 return 0을 하면 버그가 발생할 수 있으므로 사용을 자제하는 것이 좋다.
}
else if (0 > input[i] || 9 < input[i])//1미만 또는 9초과 값이 입력되었을 시
{
std::cout << "잘못된 값이 입력되었습니다. 다시 입력하세요." << std::endl;
continue;
}
else
break;
}
else
{
std::cout << "잘못된 값이 입력되었습니다. 다시 입력하세요." << std::endl;
continue;
}
}
}
//5.값을 비교하기
//* 자리비교 + 값비교 두개를 같이해야함
//이중포문으로 실행하고 같은 값이 나올경우
//i == j인지 확인하고 i == j이면 strike++
//i != j이면 ball++
//else면 out++
int strike = 0;
int ball = 0;
//out = 3 - strike - ball 이므로 따로 선언하지 않는다
for (int i = 0; i < 3; ++i)
{
int index = i;
for (int j = 0; j < 3; ++j)
{
if (answer[i] == input[j])
{
if (i == j)
++strike;
else
++ball;
}
}
}
std::cout << std::endl;
std::cout << "Strike : " << strike << std::endl;
std::cout << "Ball : " << ball << std::endl;
std::cout << "Out : " << 3 - strike - ball << std::endl;
if (3 == strike)
{
std::cout << "~~~숫자를 전부 맞추셨습니다~~~";
std::cout << "\n * 정답 *" << std::endl;
for (int i = 0; i < 3; ++i)
{
std::cout << answer[i] << "\t";
}
bool again = false;
std::cout << "\n* 0을 입력하면 다시하기, 0 이외의 아무 값이나 입력 후 엔터를 종료.\n>> ";
std::cin >> again;
if (again)
break;
else
return 0;
}
}
}
return 0;
}