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;