基于Qt的德州扑克02:发牌

结构体

上一篇中实现了花色+数值显示。花色和数值可以定义一个逻辑扑克牌,也可以定义现实的扑克牌资源。所以需要一个结构体来表示花色和数值,以便从此结构体对应扑克牌和图片。

flowchart LR

A[扑克牌] <--> C[图片]

花色

一般情况下,花色包含黑桃、红桃、方片、梅花,并且一般情况下黑桃>红桃>方块>梅花,当然,德州扑克花色不分大小。

1
2
3
4
5
6
7
8
9
10
11
//牌花色
enum Decor{
//黑桃
Spade=0,
//红桃
Heart,
//方块
Diamond,
//梅花
Club,
};

数值

数值就简单了,但是为了方便后续开发,进行了一定调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//牌大小
enum Number{
Num_None=0,
Num_2=2,
Num_3,
Num_4,
Num_5,
Num_6,
Num_7,
Num_8,
Num_9,
Num_10,
Num_J,
Num_Q,
Num_K,
Num_A
};

扑克牌

扑克牌由花色和数值组成。

1
2
3
4
5
6
7
8
9
10
11
//牌 一张牌由花色和数字组成,比如黑桃A
struct Card{
Decor CardDecor;//花色
Number CardNum;//数字

//牌默认值
void clear(){
CardDecor = Spade;
CardNum = Num_A;
}//clear
};

发牌

发牌就是随机获取一张牌,通过随机数随机获取花色和数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/////////////////////
/// 获取一张牌,可能重复
/// \brief getCard
/// \return 一张牌
///
inline Card getCard(){
Card c;
int decor= QRandomGenerator::global()->bounded(0,4);
int num = QRandomGenerator::global()->bounded(2,15);
c.CardDecor=(Decor)decor;
c.CardNum=(Number)num;
//qDebug()<<c.CardDecor<<c.CardNum;

return c;
}

发5张牌

一般情况下,牌不能重复。使用一个列表来存储已发过的牌。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool Generator::checkExistCard(Card c)
{
int num = existCard.size();
if(num==0) return false;
if(num>=52) return true;

for(int i=0;i<num;i++){
Card temp = existCard.at(i);
if((temp.CardDecor==c.CardDecor)
&& (temp.CardNum==c.CardNum)){
return true;
}
}

return false;
}

发牌的时候先发牌,然后判断这张牌有没有发过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Card Generator::getIndepentCard()
{
//当前牌不够数量的时候开启新牌
if(existCard.size()>=52){
qDebug()<<"new cards";
existCard.clear();
}
Card c;
c.clear();
do{
c = getCard();
//qDebug()<<c.CardDecor<<c.CardNum;
}while(checkExistCard(c));
existCard.append(c);

return c;
}

然后通过这个流程发5张牌。

1
2
3
4
5
6
7
8
9
10
QList<Card> Generator::getCards()
{
QList<Card> cards;
for(int i=0;i<5;i++){
Card c = getIndepentCard();
cards.append(c);
}

return cards;
}

效果

扑克牌


基于Qt的德州扑克02:发牌
https://blog.jackeylea.com/qt/shuffle-card-of-texas-holdem-poker/
作者
JackeyLea
发布于
2020年12月30日
许可协议