강께르의 개발일지

[C++] 가위바위보 게임 본문

연습

[C++] 가위바위보 게임

강께르 2021. 6. 3. 16:54

1. 이것은 무엇인가?

 if, switch, while을 이용해서 컴퓨터와 가위바위보를 하는 게임이다. 사용자는 선택지를 제공받아 1에서 3 사이의 숫자 중 하나를 고르고, rand 함수를 이용해서 컴퓨터가 선택지 중 하나를 고르게 한다. 그리고 조건문을 통해 그에 맞는 결과를 출력해주고, 반복문을 이용해서 게임 수가 10번이 넘지 않도록 만든다.

 

2. 새로 알게 된 것은?

 srand()의 사용법을 알게 됐다. srand()를 rand()를 사용할 자리에 대체해서 들어가 사용하는 줄 알았는데, rand()에 사용될 값을 srand()의 매개변수로 들어갈 시드값으로 초기화한다는 점을 알게 됐다. srand()의 매개변수로 들어갈 값은 실행시킬 때마다 매번 새로운 시드값을 부여하기 위해서 시간을 사용했다. C++ 기준으로 ctime 헤더파일에 있는 time은 현재 시간을 time_t 자료형으로 알려준다. 이를 이용하기 위해 unsigned int로 캐스팅을 해서 매개변수를 사용하는 것까지 알게 됐다.

 

3. 코드

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

enum HAND {
	SCISSORS,
	ROCKS,
	PAPERS
};

enum RESULT {
	WIN,
	LOSE,
	DRAW
};

int main(void)
{
	int playerChoose, computerChoose, gameCount = 0;
	int resultNum = 0, winCount = 0, loseCount = 0;
	srand((unsigned int)time(NULL));

	cout << "=======================================" << endl;
	cout << "======== 가 위 바 위 보 게 임 =========" << endl;
	cout << "=======================================" << endl << endl;

	while (gameCount++ < 10)
	{
		cout << "=======================================" << endl;
		cout << "============== " << gameCount << "번째 판 =============== " << endl;
		cout << "=======================================" << endl << endl;
		cout << "=======================================" << endl;
		cout << "가위, 바위, 보 중에 하나를 선택하세요." << endl;
		cout << "=======================================" << endl;
		cout << "1. 가위" << endl;
		cout << "2. 바위" << endl;
		cout << "3. 보" << endl;
		cout << "=======================================" << endl;
		cout << "1 ~ 3 중에서 고르세요 : ";
		cin >> playerChoose;
		while ((playerChoose < 1) || (playerChoose > 3))
		{
			cout << "1 ~ 3 중에서 다시 고르세요 : ";
			cin >> playerChoose;
		}
		playerChoose--;
		cout << "=======================================" << endl;
		computerChoose = rand() % 3;

		if (playerChoose == SCISSORS)
		{
			cout << "플레이어의 선택 : 가위" << endl;
			switch (computerChoose)
			{
			case SCISSORS:
				resultNum = DRAW;
				break;
			case ROCKS:
				resultNum = LOSE;
				loseCount++;
				break;
			case PAPERS:
				resultNum = WIN;
				winCount++;
				break;
			}
		}
		else if (playerChoose == ROCKS)
		{
			cout << "플레이어의 선택 : 바위" << endl;
			switch (computerChoose)
			{
			case SCISSORS:
				resultNum = WIN;
				winCount++;
				break;
			case ROCKS:
				resultNum = DRAW;
				break;
			case PAPERS:
				resultNum = LOSE;
				loseCount++;
				break;
			}
		}
		else if (playerChoose == PAPERS)
		{
			cout << "플레이어의 선택 : 보" << endl;
			switch (computerChoose)
			{
			case SCISSORS:
				resultNum = LOSE;
				loseCount++;
				break;
			case ROCKS:
				resultNum = WIN;
				winCount++;
				break;
			case PAPERS:
				resultNum = DRAW;
				break;
			}
		}

		switch (computerChoose)
		{
		case SCISSORS:
			cout << "컴퓨터의 선택 : 가위" << endl;
			break;
		case ROCKS:
			cout << "컴퓨터의 선택 : 바위" << endl;
			break;
		case PAPERS:
			cout << "컴퓨터의 선택 : 보" << endl;
			break;
		}

		switch (resultNum)
		{
		case 0:
			cout << "컴퓨터를 상대로 승리했습니다." << endl;
			break;
		case 1:
			cout << "컴퓨터를 상대로 패배했니다." << endl;
			break;
		case 2:
			cout << "컴퓨터를 상대로 비겼습니다." << endl;
			break;
		}
		cout << "=======================================" << endl;
		cout << endl << endl;
	}
	gameCount--;
	cout << "=======================================" << endl;
	cout << "승리 : " << winCount << "회" << endl;
	cout << "패배 : " << loseCount << "회" << endl;
	cout << "무승부 : " << gameCount - winCount - loseCount << "회" << endl;
	cout << "승률 : " << (double)winCount / gameCount * 100 << "%" << endl;
	cout << "=======================================" << endl;
	cout << endl;
	return 0;
}

4. 결과

인간과 인공지능의 세기의 대결