연습문제

C언어 카드게임

오군_ 2023. 5. 12. 18:00
반응형
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*
월남뽕
1. 카드는 52장
2. 하트 다이아 스페이드 클로버 // 문양 4개
3. A (1)/ 2~10 / J Q K ( 11, 12, 13)

게임 룰
딜러(PC)가2개의 카드를 랜덤하게 공개.
보여줄때는 문양까지 나와야한다.

플레이어가 카드 오픈차례때 딜러가 뽑은 카드 두개 사이의 수가 나와야 이긴다.
만약 딜러가 뽑은 카드 두개중 하나와 크기가 같더라도 패배
예시
하트 J 11 / 다이아 K 12 / 클로버 12    //패배
하트 1 / 다이아 2 / 하트 3             // 승리

배팅 시스템이 있다. / 소지금 배팅액
승리는 베팅금 두배
실패는 베팅금 차감

베팅 후
포기시 베팅금 1/2배 차감

한 게임에 쓴 카드 3장은 덱에서 버린다.
남은카드가 3장이 안되거나 or 탕진 시 게임 종료
턴수 표기 / 소지금 표기
*/
void BetweenTwoCardsGame();
void DeckInit();
void Shuffle();
int SameCardShuffle();
void CardPrint();
void PlayerBetting();
void PlayerChoiceCard();
void PlayerCardShuffle();

// 플레이어
int playerMoney = 10000;
int bettingMoney = 0;
int playerCard = 0;
int dealChoice = 0;

// 카드 덱
int hart[13];		// 1~13
int diamond[13];
int spade[13];
int clover[13];

// 셔플 덱
int previousCard = 0;
int nextCard = 0;

int deckShuffle[52] = { 0 };
int deckCount = 52;
int gameCount = 1;


int main()
{
	printf("게임 시작! \n");
	BetweenTwoCardsGame();
	return 0;
}

// 카드게임
void BetweenTwoCardsGame()
{
	DeckInit();			// 덱 설정
	while (deckCount > 2 && playerMoney > 0)
	{
		printf("========================\n");
		printf("%d번째 판\n", gameCount);
		PlayerBetting();	// 배팅액 설정
		Shuffle();				// 카드 섞기
		PlayerChoiceCard();		// 플레이어 카드 선택
		deckCount = deckCount - 3;		// 판수 조절
		gameCount++;
		printf("남은 패수 :%d\n", deckCount);
	}

}

// 덱 설정
void DeckInit()
{
	// 카드 값 설정 
	for (int i = 0; i < 13; i++)	// 		1번째 카드세트 : 1 ~ 13카드설정
	{
		hart[i] = ((i + 1) + (13*0));
	}
	for (int i = 0; i < 13; i++)	// 		2번째 카드세트 : 14 ~ 27카드설정
	{
		diamond[i] = ((i + 1) + (13 * 1));
	}
	for (int i = 0; i < 13; i++)	// 		3번째 카드세트 : 27 ~ 39카드설정
	{
		spade[i] = ((i + 1) +(13 * 2));
	}
	for (int i = 0; i < 13; i++)	// 		4번째 카드세트 : 40 ~ 52카드설정
	{
		clover[i] = ((i + 1) + (13 * 3));
	}
}


// 카드 섞기
void Shuffle()
{
	// 1~52 카드 셔플
	srand((unsigned int)time(NULL));
	int cardShuffle1 = rand() % 52 + 1;
	int cardShuffle2 = rand() % 52 + 1;

	// 뽑은 카드 뽑았던 카드 비교  재귀함수로
	for (int i = 0; i < 52; i++)
	{
		cardShuffle1 == deckShuffle[i] ? SameCardShuffle(cardShuffle1) : cardShuffle1;
	}

	// 같은 카드 뽑기 방지
	while (cardShuffle1 == cardShuffle2)
	{
		cardShuffle2 = rand() % 52 + 1;
	}
	// 뽑은 카드 뽑았던 카드 비교  재귀함수로
	for (int i = 0; i < 52; i++)
	{
		cardShuffle2 == deckShuffle[i] ? SameCardShuffle(cardShuffle2) : cardShuffle2;
	}

	// 뽑았던 카드 버리기 / deckShuffle[i] 에 값을 넣어서 두번 다시 못뽑게 하기용
	for (int i = 0; i < 52; i++)
	{
		if (deckShuffle[i] != cardShuffle1 && deckShuffle[i] ==0)
		{
			deckShuffle[i] = cardShuffle1;
			previousCard = cardShuffle1;
			cardShuffle1 = 0;	// 이걸 안하면 문자가 하나 안나옴
			continue;
		}

		if (deckShuffle[i] != cardShuffle2 && deckShuffle[i] == 0)
		{
			deckShuffle[i] = cardShuffle2;
			nextCard = cardShuffle2;
			cardShuffle2 = 0;
			break;
		}
	}

	// 카드 크기 비교 (출력 순서대로 하기 위해서)  // 출력부분
	if ((previousCard %13) < (nextCard %13))
	{
		CardPrint(previousCard);
		CardPrint(nextCard);
		printf("\n");
	}
	else if ((previousCard % 13) > (nextCard % 13))
	{
		CardPrint(nextCard);
		CardPrint(previousCard);
		printf("\n");
	}

}

