본문 바로가기

코딩

Low High Seven 게임

기존의 월남뽕 게임에서 조금 변환한 느낌인데, 다른 점이라면 11, 12, 13 출력 시 J, Q, K로 나온다는 점이다.

숫자를 문자로 바꿔서 출력시켜야하는 부분에서 정말 많은 고민이 있었다...ㅠㅠ

#include<iostream>
#include<iomanip> //setw를 사용하기 위해 선언
#include<time.h>
using namespace std;

int main() {
	srand(time(NULL));
	int deck[52];
	int money = 10000, betting, count = 0, input;
	
	//카드 덱 만들기
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 13; j++)
		{
			deck[i * 13 + j] = j + 1;
		}
	}
	
restart: //재시작 시, 코드의 시작지점
	//카드 섞어주기(셔플)
	for (int i = 0; i < 1000; i++)
	{
		int num1 = rand() % 52;
		int num2 = rand() % 52;
		int temp = deck[num1];
		deck[num1] = deck[num2];
		deck[num2] = temp;
	}
	
	cout << "~~~~로우하이세븐 게임~~~~" << endl <<setw(3);
	while (true)
	{		
		//뽑은 6장의 카드 출력하기(본문)
		for (int i = count; i < (count + 5); i++)
		{			
			switch (deck[i]) //11,12,13일 때 문자, 아니면 숫자
			{
			case 11:
				cout << "J" << setw(4);
				break;
			case 12:
				cout << "Q" << setw(4);
				break;
			case 13:
				cout << "K" << setw(4);
				break;
			default:
				cout << deck[i] << setw(4);
				break;
			}
		}
		cout << "??" << endl; //히든카드 숨기기
		cout << "내 소지금 : " << money << endl;
		cout << "하이(1), 로우(2), 세븐(3)" << endl << "당신의 선택은? : ";
		cin >> input;
		cout << "배팅금을 입력하세요 : ";
		cin >> betting;

		//승패 결과처리
		switch (input)
		{
		case 1: //하이 선택 시
			if (deck[count + 5] > 7)
			{
				cout << "히든카드 : " << deck[count + 5] << endl;
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "히든카드 : " << deck[count + 5] << endl;
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}				
		case 2: //로우 선택 시
			if (deck[count + 5] < 7)
			{
				cout << "히든카드 : " << deck[count + 5] << endl;
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "히든카드 : " << deck[count + 5] << endl;
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		case 3: //세븐 선택 시
			if (deck[count + 5] == 7)
			{
				cout << "히든카드 : " << deck[count + 5] << endl;
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "히든카드 : " << deck[count + 5] << endl;
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		default: //그외의 번호 입력 시
			cout << "다시 입력하세요" << endl << endl;
			continue;
		}

		count += 6; //반복할 때마다 6씩 증가

		//종료조건 확인
		if (count > 47 || money <= 0)
		{
			cout << "게임 끝" << endl << "1.다시시작" << endl << "2.그만하기" << endl << "입력 : ";
			cin >> input;

			if (input == 1) //다시시작 선택 시
			{
				count = 0;
				money = 10000;
				cout << endl;
				goto restart;
			}
			else //그외 선택시
				return 0;
		}
	}	
}

2.0 ver Patch Note

배팅금액 예외처리 추가(최저 배팅금 설정 및 소지금 초과배팅 제거)

#include <string> 및 구조체 추가

트럼프카드 문양 추가

setw를 \t로 변환(#include <iomanip> 제거)

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

struct Deck
{
	string shape;
	int number;
};

int main() {
	srand(time(NULL));
	Deck card[52];
	string shape[4];
	int money = 10000, betting, count = 0, input;

	//문양저장
	for (int i = 0; i < 4; i++)
	{
		switch (i)
		{
		case 0:
			shape[i] = "♠";
			break;
		case 1:
			shape[i] = "♥";
			break;
		case 2:
			shape[i] = "♣";
			break;
		case 3:
			shape[i] = "◆";
			break;
		}
	}	

	//카드 덱 만들기
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 13; j++)
		{
			card[i * 13 + j].shape = shape[i];
			card[i * 13 + j].number = j + 1;
		}
	}

restart: //재시작 시, 코드의 시작지점
	//카드 섞어주기
	for (int i = 0; i < 1000; i++)
	{
		int num1 = rand() % 52;
		int num2 = rand() % 52;
		//문양섞기
		string temp1 = card[num1].shape;
		card[num1].shape = card[num2].shape;
		card[num2].shape = temp1;
		//숫자섞기
		int temp2 = card[num1].number;
		card[num1].number = card[num2].number;
		card[num2].number = temp2;
	}	

	cout << "~~~~로우하이세븐 게임~~~~" << endl;
	while (true)
	{
		//뽑은 6장의 카드 출력하기(본문)
		for (int i = count; i < (count + 5); i++)
		{
			switch (card[i].number) //11,12,13,1일 때 문자, 아니면 숫자
			{
			case 11:
				cout << "J" << card[i].shape << "\t";
				break;
			case 12:
				cout << "Q" << card[i].shape << "\t";
				break;
			case 13:
				cout << "K" << card[i].shape << "\t";
				break;
			case 1:
				cout << "A" << card[i].shape << "\t";
				break;
			default:
				cout << card[i].number << card[i].shape << "\t";
				break;
			}
		}
		cout << "??" << endl; //히든카드 숨기기
		cout << "내 소지금 : " << money << endl;
		cout << "하이(1), 로우(2), 세븐(3)" << endl << "당신의 선택은? : ";
		cin >> input;
		cout << "배팅금을 입력하세요 : ";
		cin >> betting;

		//배팅금 입력 예외처리
		if (betting < 1000) {
			cout << "1000원 이상 배팅해주세요." << endl << endl;
			continue;
		}
		else if (betting > money) {
			cout << "소지금에 맞게 배팅해주세요." << endl << endl;
			continue;
		}

		//승패 결과처리
		switch (input)
		{
		case 1: //하이 선택 시
			if (card[count + 5].number > 7)
			{
				cout << "히든카드 : " << card[count + 5].number << card[count + 5].shape << endl;
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "히든카드 : " << card[count + 5].number << card[count + 5].shape << endl;
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		case 2: //로우 선택 시
			if (card[count + 5].number < 7)
			{
				cout << "히든카드 : " << card[count + 5].number << card[count + 5].shape << endl;
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "히든카드 : " << card[count + 5].number << card[count + 5].shape << endl;
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		case 3: //세븐 선택 시
			if (card[count + 5].number == 7)
			{
				cout << "히든카드 : " << card[count + 5].number << card[count + 5].shape << endl;
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "히든카드 : " << card[count + 5].number << card[count + 5].shape << endl;
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		default: //그외의 번호 입력 시
			cout << "다시 입력하세요" << endl << endl;
			continue;
		}

		count += 6; //반복할 때마다 6씩 증가

		//종료조건 확인
		if (count > 47 || money <= 0)
		{
			cout << "게임 끝" << endl << "1.다시시작" << endl << "2.그만하기" << endl << "입력 : ";
			cin >> input;

			if (input == 1) //다시시작 선택 시
			{
				count = 0;
				money = 10000;
				cout << endl;
				goto restart;
			}
			else //그외 선택시
				return 0;
		}
	}
}

3.0 ver Patch Note

히든카드 문양출력이 안되던 부분 수정

반복해서 사용되는 코드 함수로 만들어 코드 간편화

enum을 사용하여 코드 가독성 향상

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

struct Deck
{
	string shape;
	int number;
};

enum NUM
{
	A = 1,
	J = 11,
	Q,
	K
};

enum SHAPE
{
	SPADE,
	HEART,
	CLOVER,	
	DIA
};

Deck card[52];

void Shuffle()
{
	for (int i = 0; i < 1000; i++)
	{
		int num1 = rand() % 52;
		int num2 = rand() % 52;
		Deck temp = card[num1];
		card[num1] = card[num2];
		card[num2] = temp;
	}
}

void Print(int cardIndex)
{	
	switch (card[cardIndex].number) //11,12,13,1일 때 문자, 아니면 숫자
	{
	case J:
		cout << "J" << card[cardIndex].shape << "\t";
		break;
	case Q:
		cout << "Q" << card[cardIndex].shape << "\t";
		break;
	case K:
		cout << "K" << card[cardIndex].shape << "\t";
		break;
	case A:
		cout << "A" << card[cardIndex].shape << "\t";
		break;
	default:
		cout << card[cardIndex].number << card[cardIndex].shape << "\t";
		break;
	}
	
}

int main() {
	srand(time(NULL));	
	int money = 10000, betting, count = 0, input;

	//덱 초기화
	for (int i = 0; i < 52; i++)
	{
		card[i].number = i % 13 + 1;

		switch (i / 13)
		{
		case SPADE:
			card[i].shape = "♠";
			break;
		case HEART:
			card[i].shape = "♥";
			break;
		case CLOVER:
			card[i].shape = "♣";
			break;
		case DIA:
			card[i].shape = "◆";
			break;
		}
	}	

restart: //재시작 시, 코드의 시작지점
	//카드 섞어주기
	Shuffle();

	cout << "~~~~로우하이세븐 게임~~~~" << endl;
	while (true)
	{
		//뽑은 6장의 카드 출력하기(본문)
		for (int i = 0; i < 5; i++)
		{
			Print(i + count);
		}
		
		cout << "??" << endl; //히든카드 숨기기
		cout << "내 소지금 : " << money << endl;
		cout << "하이(1), 로우(2), 세븐(3)" << endl << "당신의 선택은? : ";
		cin >> input;
		cout << "배팅금을 입력하세요 : ";
		cin >> betting;

		//배팅금 입력 예외처리
		if (betting < 1000 || betting > money) {
			cout << "다시 입력해주세요." << endl << endl;
			continue;
		}		


		cout << "히든카드 : ";
		Print(5 + count);

		//승패 결과처리
		switch (input)
		{
		case 1: //하이 선택 시
			if (card[count + 5].number > 7)
			{				
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{				
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		case 2: //로우 선택 시
			if (card[count + 5].number < 7)
			{
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		case 3: //세븐 선택 시
			if (card[count + 5].number == 7)
			{
				cout << "이겼다." << endl << endl;
				money += betting;
				break;
			}
			else
			{
				cout << "졌다." << endl << endl;
				money -= betting;
				break;
			}
		default: //그외의 번호 입력 시
			cout << "다시 입력하세요" << endl << endl;
			continue;
		}

		count += 6; //반복할 때마다 6씩 증가

		//종료조건 확인
		if (count > 47 || money <= 0)
		{
			cout << "게임 끝" << endl << "1.다시시작" << endl << "2.그만하기" << endl << "입력 : ";
			cin >> input;

			if (input == 1) //다시시작 선택 시
			{
				count = 0;
				money = 10000;
				cout << endl;
				goto restart;
			}
			else //그외 선택시
				return 0;
		}
	}
}

'코딩' 카테고리의 다른 글

빙고 게임  (0) 2022.10.25
슬라이드 게임  (0) 2022.10.24
월남뽕 게임  (2) 2022.10.18
별찍기 / 숫자야구게임  (0) 2022.10.18
로또번호 자동 생성기  (2) 2022.10.15