본문 바로가기

실습

실습 1. 숫자 야구

#include<iostream>
#include<random>

int main()
{
	int playerSelect[3];  // 플레이어 입력변수
	int comSelect[3];     // 컴퓨터 난수 변수
	int ballCount = 0;    // 볼 카운트 변수
	int strikeCount = 0;  // 스트라이크 카운트 변수
	int playCount = 1;    // 시행횟수 변수
	int outCount = 0;     // 아웃 카운트 변수
	int bonusPer = 0;     // 구경꾼이 뽀찌를 받을 확률 변수
	int gold = 2000;      // 소지금 변수
	bool isOver = false;  // 게임종료를 나타내는 변수
	int isCorrect = 1;    // 올바른 입력을 확인하기 위한 변수


	srand(time(NULL));


	while (!isOver)	// 게임 종료시 까지 반복
	{
		
		for (int i = 0; i < 3; i++)
		{
			comSelect[i] = rand() % 9 + 1;	// 1부터 9까지의 랜덤변수 설정
		}

		for (int i = 0; i < 3; i++)
		{
			for (int k = 0; k < i; k++)
			{
				while (comSelect[i] == comSelect[k])
					comSelect[i] = rand() % 9 + 1;	// 이전 변수들과 비교하며 중복 발생된 난수 재 발생
			}
		}

		std::cout << "================= 상대방의 숫자 : ";

		for (int i = 0; i < 3; i++)
			std::cout << comSelect[i] << ' ';	// 컴퓨터 변수 출력

		std::cout << "=================" << std::endl;
	

		while (!isOver)			// 게임 종료시까지 반복
		{
			std::cout << std::endl << "현재 플레이 횟수 (10회 초과시 게임 종료) : " << playCount << std::endl;
			std::cout << "내가 맞출 숫자 (1~9 사이의 서로 다른 수 3개, 엔터나 공백으로 구분) : ";

			while (isCorrect > 0)	// 잘못된 입력시 isCorrect를 누적시켜 반복문을 계속 수행
			{
				isCorrect = 0;		// isCorrect 누적이 없을시 반복문 탈출, 정상진행

				for (int i = 0; i < 3; i++)
					std::cin >> playerSelect[i];	// 변수 입력

				
				
				for (int i = 0; i < 3; i++)
				{
					if (playerSelect[i] > 9 || playerSelect[i] < 1)			
					{
						isCorrect++;	// 범위 외의 값 입력시 isCorrect 누적
						break;	// isCorrect는 1회만 누적되어도 잘못된 입력이기 때문에 break로 탈출
					}
					else
					{
						for (int k = 0; k < i; k++)
						{
							if (playerSelect[i] == playerSelect[k])
							{
								isCorrect++;	// 중복입력 시 isCorrect 누적
								break;
							}
						}
					}
				}
				if (isCorrect > 0)
					std::cout << "잘못된 입력입니다. 다시 입력해주세요 : ";
				
			}

			isCorrect = 1;	// 반복문 탈출 후, 정상적인 입력검사 반복문 진입을 위한 변수 초기화


			for (int i = 0; i < 3; i++)
			{
				if (comSelect[i] == playerSelect[i])
					strikeCount++;					// 스트라이크 검사
				else
				{
					for (int k = 0; k < 3; k++)
					{
						if (playerSelect[i] == comSelect[k])	// 스트라이크가 아니라면 
							ballCount++;	// 모든 인덱스에 접근해 검사 후 볼 카운트 증가
					}
				}
			}

			std::cout << std::endl <<"!!!!!" << strikeCount << " 스트라이크" << ballCount << " 볼!!!!!" << std::endl;

			if (strikeCount >= 2)	// 2스트라이크 이상시
			{
				if (strikeCount >= 3)	// 3스트라이크 시
				{
					outCount++;			// 아웃카운트 증가
					std::cout << outCount << "아웃!" << std::endl;	// 현재 아웃카운트 출력

					if (outCount >= 3)
					{
						std::cout << "3 OUT! 게임을 종료합니다." << std::endl;	// 3아웃 이상시 게임 종료
						std::cout << "종료시 소지금 : " << gold;
						isOver = true;
					}
					strikeCount = 0;	// 변수 초기화
					ballCount = 0;
					playCount++;		// 플레이 횟수 증가
					break;				// 현재 게임 종료, 새 게임 시작
				}

				bonusPer = rand() % 10+1;		// 구경꾼 뽀찌를 위한 난수 생성
				if (bonusPer <= 5)				// 50%확률로 구경꾼에게 보너스 지급
				{
					std::cout << std::endl << "구경꾼에게 뽀찌를" << bonusPer * 100 << "원 주었습니다." << std::endl;
					gold -= bonusPer * 100;		// 생성된 난수 * 100 만큼 삭감
				}
				else
					std::cout << std::endl << "2스트라이크 이상을 맞췄지만, 구경꾼이 얄미워 뽀찌를 주지 않았습니다." << std::endl;

				std::cout << "소지금 : " << gold << std::endl;

			}

			strikeCount = 0;
			ballCount = 0;				
			playCount++;	// 게임 완료 후 변수 초기화 및 플레이타임 증가

			if (playCount > 11)		// 플레이 회수 10회 이상시 게임 종료
			{
				std::cout << "플레이 횟수가 10회가 넘었습니다. 게임을 종료합니다.";
				isOver = true;
			}

			if (gold <= 0)		// 소지금 0원 이하일시 게임 종료
			{
				std::cout << "소지금이 부족하여 게임을 종료합니다.";
				isOver = true;
			}
		}
	}
}

오로지 반복문과 분기문만을 사용해서 만든 과제라서 시간도 많이 들고, 예외를 처리하는 데에도 많이 애먹었던 것 같다.

지금까지 배운 것들로만 만들기로 해서, 함수를 사용하지 않았기에 중첩 반복, 분기가 많아 코드가 상당히 더러워진 것도 흠이다.

하지만 이렇게 기초 문법만으로 프로그램을 만드는 것이 도움이 되었다고 생각한 점은,

기초 문법을 여러번 사용하고, 또 기초 문법만 사용하여 프로그램을 만들었기 때문에

반복문, 분기문에 대한 깊은 이해가 생긴 것 같은 기분이 들었다.

평소에 내가 공부하면서 생각해본 방향이 아닌 다른 방향으로 생각해서 풀렸던 부분도 있고,

계속 버그가 생기고, 원하는 대로 프로그램이 흘러가지 않아서 기존의 생각을 돌려 다르게 생각하는 연습이 충분이 됐던 것 같다.

특히나 애먹었던 것은, 난수를 발생시키고, 발생된 세 난수가 서로 중복되는 점 없이 완전히 다르게 발생시키는 것,

그리고 플레이어가 정답을 맞추려고 입력할 때, 1부터 10이 아니거나, 서로 중복된 숫자를 입력했을 때

플레이 횟수 증가 없이, 다시 선택하도록 하는 알고리즘을 구현하는 것이 가장 시간이 오래 걸렸던 것 같다.