* 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;
}
}
}
}
'2D 프로그래밍 수업(일부비공개)' 카테고리의 다른 글
수업 61일차 - 사각형과 점 충돌, 원과 점 충돌, 마우스 이벤트 (0) | 2023.01.11 |
---|---|
수업 60일차 - 카메라 가두기 2탄, 뷰포트, 투영행렬 (0) | 2023.01.10 |
수업 32일차 - static (0) | 2022.11.23 |
수업 28일차 - 다수 가위 바위 보 (0) | 2022.11.18 |
수업 27일차 - 템플릿 (template) / 유틸리티 (utility) (0) | 2022.11.17 |
댓글