플레이어 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 |
댓글