본문 바로가기
2D 프로그래밍 수업(일부비공개)

수업 31일차 - 가위바위보 하나 빼기 풀이

by MY블로그 2022. 11. 22.

* Getter Setter 두개다 오픈할경우 private를 안쓰고 public 을  써도된다.


#pragma once
enum Value
{
	ROCK,
	SCISSORS,
	PAPER
};

enum Result
{
	WIN,
	DRAW,
	LOSE
};

class RPlayer
{
public:
	string	name;
	int		value;
	int		result;
	int		hand[2]; // 왼손 오른손값 두개의배열생성

public:
	void Print();
	void PrintResult();
};
#include "stdafx.h"

void RPlayer::Print() // 처음 사용될 프린트 (결과없이 양손 다 출력)
{
	cout << name << "\t";

	switch (hand[0])
	{
	case ROCK:
		cout << "바위" << "\t";
		break;
	case SCISSORS:
		cout << "가위" << "\t";
		break;
	case PAPER:
		cout << "보" << "\t";
		break;
	}

	switch (hand[1])
	{
	case ROCK:
		cout << "바위" << endl;
		break;
	case SCISSORS:
		cout << "가위" << endl;
		break;
	case PAPER:
		cout << "보" << endl;
		break;
	}
}

void RPlayer::PrintResult() // 한손 결정하고 결과값 포함 시킨 출력
{
	cout << name << "\t";

	switch (value)
	{
	case ROCK:
		cout << "바위" << "\t";
		break;
	case SCISSORS:
		cout << "가위" << "\t";
		break;
	case PAPER:
		cout << "보" << "\t";
		break;
	}

	switch (result)
	{
	case WIN:
		cout << "이김" << endl;
		break;
	case DRAW:
		cout << "비김" << endl;
		break;
	case LOSE:
		cout << "짐" << endl;
		break;
	}
}
#pragma once

class RSP
{
public:
	int				size;
	int				input;
	int				Rcount;
	int				Scount;
	int				Pcount;

	RPlayer			player;  // 플레이어는 하나 고정이니 따로 만들어둔다
	vector<RPlayer> coms; // 컴퓨터는 입력에따라 배열수가달라지니 벡터로두고

public:
	void PlayRSP();
};
#include "stdafx.h"

