结构体
上一篇中实现了花色+数值显示。花色和数值可以定义一个逻辑扑克牌,也可以定义现实的扑克牌资源。所以需要一个结构体来表示花色和数值,以便从此结构体对应扑克牌和图片。
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
| struct Card{ Decor CardDecor; Number CardNum;
void clear(){ CardDecor = Spade; CardNum = Num_A; } };
|
发牌
发牌就是随机获取一张牌,通过随机数随机获取花色和数值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
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;
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(); }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; }
|
效果