본문 바로가기

코딩

섯다 2.0 ver

앞서 만들었던 섯다에서 더 많은 족보 추가

열거형(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