카테고리 없음

220317(3) - 숙제: 숫자야구 게임 만들기

hyrule 2022. 3. 25. 16:23
/*규칙
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;
}