[C++] 트럼프 카드 게임 구현
2024. 2. 26. 18:50ㆍC++/보드게임 구현
지난번에 작성한 섯다와 유사한 난이도와 조건이었으나
제작 소요 시간이 확연하게 줄어든 것을 보아 저번의 연습이 나의 실력을 한단계 올려준 것 같다.
소요 시간 : 2시간 30분
게임 : 임의로 지정된 카드의 사이 숫자 맞추기
[규칙]
1. 총 52장의 트럼프 카드
2. 카드의 종류 : 스페이드, 클로버, 하트, 다이아
3. 카드의 숫자 범위 : 1~13
카드 표시법
1 : A
11 : J
12 : Q
13 : K
승리 조건 : 임의의 카드 2장 사이의 숫자 카드를 제출
패배 조건 : 범위를 벗어나거나 같은 숫자의 카드를 제출하면 패배
추가 조건 1 : 한번 등장한 카드는 다음 게임에 등장하지 않음
추가 조건 2 : 플레이어가 승리하면 베팅 금액의 2배를 얻고 패배하면 2배를 잃는다.
종료 조건 1 : 모든 카드 패를 소진
종료 조건 2 : 플레이어의 소지금이 0 이하가 되면 종료
더보기
#include<iostream>
void GAME_END(); //모든 카드를 소진할 시 출력
void GAME_OVER(); //소지금이 0이하가 되면 출력
int GAME_WIN(int playerMoney, int inputMoney); //게임 승리 시 이벤트
int GAME_Lose(int playerMoney, int inputMoney); //게임 패배 시 이벤트
int SAME(int Card[]); //임의로 생성된 두개의 카드 비교
void CARD_PRINT_FIGURE(int i); //카드 문양 출력1
void CARD_PRINT_FIGURE(int CardFigure[], int i); //카드 문양 출력2
void CARD_PRINT_NUMBER(int CardNumber[], int i); //카드 숫자 출력
int Card[4][13]; // 52장의 트럼프 카드
int main()
{
srand(time(NULL)); //난수값 초기화
int playerMoney = 1000; //소지금
int turnCount = 0; //턴제 카운트
//카드 숫자 대입
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 13; k++)
{
Card[i][k] = k+1;
}
}
while (true)
{
int CardFigure[2]; // 카드 문양
int CardNumber[2]; // 카드 숫자
for (int i = 0; i < 2; i++)
{
CardFigure[i] = rand()%4; //0~3 사이의 값
CardNumber[i] = rand()%13; //0~13 사이의 값
}
bool SameFigure = SAME(CardFigure); //두장의 카드 문양이 서로 같은가?
bool SameNumber = SAME(CardNumber); //두장의 카드 숫자가 서로 같은가?
int MiniNum; //최솟값
int MaxNum; //최대값
//두장의 카드 숫자 크기 비교
if (CardNumber[0] >= CardNumber[1])
{
MiniNum = CardNumber[1];
MaxNum = CardNumber[0];
}
else
{
MiniNum = CardNumber[0];
MaxNum = CardNumber[1];
}
//두장의 카드가 연이은 숫자로 이루어져있는가?
bool StraightNumber = (MaxNum - MiniNum) <= 1;
//두장의 카드가 같은 카드이거나 연이은 숫자로 이루어져있으면 다시 카드를 설정한다.
if ((SameFigure && SameNumber)||StraightNumber) continue;
//continue : while()문의 처음으로 이동시킨다.
int ComputerCard[2]; //컴퓨터의 카드
bool isLoop=false; //while()문으로 루프할 것인가?
for (int i = 0; i < 2; i++)
{
//컴퓨터의 카드 2장 설정
ComputerCard[i] = Card[CardFigure[i]][CardNumber[i]];
//이미 등장했던 카드라면 다시 카드를 설정
if (ComputerCard[i] == 0)
{
isLoop = true;
break;
}
else
{
isLoop = false;
}
}
if (isLoop)
{
continue;
}
std::cout << std::endl;
std::cout << "컴퓨터의 카드가 정해졌습니다."<<std::endl;
std::cout << std::endl;
turnCount++;
std::cout << "================================================" << std::endl;
std::cout << turnCount << "번째 게임" << std::endl;
std::cout << "================================================" << std::endl;
std::cout << std::endl;
for (int i = 0; i < 2; i++)
{
std::cout << i + 1 << "번째 카드 :";
CARD_PRINT_FIGURE(CardFigure, i); //카드 문양 출력
CARD_PRINT_NUMBER(CardNumber, i); //카드 숫자 출력
std::cout<<std::endl;
}
std::cout << std::endl;
std::cout << "================================================" << std::endl;
std::cout << "현재 소지금 : ";
std::cout << playerMoney << std::endl;
std::cout << "얼마를 베팅하시겠습니까? :";
int inputMoney;
while (true)
{
std::cin >> inputMoney;
//소지금보다 높은 숫자를 입력하거나 0보다 작으면 다시 입력
if (inputMoney>playerMoney)
{
std::cout << "소지하신 금액보다 많습니다." << std::endl;
std::cout << "다시 입력해 주세요. : ";
}
else if(inputMoney < 0)
{
std::cout << "베팅하신 금액이 비정상적입니다." << std::endl;
std::cout << "다시 입력해 주세요. : ";
}
else break;
}
std::cout << std::endl;
std::cout << "당신의 카드 숫자를 선택해 주세요." << std::endl;;
std::cout << "================================================" << std::endl;
std::cout << std::endl;
std::cout << "선택 가능 카드(0은 선택 불가)" << std::endl;;
std::cout << std::endl;
for (int i = 0; i < 4; i++)
{
CARD_PRINT_FIGURE(i); //카드 문양 출력
for (int k=0; k<13;k++)
{
switch (Card[i][k]) //카드 숫자 출력
{
case 1:
std::cout << "A ";
break;
case 11:
std::cout << "J ";
break;
case 12:
std::cout << "Q ";
break;
case 13:
std::cout << "K ";
break;
default:
std::cout << Card[i][k] << " ";
break;
}
}
std::cout << std::endl;
}
std::cout << "================================================" << std::endl;
int inputFigure;
int inputNumber;
while (true)
{
//카드 문양 입력
std::cout << "모양 (1:다이아 2:하트 3:클로버 4:스페이드) : ";
std::cin >> inputFigure;
if (inputFigure < 1 || inputFigure>4)
{
std::cout << "잘못된 입력값입니다." << std::endl;
std::cout << "다시 입력해 주세요." << std::endl;
continue;
}
//카드 숫자 입력
std::cout << "숫자 (범위 : 1~13) : ";
std::cin >> inputNumber;
bool emptyCard = (Card[inputFigure - 1][inputNumber - 1] == 0);
//입력한 카드가 이미 등장했던 카드인지 확인
bool rangeNum = inputNumber < 1 || inputNumber>13;
//카드의 숫자 범위가 정상인지 확인
if (emptyCard || rangeNum)
{
std::cout << "잘못된 입력값입니다." << std::endl;
std::cout << "다시 입력해 주세요." << std::endl;
continue;
}
break;
}
for (int i = 0; i < 2; i++)
{
Card[CardFigure[i]][CardNumber[i]] = 0;
}
Card[inputFigure - 1][inputNumber - 1] = 0;
std::cout << "================================================" << std::endl;
bool Win_1 = inputNumber > MiniNum + 1;
bool Win_2 = inputNumber < MaxNum+1;
//승리 조건 1 : 입력한 숫자가 최솟값보다 크다.
//승리 조건 2 : 입력한 숫자가 최대값보다 작다.
if (Win_1 && Win_2)
{
//만족 시 승리 이벤트 출력
playerMoney = GAME_WIN(playerMoney, inputMoney);
}
else
{
//불만족 시 패배 이벤트 출력
playerMoney = GAME_Lose(playerMoney, inputMoney);
}
if (playerMoney<=0)
{
//소지금이 0 이하이면 게임 오버 이벤트 출력
GAME_OVER();
break;
}
int checkGameEnd = 0;
//카드를 전부 사용한 것인지 확인
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 13; k++)
{
checkGameEnd += Card[i][k];
}
}
//카드를 전부 사용했을 경우 게임 종료 이벤트 출력
if (checkGameEnd==0)
{
GAME_END();
break;
}
}
}
//승리 시 베팅한 금액 +200%
int GAME_WIN(int playerMoney,int inputMoney)
{
std::cout << "당신의 승리입니다." << std::endl;
std::cout << "베팅금 " << inputMoney << "의 2배를 얻습니다." << std::endl;
playerMoney += (inputMoney * 2);
std::cout << std::endl;
std::cout << "현재 소지금 : ";
std::cout << playerMoney << std::endl;
for (int i = 0; i < 3; i++)
{
std::cout << std::endl;
}
return playerMoney;
}
//패배 시 베팅한 금액 -200%
int GAME_Lose(int playerMoney, int inputMoney)
{
std::cout << "당신의 패배입니다." << std::endl;
std::cout << "베팅금 " << inputMoney << "의 2배를 잃습니다." << std::endl;
playerMoney -= (inputMoney * 2);
std::cout << std::endl;
std::cout << "현재 소지금 : ";
std::cout << playerMoney << std::endl;
return playerMoney;
}
//소지금이 0이하일 경우 게임 오버 이벤트
void GAME_OVER()
{
std::cout << "당신은 무일푼이 되어 쫓겨나갔습니다." << std::endl;
std::cout << "Game Over" << std::endl;
}
//카드를 모두 소진 시 게임 종료 이벤트
void GAME_END()
{
std::cout << "카드가 모두 소진되었습니다." << std::endl;
std::cout << "게임이 종료됩니다." << std::endl;
}
//두장의 카드가 같은 카드를 지목하고 있는가?
int SAME(int Card[])
{
bool isSame = (Card[0] == Card[1]);
return isSame;
}
//카드 문양 출력 1
void CARD_PRINT_FIGURE(int i)
{
switch (i)
{
case 0:
std::cout << "다이아 ";
break;
case 1:
std::cout << "하트 ";
break;
case 2:
std::cout << "클로버 ";
break;
case 3:
std::cout << "스페이드 ";
break;
default:
break;
}
}
//카드 문양 출력 2
void CARD_PRINT_FIGURE(int CardFigure[], int i)
{
switch (CardFigure[i])
{
case 0:
std::cout << "다이아 ";
break;
case 1:
std::cout << "하트 ";
break;
case 2:
std::cout << "클로버 ";
break;
case 3:
std::cout << "스페이드 ";
break;
default:
break;
}
}
//카드 숫자 출력
void CARD_PRINT_NUMBER(int CardNumber[], int i)
{
switch (CardNumber[i])
{
case 0:
std::cout << "A";
break;
case 10:
std::cout << "J";
break;
case 11:
std::cout << "Q";
break;
case 12:
std::cout << "K";
break;
default:
std::cout << CardNumber[i] + 1;
break;
}
}
추가 설명
임의로 컴퓨터의 카드가 설정되면 0의 값을 가지도록 설정,
이 덕분에 카드의 값이 0이면 이미 등장한 카드라고 파악할 수 있음.
그러나
플레이어가 카드를 선택할 수 있도록 도와주는 [선택 카드 판]은 임의로 정해진 컴퓨터의 카드들에게 영향을 받기 쉬워,
컴퓨터의 카드 값을 0으로 설정하는 작업은 플레이어가 카드를 선택한 이후에
플레이어의 카드까지 함께 0을 대입 처리한다.
카드 문양, 숫자 출력은 재사용될 수도 있으니 함수로 제작하였다.
'C++ > 보드게임 구현' 카테고리의 다른 글
[C++] 빙고 게임 코드 재구성 (2024_03_01) (0) | 2024.03.01 |
---|---|
[C++] 빙고 게임 구현 (2024_02_28) (0) | 2024.03.01 |
[C++] 트럼프 카드 리팩토링 (0) | 2024.02.27 |
[C++] 섯다 코딩 리팩토링 (1) | 2024.02.27 |
[C++] 섯다 텍스트 게임 구현 (0) | 2024.02.24 |