// 뽑았던 카드와 비교해 같으면 다시 셔플
int SameCardShuffle(int cardShuffle)
{
	// 제한해주는 부분
	if (cardShuffle == 53)
		cardShuffle = 1;
	for (int i = 0; i < 52; i++) 
	{
		if (deckShuffle[i] == 0)
			continue;
		cardShuffle == deckShuffle[i] ? SameCardShuffle(cardShuffle + 1) : cardShuffle;
	}
	return cardShuffle;
}

// 카드 출력
void CardPrint(int cardNum)
{
	// 문양부분 출력 
	if (cardNum > 0 && cardNum < 14)
		printf("|♥");
	else if (cardNum >= 14 && cardNum < 27)
		printf("|◆");
	else if (cardNum >= 27 && cardNum < 40)
		printf("|♠");
	else if (cardNum >= 40 && cardNum < 53)
		printf("|♣");

	// 숫자부분 출력
	switch ((cardNum % 13) + 1)
	{
		case 1:
			printf("A| ");
			break;
		case 11:
			printf("J| ");
			break;
		case 12:
			printf("Q| ");
			break;
		case 13:
			printf("K| ");
			break;
		default :
			printf("%d| ", (cardNum % 13) + 1);		// 숫자출력구간
			break;
	}
}

void PlayerBetting()
{
	// 배팅액 설정
	printf("배팅액을 설정해 주세요 : ");
	scanf("%d", &bettingMoney);
	while (bettingMoney > playerMoney)
	{
		printf("------------------------\n");
		printf("배팅액이 소지금보다 큽니다 \n");
		printf("배팅액을 재설정해 주세요 : ");
		scanf("%d", &bettingMoney);
	}
	while (bettingMoney <= 0)
	{
		printf("------------------------\n");
		printf("배팅액을 제대로 입력해주세요 \n");
		printf("배팅액을 재설정해 주세요 : ");
		scanf("%d", &bettingMoney);
	}
}

// 플레이어 선택
void PlayerChoiceCard()
{
	printf("플레이어 선택시간 콜:1 / 다이 :2  \n");
	scanf("%d", &dealChoice);

	while (dealChoice != 1 && dealChoice != 2)
	{
		printf("------------------------\n");
		printf("재선택 콜:1 / 다이 :2  \n");
		scanf("%d", &dealChoice);
	}

	if (dealChoice == 2)
	{
		printf("소지금 차감 : 배팅액의 절반\n");
		playerMoney -= bettingMoney / 2;
		printf("플레이어 현재 소지금 : %d\n", playerMoney);
		dealChoice = 0;
		return;
	}

	// 플레이어 카드 셔플
	PlayerCardShuffle();

	// 카드 크기 비교 (출력 순서대로 하기 위해서)  // 출력부분
	if ((previousCard % 13) < (nextCard % 13))
	{
		CardPrint(previousCard);
		CardPrint(playerCard);
		CardPrint(nextCard);
		printf("\n");
	}
	else if ((previousCard % 13) > (nextCard % 13))
	{
		int temp = previousCard;
		previousCard = nextCard;
		nextCard = temp;

		CardPrint(previousCard);
		CardPrint(playerCard);
		CardPrint(nextCard);
		printf("\n");
	}

	// 승리
	if ((playerCard % 13 > previousCard % 13) && 
		(playerCard % 13 < nextCard % 13))
	{
		printf("플레이어 승리!!\n");
		printf("배팅액 두배 획득! : %d\n", bettingMoney * 2);
		playerMoney += bettingMoney * 2;
		printf("플레이어 현재 소지금 : %d\n", playerMoney);
	}
	// 패배
	else if(playerCard % 13 <= previousCard % 13)
	{
		printf("플레이어 패배!!\n");
		printf("배팅액 차감! : %d\n", bettingMoney);
		playerMoney -= bettingMoney;
		printf("플레이어 현재 소지금 : %d\n", playerMoney);

		if (playerMoney <= 0)
		{
			printf("플레이어 파산!\n");
			printf("게임 종료!\n");
		}
	}
	else if (playerCard % 13 >= nextCard % 13)
	{
		printf("플레이어 패배!!\n");
		printf("배팅액 차감! : %d\n", bettingMoney);
		playerMoney -= bettingMoney;
		printf("플레이어 현재 소지금 : %d\n", playerMoney);

		if (playerMoney <= 0)
		{
			printf("플레이어 파산!\n");
			printf("게임 종료!\n");
		}
	}
}

// 플레이어 카드 셔플
void PlayerCardShuffle()
{
	srand((unsigned int)time(NULL));
	playerCard = rand() % 52 + 1;

	for (int i = 0; i < 53; i++)
	{
		if (playerCard == deckShuffle[i])
			playerCard = rand() % 52 + 1;
	}
	// 플레이어 덱 사용 후 버리기
	for (int i = 0; i < 53; i++)
	{
		if (deckShuffle[i] != playerCard && deckShuffle[i] == 0)
		{
			deckShuffle[i] = playerCard;
			break;
		}
	}
}

 

반응형

 

반응형