앞서 만들었던 섯다에서 더 많은 족보 추가
열거형(enum)을 추가하여 가독성 향상
Card 구조체 추가
족보 계산 함수 수정
플레이어 카드 정렬을 위한 Swap() 함수 추가
플레이어 Print() 함수 수정
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
//족보 숫자
enum JOKBO
{
MANG = -1,
KK_0,
KK_9 = 9,
GABO = 13,
SEARUK,
JANGSA,
JANGBBI,
GUBBI,
DOKSA,
ALLi,
DD_1 = 21,
DD_10 = 30,
KD
};
//카드 구조체
struct Card
{
int month;
string shape;
};
//플레이어 구조체
struct Player
{
string name;
int money;
Card card[2];
int jokbo;
};
//족보 계산 함수
void MakeJokbo(int size, Player* player)
{
for (int i = 0; i < size; i++)
{
//땡
if (player[i].card[0].month == player[i].card[1].month)
{
player[i].jokbo = player[i].card[0].month + (DD_1 - 1);
}
//갑오
else if (player[i].card[0].month + player[i].card[1].month == 9)
{
player[i].jokbo = GABO;
}
//광땡
else if (player[i].card[0].shape == "光" && player[i].card[1].shape == "光")
{
player[i].jokbo = KD;
}
else //끗
{
player[i].jokbo = ((player[i].card[0].month + player[i].card[1].month) % 10) + KK_0;
}
if (player[i].card[0].month == 1)
{
//알리
if (player[i].card[1].month == 2)
{
player[i].jokbo = ALLi;
}
//독사
else if (player[i].card[1].month == 4)
{
player[i].jokbo = DOKSA;
}
//구삥
else if (player[i].card[1].month == 9)
{
player[i].jokbo = GUBBI;
}
//장삥
else if (player[i].card[1].month == 10)
{
player[i].jokbo = JANGBBI;
}
}
if (player[i].card[0].month == 4)
{
//장사
if (player[i].card[1].month == 10)
{
player[i].jokbo = JANGSA;
}
//세륙
else if (player[i].card[1].month == 6)
{
player[i].jokbo = SEARUK;
}
}
if (player[i].card[0].month == 2 && player[i].card[1].month == 8)
{
player[i].jokbo = MANG;
}
}
}
//카드 정렬할 스왑함수
void Swap(int i, int size, Player* player)
{
Card temp;
if (player[i].card[0].month > player[i].card[1].month)
{
temp = player[i].card[0];
player[i].card[0] = player[i].card[1];
player[i].card[1] = temp;
}
}
//셔플 함수
void Shuffle(Card* card)
{
for (int i = 0; i < 1000; i++)
{
int sour = rand() % 20;
int demp = rand() % 20;
Card temp = card[sour];
card[sour] = card[demp];
card[demp] = temp;
}
}
//플레이어 출력
void PrintPlayer(int size, Player* player)
{
for (int i = 0; i < size; i++)
{
cout << player[i].name << "\t"
<< player[i].card[0].month << player[i].card[0].shape << "\t"
<< player[i].card[1].month << player[i].card[1].shape << "\t"
<< player[i].money << "\t";
if (player[i].jokbo == KD) // 광떙
{
cout << player[i].card[0].month << player[i].card[1].month << "광땡" << endl;
}
else if (player[i].jokbo >= DD_1) //땡
{
cout << player[i].jokbo - 20 << "땡" << endl;
}
else if (player[i].jokbo == ALLi)
{
cout << "알리" << endl;
}
else if (player[i].jokbo == DOKSA)
{
cout << "독사" << endl;
}
else if (player[i].jokbo == GUBBI)
{
cout << "구삥" << endl;
}
else if (player[i].jokbo == JANGBBI)
{
cout << "장삥" << endl;
}
else if (player[i].jokbo == JANGSA)
{
cout << "장사" << endl;
}
else if (player[i].jokbo == SEARUK)
{
cout << "세륙" << endl;
}
else if (player[i].jokbo == GABO)
{
cout << "갑오" << endl;
}
else if (player[i].jokbo == MANG)
{
cout << "망통" << endl;
}
else
{
cout << player[i].jokbo << "끗" << endl;
}
}
}
int main()
{
srand(time(NULL));
int size;
int totalprice;
//플레이어 수 입력 및 예외처리
while (true)
{
cout << "플레이어 수 입력 : "; cin >> size;
if (size > 10 || size < 2)
cout << "다시 입력" << endl;
else
break;
}
//플레이어 동적할당
Player* player = new Player[size];
for (int i = 0; i < size; i++)
{
cout << i + 1 << "번째 입력 : ";
cin >> player[i].name;
player[i].money = 10000;
}
//카드 덱 생성
Card deck[20];
for (int i = 0; i < 20; i++)
{
deck[i].month = i % 10 + 1;
deck[i].shape = "月";
}
deck[0].shape = deck[2].shape = deck[7].shape = "光";
//반복 시작 전 필요한 변수 추가
int start = 0;
totalprice = 500 * size;
while (!start)
{
//덱 셔플
Shuffle(deck);
//카드 분배
for (int i = 0; i < size; i++)
{
player[i].card[0] = deck[i];
player[i].card[1] = deck[i + 10];
player[i].money -= 500;
Swap(i, size, player);
}
//족보 생성
MakeJokbo(size, player);
//승자 판별
int winner = 0;
int count = 0;
for (int i = 0; i < size; i++)
{
if (player[i].jokbo > winner)
{
winner = player[i].jokbo;
}
}
//승자 출력
for (int i = 0; i < size; i++)
{
if (winner == player[i].jokbo)
{
cout << player[i].name << "\t";
count++;
}
}
cout << "승리!!!" << endl;
//상금 분배
for (int i = 0; i < size; i++)
{
if (winner == player[i].jokbo)
{
player[i].money += totalprice / count;
}
}
//본문 출력
PrintPlayer(size, player);
//반복 여부
cout << "0. 계속 / 1. 나가기" << endl << "입력 : ";
cin >> start;
}
//동적 할당 해제
delete[] player;
return 0;
}
3.0 Ver Patch Note
열거형 JOKBO에서 불필요한 변수 제거
족보 계산 함수(MakeJokbo) 수정
Swap함수, Shuffle함수 수정
승자 판별 / 상금 분배 코드 수정
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
//족보 숫자
enum JOKBO
{
KK_0,
KK_9 = 9,
GABO = 13,
SEARUK,
JANGSA,
JANGBBI,
GUBBI,
DOKSA,
ALLi,
DD_1 = 21,
DD_10 = 30,
KD
};
//카드 구조체
struct Card
{
int month;
string shape;
};
//플레이어 구조체
struct Player
{
string name;
int money;
Card card[2];
int jokbo;
};
//족보 계산 함수
void MakeJokbo(int size, Player* player)
{
for (int i = 0; i < size; i++)
{
//땡
if (player[i].card[0].month == player[i].card[1].month)
{
player[i].jokbo = player[i].card[0].month + (DD_1 - 1);
}
//갑오
else if (player[i].card[0].month + player[i].card[1].month == 9)
{
player[i].jokbo = GABO;
}
//광땡
else if (player[i].card[0].shape == "光" && player[i].card[1].shape == "光")
{
player[i].jokbo = KD;
}
else //끗
{
player[i].jokbo = ((player[i].card[0].month + player[i].card[1].month) % 10) + KK_0;
}
if (player[i].card[0].month == 1)
{
//알리
if (player[i].card[1].month == 2)
{
player[i].jokbo = ALLi;
}
//독사
else if (player[i].card[1].month == 4)
{
player[i].jokbo = DOKSA;
}
//구삥
else if (player[i].card[1].month == 9)
{
player[i].jokbo = GUBBI;
}
//장삥
else if (player[i].card[1].month == 10)
{
player[i].jokbo = JANGBBI;
}
}
if (player[i].card[0].month == 4)
{
//장사
if (player[i].card[1].month == 10)
{
player[i].jokbo = JANGSA;
}
//세륙
else if (player[i].card[1].month == 6)
{
player[i].jokbo = SEARUK;
}
}
}
}
//카드 정렬할 스왑함수
void Swap(Card* card, int sour, int demp)
{
Card temp = card[sour];
card[sour] = card[demp];
card[demp] = temp;
}
//셔플 함수
void Shuffle(Card* card)
{
for (int i = 0; i < 1000; i++)
{
int sour = rand() % 20;
int demp = rand() % 20;
Swap(card, sour, demp);
}
}
//플레이어 출력
void PrintPlayer(int size, Player* player, int winner)
{
//승자 출력
for (int i = 0; i < size; i++)
{
if (winner == player[i].jokbo)
{
cout << player[i].name << "\t";
}
}
cout << "승리!!!" << endl;
for (int i = 0; i < size; i++)
{
cout << player[i].name << "\t"
<< player[i].card[0].month << player[i].card[0].shape << "\t"
<< player[i].card[1].month << player[i].card[1].shape << "\t"
<< player[i].money << "\t";
if (player[i].jokbo == KD) // 광떙
{
cout << player[i].card[0].month << player[i].card[1].month << "광땡" << endl;
}
else if (player[i].jokbo >= DD_1) //땡
{
cout << player[i].jokbo - 20 << "땡" << endl;
}
else if (player[i].jokbo == ALLi)
{
cout << "알리" << endl;
}
else if (player[i].jokbo == DOKSA)
{
cout << "독사" << endl;
}
else if (player[i].jokbo == GUBBI)
{
cout << "구삥" << endl;
}
else if (player[i].jokbo == JANGBBI)
{
cout << "장삥" << endl;
}
else if (player[i].jokbo == JANGSA)
{
cout << "장사" << endl;
}
else if (player[i].jokbo == SEARUK)
{
cout << "세륙" << endl;
}
else if (player[i].jokbo == GABO)
{
cout << "갑오" << endl;
}
else
{
if (player[i].jokbo == KK_0)
{
cout << "망통" << endl;
}
else
{
cout << player[i].jokbo << "끗" << endl;
}
}
}
}
int main()
{
srand(time(NULL));
int size;
int totalprice = 0;
//플레이어 수 입력 및 예외처리
while (true)
{
cout << "플레이어 수 입력 : "; cin >> size;
if (size > 10 || size < 2)
cout << "다시 입력" << endl;
else
break;
}
//플레이어 동적할당
Player* player = new Player[size];
for (int i = 0; i < size; i++)
{
cout << i + 1 << "번째 입력 : ";
cin >> player[i].name;
player[i].money = 10000;
}
//카드 덱 생성
Card deck[20];
for (int i = 0; i < 20; i++)
{
deck[i].month = i % 10 + 1;
deck[i].shape = "月";
}
deck[0].shape = deck[2].shape = deck[7].shape = "光";
//반복 시작 전 필요한 변수 추가
int start = 0;
while (!start)
{
//덱 셔플
Shuffle(deck);
//카드 분배
for (int i = 0; i < size; i++)
{
totalprice += 500;
player[i].card[0] = deck[i];
player[i].card[1] = deck[i + 10];
player[i].money -= 500;
if (player[i].card[0].month > player[i].card[1].month)
{
Swap(player[i].card, 0, 1);
}
}
//족보 생성
MakeJokbo(size, player);
//승자 판별
int winner = 0;
int count = 0;
for (int i = 0; i < size; i++)
{
if (player[i].jokbo > winner)
{
winner = player[i].jokbo;
count = 1;
}
else if (player[i].jokbo == winner)
{
count++;
}
}
//상금 분배
for (int i = 0; i < size; i++)
{
if (winner == player[i].jokbo)
{
player[i].money += totalprice / count;
}
}
//본문 출력
PrintPlayer(size, player, winner);
//반복 여부
cout << "0. 계속 / 1. 나가기" << endl << "입력 : ";
cin >> start;
}
//동적 할당 해제
delete[] player;
return 0;
}
'코딩' 카테고리의 다른 글
블랙잭 (0) | 2022.11.10 |
---|---|
빙빙 돌아가는 회전 배열처럼... (0) | 2022.11.08 |
섯다 (0) | 2022.11.03 |
더블포인터 빙고 vs Computer (0) | 2022.11.01 |
더블포인터 빙고 (0) | 2022.11.01 |