void RSP::PlayRSP()
{
	cout << "유저를 제외한 플레이어 수 : "; cin >> size;
	coms.resize(size);

	cout << "플레이어 이름 입력 : ";
	cin >> player.name;

	//플레이어와 컴퓨터를 나눠서 입력 받는다.

	for (int i = 0; i < coms.size(); i++)
	{
		coms[i].name = "Com" + to_string(i);
	} // to_string > 스트링(string) 으로(to) 반환시켜준다는 것이다.


	while (true)
	{
		cout << "왼손 선택 (0.바위 1.가위 2.보) : " << endl;
		cin >> input;
		player.hand[0] = input; // 0번배열에 입력값 넣기

		cout << "오른손 선택 (0.바위 1.가위 2.보) : " << endl;
		cin >> input;
		player.hand[1] = input; // 1번배열에 입력값 넣기

		for (int i = 0; i < coms.size(); i++) //컴퓨터는 양손 랜덤으로 넣는다.
		{
			coms[i].hand[0] = rand() % 3; 
			coms[i].hand[1] = rand() % 3;
		}

		player.Print(); // 플레이어와 컴퓨터는 따로있으니 먼저프린트
		for (int i = 0; i < coms.size(); i++) // 플레이어 뒤에 바로 컴퓨터 프린트
		{
			coms[i].Print(); //현재 플레이어와 컴퓨터의 출력은 승패x 좌우에 입력된 값들출력
		}

		Rcount = 0; //카운트 초기화시킴
		Scount = 0;
		Pcount = 0;

		cout << "왼손 오른손 선택(0.왼손 1.오른손) : "; // 좌 우 선택
		cin >> input;
		player.value = player.hand[input]; // 플레이어의 값에 입력한쪽 값 넣기

		//플레이어 카운트
		switch (player.value)  // 값을 가위바위보로 전환후 카운팅
		{
		case ROCK:
			Rcount++;
			break;
		case SCISSORS:
			Scount++;
			break;
		case PAPER:
			Pcount++;
			break;
		}

		//컴퓨터 카운트
		for (int i = 0; i < coms.size(); i++) // 반복문으로 컴퓨터 전체 돌려주고
		{
			coms[i].value = coms[i].hand[rand() % 2]; //컴퓨터의값은 양손중 하나 랜덤, 0 or 1
													//hand[i] 값에 rand()%2 바로 넣어도된다!
			switch (coms[i].value) // 값을 가위바위보로 전환후 카운팅
			{
			case ROCK:
				Rcount++;
				break;
			case SCISSORS:
				Scount++;
				break;
			case PAPER:
				Pcount++;
				break;
			}
		}


		//무승부 // 컴퓨터만 승부비교되기때문에 com.size()+1 플레이어 1나 추가시켜서진행
		if ((Rcount == coms.size() + 1) || (Scount == coms.size() + 1) ||
			(Pcount == coms.size() + 1)) // 하나의 경우의 수만 나왔을경우. 모두 주먹or가위or보
		{
			player.result = DRAW;  // 플레이어 무승부

			for (int i = 0; i < coms.size(); i++) // 컴퓨터 전체 무승부
			{ 
				coms[i].result = DRAW;
			}
		}
		else if ((Rcount != 0) && (Scount != 0) && (Pcount != 0)) // 모든경우의수가 0이아닐(모두나온)경우
		{
			player.result = DRAW;  // 플레이어 무승부

			for (int i = 0; i < coms.size(); i++)  // 컴퓨터 전체 무승부
			{
				coms[i].result = DRAW;
			}
		}
		else //승패
		{
			if (Rcount == 0) //가위 보 ( Rock 바위가 0 > 바위없을경우)
			{
				switch (player.value) // 플레이어의 값에따라서
				{
				case SCISSORS: // 플레이어가 가위일경우 (주먹없는경우니 컴퓨터는 보)
					player.result = WIN;
					break;
				case PAPER: // 플레이어가 보일경우 (주먹없는경우니 컴퓨터는 가위)
					player.result = LOSE;
					break;
				}

				for (int i = 0; i < coms.size(); i++) // 컴퓨터의 값에 따라서
				{
					switch (coms[i].value)
					{
					case SCISSORS: // 가위면 승리
						coms[i].result = WIN;
						break;
					case PAPER: // 보면 패배
						coms[i].result = LOSE;
						break;
					}
				}
			}
			else if (Scount == 0) //바위 보 ( 가위가 없는경우 )
			{
				switch (player.value) // 플레이어의 값이
				{
				case PAPER: // 보면 승리
					player.result = WIN;
					break;
				case ROCK: // 바위면 패배
					player.result = LOSE;
					break;
				}

				for (int i = 0; i < coms.size(); i++) // 컴퓨터 비교
				{
					switch (coms[i].value)
					{
					case PAPER: // 보면 승리
						coms[i].result = WIN;
						break;
					case ROCK: // 바위면 패배
						coms[i].result = LOSE;
						break;
					}
				}
			}
			else //바위 가위 ( 보가 없는 경우 )
			{
				switch (player.value) // 플레이어의 값이
				{
				case ROCK: // 바위면 승리
					player.result = WIN;
					break;
				case SCISSORS: // 가위면  패배
					player.result = LOSE;
					break;
				}

				for (int i = 0; i < coms.size(); i++) // 컴퓨터 비교
				{
					switch (coms[i].value)
					{
					case ROCK: // 바위면 승리
						coms[i].result = WIN;
						break;
					case SCISSORS: // 가위면 패배
						coms[i].result = LOSE;
						break;
					}
				}

			}

			//출력
			player.PrintResult(); // 먼저출력된것과다르게 이번엔 결과값 넣은 출력사용
			for (int i = 0; i < coms.size(); i++) // 컴퓨터도 똑같이 결과있는 프린트로 출력
			{
				coms[i].PrintResult();
			}

			//진사람 빠져
			if (player.result == LOSE) // 만약 플레이어의 승패가 패배일경우
			{
				cout << "플레이어 짐" << endl;
				break; // 게임끝
			}
			else
			{    // 플레이어는승리하고 컴퓨터가 패배할경우 패배자는 제외
				for (vector< RPlayer>::iterator it = coms.begin(); it != coms.end();)
				{
					if ((*it).result == LOSE) // 이터의 주소 결과값이 패배라면
					{
						it = coms.erase(it); // 결과 LOSE 인 이터반환값 배열 삭제
					}
					else
					{
						it++; // 그외 이터 증가시키면서 검사반복
					}
				}
			}

			if (coms.size() == 0) // 컴퓨터는 다없어지고 플레이어만 남았다면
			{
				cout << player.name << "승리!" << endl;
				break;
			}
		}
	}
}

댓글