一个有趣的扑克牌类

1.

(1)card是一副扑克牌构成的类,其中主要数据结构是一个二维数组

(2)定义的结构体single_card代表单张扑克牌

//定义一个扑克牌类 card类
//定义一个结构体,作为一个牌
struct single_card
{
public:
	string color = "空_无花色"; //方块
	int num = 0;  //点数
};

class Card
{
	//主要是这个洗牌的有点烦,要突出随机性
	//其实存储的数据结构就是一个二维数组4*13,点数为1-13,4中花色怎么表示?52张牌怎么存储
	//利用 二维数组存储 那些牌 ,然后 ,主要是针对pick,选取随机的 行i 和 列j,,
	//记住,只要抽取了某一张牌,就用set1记录行,set2记录列
public:

	vector<vector<int>> card_all;
	
	//利用公式 j*10+i  就可以实现存储 和 取出
	unordered_set<int> set_i_j;
	//构造函数--只有默认构造函数,直接生成52张扑克牌
	Card()  //默认构造
	{
		vector<int> tmp(13, 0);
		for (int i = 1; i <= 13; i++)
		{
			tmp[i-1] = i;
		}
		for (int i = 1; i <= 4; i++)
		{
			card_all.push_back(tmp);  //直接存储了4*13的牌
			//下标0-3一次表示: 方块、梅花、红桃、黑桃
		}
	}
	//随机数种子已经种下,可以利用随机数进行 扑克牌的抽取
	single_card pick()
	{
		//(1)单独判断是否还有扑克牌可以抽取
		int size_i_j = set_i_j.size();
		if (size_i_j == 52)
		{
			cout << "所有扑克牌都已经抽取完毕! 没有牌了。。。" << endl;
			single_card tmp;
			return tmp;
		}

		string color[4] = { "方块","梅花","红桃","黑桃" };
		int i=0, j=0;
		//(2)随机抽取一张扑克牌
		do
		{
			i = rand() % 4;
			j = rand() % 13;
		} while (set_i_j.count(j*10+i));
		
		//(3)只能用一个 set进行记录--记录已经抽取出来的扑克牌
		set_i_j.insert(j * 10 + i);

		//(4)利用结构体 single_card 返回一个这样的类型
		single_card tmp;
		tmp.color = color[i];
		tmp.num = j + 1;
		return tmp;  //这就是返回的那一张牌
	}
	//洗牌,shuffle其实就是将2个set清空
	void shuffle()
	{
		set_i_j.clear();
		cout << "成功洗牌!可以重新抽取" << endl;
	}
	
};

2.测试代码,2个玩家进行游戏,然后每个人先后随机抽取3张扑克牌,比较点数

//测试:
	Card test1;  //这是一副牌
	int player1 = 0;
	int player2 = 0;  //记录两者点数
	//(1)第一个玩家先抽取3张:
	single_card p1[3];
	single_card p2[3];
	for (int i = 0; i < 3; i++)
	{
		p1[i] = test1.pick();
		cout << "玩家一 抽取到: " << p1[i].color << " " << p1[i].num << endl;
		player1 += p1[i].num;
	}
	for (int i = 0; i < 3; i++)
	{
		p2[i] = test1.pick();
		cout << "玩家二 抽取到: " << p2[i].color << " " << p2[i].num << endl;
		player2 += p2[i].num;
	}
	//(2)分别输出两者取出的扑克牌 的点数之和
	cout << "最终 玩家一的点数: " << player1 << endl << "玩家二的点数: " << player2 << endl;
	if (player1 > player2) cout << "玩家一胜出!!!" << endl;
	else if (player1 < player2) cout << "玩家二胜出!!!" << endl;
	else cout << "平局!!!" << endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值