[每日一题]14:用54张不同的扑克牌构成牌堆,发给3个玩家。

题目

  • 声明一个扑克牌类,拥有方法:传入花色和点数生成扑克牌、打印扑克牌。
  • 声明一个玩家类,每人拥有18张扑克牌。拥有方法:增加手牌(摸牌)、展示手牌。

用54张不同的扑克牌构成牌堆,发给3个玩家。手牌要求降序排序展示

注意

  • 发牌的时候,牌不能重复派发(需要将派发过的牌置为无效牌)

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
using namespace std;

enum {
	spades,	//黑桃
	hearts,	//红桃
	clubs,	//梅花
	diamonds,//方片
	joker,	//大小王
};

class Poker {
	char m_type;
	int m_point;
public:
	//初始化函数的正规写法
	Poker() : 
		m_type(0), 
		m_point(0) 
	{
	}

	//制作扑克
	void makePoker(char type, int point) {
		m_type = type ;
		m_point = point;

		if (m_type == joker)
		{
			m_point += 13;
		}
	}

	//打印扑克
	void outputPoker() {
		const char *type[5] = { "黑桃", "红桃", "梅花", "方片", "" };
		const char *point[16] = { "", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "小王", "大王" };
		
		printf("%s%s", type[m_type], point[m_point]);
	}

	//设置缺省参数
	bool cmppoker(Poker tmp) {
		return (m_point < tmp.m_point) || (m_point == tmp.m_point && m_type < tmp.m_type);
	}

	//扑克牌是有效的
	bool isEff() {
		if (m_type == 4 && (m_point == 14 || m_point == 15)) {
			return true;
		}
		if ((unsigned char)m_type > 3 || (unsigned int)m_point - 1 > 13) {
			return false;
		}
		return true;
	}
};

class Player {
	Poker m_HandCard[18];
	int m_size;
public:
	//初始化函数的另一种写法
	Player() {
		m_size = 0;
	}

	//玩家得到一张扑克,并将其插入自己已有的手牌中
	void getCard(Poker newCard) {
		Poker tmp = newCard;
		int i;
		for (i = m_size; i > 0 && m_HandCard[i - 1].cmppoker(tmp); i--) {
			m_HandCard[i] = m_HandCard[i - 1];
		}
		m_HandCard[i] = newCard;
		m_size++;
	}

	//名牌
	void showCard() {
		for (auto& i : m_HandCard) {
			i.outputPoker();
			putchar(' ');
		}
		putchar('\n');
	}
};

//设置随机数,随机发牌
//为了避免随机多次,却不能取到有效牌,将其设置为如果无效牌则+1,这样最多循环54次
int randnum(Poker * cardHeap) {
	int tmp = rand() % 54;
	while (1) {
		if(cardHeap[tmp].isEff()){
			return tmp;
		}
		else {
			tmp++;
			if (tmp == 54) {
				tmp = 0;
			}
		}

	}
}

int main() {
	Poker tmp[54];//牌堆
	int j = 0;
	Player ayi;
	Player laoye;
	Player miao;

	for (auto& i : tmp) {
		i.makePoker(j / 13, j % 13 + 1);
		j++;
	}

	srand((unsigned)time(NULL));

	int delcard;
	int i;
	for (i = 0; i < 18; i++) {
		delcard = randnum(tmp);//返回调用的是第几张牌
		ayi.getCard(tmp[delcard]);
		tmp[delcard].makePoker(-1, -1);//将本张牌置为无效牌(花色,点数),避免重复调用

		delcard = randnum(tmp);
		laoye.getCard(tmp[delcard]);
		tmp[delcard].makePoker(-1, -1);

		delcard = randnum(tmp);
		miao.getCard(tmp[delcard]);
		tmp[delcard].makePoker(-1, -1);
	}

	ayi.showCard();
	laoye.showCard();
	miao.showCard(); 
	
	return 0;
}

代码生成图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值