코딩

섯다

찬이2 2022. 11. 3. 15:50

중간에 ==과 =의 어이없는 실수 때문에 한참을 애먹어서 완성까지 거의 10시간이 걸린 듯하다ㅠㅠ

입력하면서 점점 코드가 길어지니까 오류 한번 나면 어디서 나는지 찾는 게 쉽지 않았다;;

빌드하고 돌려보면서 느끼는 건데 삼팔광땡이 생각보다 잘 나온다. 이게 맞나?

#include<iostream>
#include<string>
#include<time.h>
using namespace std;

struct Player
{
	string name;
	int onecard;
	int twocard;
	int money = 10000;
	int result;
};

//카드 출력 시 ~"광" 유무 판별 함수
void CardPrint(int card)
{
	switch (card)
	{
	case 1:
		cout << card << "광" << "\t";
		break;
	case 3:
		cout << card << "광" << "\t";
		break;
	case 8:
		cout << card << "광" << "\t";
		break;
	default:
		cout << card << "\t";
		break;
	}
}

//결과값 출력 시 특정조합 판별 함수
void ResultPrint(int result, int onecard, int twocard)
{
	if (result < 10)
	{
		cout << result << "끗" << endl;
	}
	else if (result < 31)
	{
		cout << onecard << "땡" << endl;
	}
	else if (result == 32)
	{
		if (onecard < twocard)
		{
			cout << onecard << twocard << "광땡" << endl;
		}
		else
		{
			cout << twocard << onecard << "광땡" << endl;
		}
	}
	else
	{
		cout << "삼팔광땡" << endl;
	}
}

int main()
{
	srand(time(NULL));
	int size, input = 1;
	int card[10][2];
	int totalPrice;

	//카드 생성
	for (int y = 0; y < 2; y++)
	{
		for (int x = 0; x < 10; x++)
		{
			card[x][y] = x + 1;
		}
	}

	//플레이어 수 입력
	while (true)
	{
		cout << "플레이어 수를 입력해주세요" << endl << "입력 : ";
		cin >> size;
		//플레이어 수 예외처리
		if (size < 2 || size > 10)
			cout << "정해진 플레이어 수에 맞지 않습니다." << endl << "다시 입력해주세요." << endl;
		else
			break;
	}

	//입력한 플레이어 수를 바탕으로 플레이어들 이름 입력
	Player* players = new Player[size];
	for (int i = 0; i < size; i++)
	{
		cout << i + 1 << "번째 플레이어 이름 : ";
		cin >> players[i].name;
	}
	
	//입력된 플레이어 수를 바탕으로 판당 우승 시 받게될 상금저장
	totalPrice = 500 * size;

	while (input == 1)
	{
		int x = 0, y = 0;

		//카드 섞기
		for (int i = 0; i < 1000; i++)
		{
			int sour1 = rand() % 10;
			int sour2 = rand() % 2;
			int dest1 = rand() % 10;
			int dest2 = rand() % 2;

			int temp = card[sour1][sour2];
			card[sour1][sour2] = card[dest1][dest2];
			card[dest1][dest2] = temp;
		}

		//카드 분배 및 판돈내기
		for (int i = 0; i < size; i++)
		{
			if (x == 10)
			{
				x = 0;
				y++;
			}
			players[i].onecard = card[x++][y];
			players[i].twocard = card[x++][y];
			players[i].money -= 500;
		}

		//카드보고 결과값(result) 계산
		for (int i = 0; i < size; i++)
		{
			int Onecard = players[i].onecard;
			int Twocard = players[i].twocard;
			//끗 값
			players[i].result = (Onecard + Twocard) % 10;
			
			//땡 값
			if (Onecard == Twocard)
				//같은 땡 중에서 높은값 계산을 위한 식
				players[i].result = 21 + Onecard;

			//광땡 값
			if (Onecard == 1)
			{
				if (Twocard == 3 || Twocard == 8)
					players[i].result = 32;
			}
			else if(Twocard == 1)
			{
				if (Onecard == 3 || Onecard == 8)
					players[i].result = 32;
			}

			//삼팔광땡 값
			if (Onecard == 3)
			{
				if (Twocard == 8)
					players[i].result = 33;
			}
			else if (Twocard == 3)
			{
				if (Onecard == 8)
					players[i].result = 33;
			}
		}

		//나온 Player 결과값 중에서 가장 큰 값 winner변수에 저장
		int winner = 0;
		for (int i = 0; i < size; i++)
		{
			if (winner < players[i].result)
				winner = players[i].result;
		}

		//추출한 winner값으로 승자 출력
		int count = 0;
		for (int i = 0; i < size; i++)
		{
			if (winner == players[i].result)
			{
				cout << players[i].name << "\t";
				count++;
			}
		}
		//승자 수(count값)에 따라서 상금 분배
		for (int i = 0; i < size; i++)
		{
			if (winner == players[i].result)
				players[i].money += totalPrice / count;
		}
		cout << "승리" << endl;

		//Player들의 이름 카드 돈 결과값 출력부분
		for (int i = 0; i < size; i++)
		{
			cout << players[i].name << "\t";
			CardPrint(players[i].onecard);  
			CardPrint(players[i].twocard);
			cout << players[i].money << "\t";
			ResultPrint(players[i].result, players[i].onecard, players[i].twocard);
		}

		//계속 진행유무 확인
		cout << "계속 진행하시곘습니까?" << endl << "1.예 / 2.아니오" << endl << "입력 : ";
		cin >> input;
	}

	//동적 할당 해제
	delete[] players;
}