본문 바로가기
공부

C++ 다수 컴퓨터 가위 바위 보 게임

by MY블로그 2022. 11. 17.

플레이어 vs 컴퓨터의 가위바위보는 

수업 초창기때 했었다..

이번과제로 다수컴퓨터의 가위바위보 를 만들어야 하는데

혼자 만들다 실패해서 구글링으로 여러 코드들을 참고하여 간신히 만들었다..

쉬울 것같았는데 너무.. 너무 어렵다.. 일단 코드 만들었으니

기존과제(블랙잭 + 섯다)에다가 가위바위보도 합쳐야 한다..

 

아래의 코드는 이넘/클래스/벡터 등이 사용되었다.

수업진도로 진행했던것들이나 아직 제대로 다루지 못한다.. 복습열심히해야겠다.

내일 선생님 풀이를 제대로 익혀야될것같다.

 

구글링으로 찾은 코드는 우선 인원수 입력후 최종 승자까지 한번에 출력이되는방식이었으나

중간중간에 예외처리 및 가위바위보를 매판단위로 끊고 재시작점을 넣는 것을 진행해보았다.

코드를 하나부터 끝까지 만들어내는거는 너무심하게 어렵지만 이리저리 만지작거리고 바꿔보는게 너무재미있다.

#include <time.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

enum eRPS //가위 바위 보 열거. - 0 1 2
{
	ROCK, PAPER, SCISSORS
};

class RPSplayer //플레이어 클래스(구조체) 이름 패(가위바위보) 패배여부
{
public:
	string name = "";
	int rps = NULL;
	bool isLose = false; // false 거짓일때 패배.
};

int main()
{
	srand((unsigned int)time(NULL));

	int PlayerNum; //플레이어 변수
	vector<RPSplayer> Player; //벡터로 할당되는 플레이어
	vector<RPSplayer>::iterator iter; //플레이어 반복자 ??
	string PutName; //이름 입력받을 스트링변수

	int input;
	int PutRPS, Count, sum;
	// PutRPS - 가위바위보 입력되는값
	// Count - 가위바위보 갯수 세기
	// sum - 가위바위보 센 값수 더할변수
	restart:
	cout << "[ 가위 바위 보 게임 ]" << endl;
	cout << "가위바위보 참가 인원수(2~10명만) : ";
	cin >> PlayerNum; //플레이어 변수 입력받기
	if (PlayerNum < 2 || PlayerNum > 10) //예외처리.
	{
		cout << "플레이는 2~10명까지만 해주세요" << endl;
		goto restart; // continue 는 반복문에서만사용가능해서 goto 사용
	}
	Player.resize(PlayerNum); //입력받은 변수만큼 배열크기정하기

	//인원수별로 이름 할당 받기
	for (int i = 0; i < PlayerNum; i++)
	{
		cout << i + 1 << "번 플레이어의 이름 : ";
		cin >> PutName; //스트링변수로 이름 입력받기
		Player[i].name = PutName;
	}

	while (Player.size() != 1) // 최후1명까지 반복하는 반복문
	{
		Count = 0;  // 가위바위보 카운트 초기화
		sum = 0; // 가위바위보 경우의수 초기화

		for (int i = 0; i < (int)Player.size(); i++)
		{
			PutRPS = rand() % 3; //가위바위보 0 1 2 중랜덤으로
			Player[i].rps = PutRPS;
			//무승부 : 3가지 패가 모두 존재 or 1가지패만존재
			//즉 Count 가 3 혹은 1인경우

			if (Count == 0)
			{//첫 플레이어 카운트 후 패 더하기
				Count++;
				sum += PutRPS;
			}
			
			else if (Count == 1 && PutRPS != sum)
			{//첫 번째 이후 sum에 더해진 값(첫판값)과 패값이다르면 카운트+
				Count++;
				sum += PutRPS;
			}

			else if (Count == 2 && PutRPS + sum == 3)
			{//2가지의 패가 들어온후 그외에 패가 있다면 카운트+
				Count++;
			}

		}
		//결과계산
		//비기지 않았을 경우의 패배자 확인
		if (Count == 2)
		{
			for (int i = 0; i < (int)Player.size(); i++)
			{
				if (sum == 1)
				{//바위 & 보 대결
					if (Player[i].rps == ROCK)
						Player[i].isLose = true; //플레이어패배전환
				}
				else if (sum == 2)
				{//바위 & 가위 대결
					if (Player[i].rps == SCISSORS)
						Player[i].isLose = true; //플레이어패배전환
				}
				else if (sum == 3)
				{//보 & 가위 대결
					if (Player[i].rps == PAPER)
						Player[i].isLose = true; //플레이어패배전환
				}
			}
		}
		//결과 출력
		/*cout << "이름\t가위바위보";
		if (Count == 2) cout << "\t결과";*/
		cout << endl;

		//내용
		for (int i = 0; i < (int)Player.size(); i++)
		{
			//이름 출력
			cout <<"["<< Player[i].name<<"]" << "\t";
			//가위 바위 보 출력
			if (Player[i].rps == SCISSORS)
				cout << "가위";
			else if (Player[i].rps == ROCK)
				cout << "바위";
			else
				cout << "보";

			if (Count == 2)//무승부가 아닌경우 승패 출력
			{
				cout << "\t";
				if (Player[i].isLose == true)
					cout << "패";
				else
					cout << "승";
			}
			else if (Count != 2)//무승부 일경우 출력
			{
				cout << "\t";
					cout << "무승부";
			}
			cout << endl;
		}
		cout << endl;
		cout << "계속 하려면 아무키나 입력해 주세요 : "; cin >> input;
		//패배자 삭제
		for (iter = Player.begin(); iter != Player.end();)
		{
			if ((*iter).isLose == true)
				iter = Player.erase(iter);
			else
				iter++;
		}
		cout << endl;
	} // 반복 끝
	//마지막으로 승자 출력
	cout << "최종승리 : "<<"["<< Player[0].name <<"]"<< " 플레이어" << endl;
	cout << endl;
	cout << "게임 다시 시작하기 : 1 / 종료 : 그외 " << endl;
	cin >> input;
	if (input == 1)
	{
		goto restart;
	}
	Player.clear();
	Player.shrink_to_fit();
	return 0;
}

'공부' 카테고리의 다른 글

C++ 문자>값으로 / 값>문자로 변형 참고  (0) 2022.11.23
C++ 정적(static)멤버 변수&함수  (2) 2022.11.22
C++ 이전과제 클래스구조로 변환시키기  (0) 2022.11.16
C++ 블랙잭 게임 복습  (1) 2022.11.16
C++ OOP 조사  (0) 2022.11.15

댓글