【发布时间】:2021-02-07 21:52:52
【问题描述】:
我是 C 编程的新手,所以如果我有点不知所措,请告诉我。
我正在尝试编写一个扑克手评估器。我现在面临的主要挑战是在 7 张牌中找到所有可用的 5 张牌顺子。我需要所有顺子,而不仅仅是最高顺子的原因是稍后使用我找到的顺子来搜索同花顺。
这是我目前所得到的:
- 定义卡片的结构
typedef struct
{
short pips; // could be 1-13
suit suit; // taken from above enum
} card;
- 枚举定义西装
typedef enum { spades, hearts, clubs, diamonds} suit;
- 返回 0 或 1 以表示给定手牌中有或没有顺子的方法。 理想情况下,此方法还应将所有直线存储在参数 2D 数组中。
int is_straight(card hand[], card straights[][STRAIGHT]){
// Sort the hand in ascending order
qsort(hand, HAND_SIZE, sizeof(card), comp);
int i, j = 1 , k = 0;
int count = 1, res = 0;
while(1){
for (i = HAND_SIZE - j; i >= 1; i--){
if ((hand[i].pips - hand[i - 1].pips) == 1){
count++;
if (count == STRAIGHT){
res = 1;
memcpy(straights[k++], &hand[i-1], STRAIGHT*sizeof(card));
j++;
count = 1;
break;
}
}
else
count = 1;
}
if(i < 1) break;
}
return res;
}
我遇到的问题是卡片的重复值。比如在手:[A - spades, 2 - Spades, 3 - Spades, 4 - Spades, 5 - Spades, 6 - Spades, 6 - Hearts]
我得到这个输出:
2 of Spades
3 of Spades
4 of Spades
5 of Spades
6 of Spades
2 of Spades
3 of Spades
4 of Spades
5 of Spades
6 of Spades
Ace of Spades
2 of Spades
3 of Spades
4 of Spades
5 of Spades
有没有人对如何解决这个问题有更好的想法?另外,如前所述,如果您认为这对初学者来说太过分了,请告诉我。
干杯。
【问题讨论】:
-
编写一个 5 张扑克牌手评估器要容易得多,然后对所有 7 个选择 5 = 21 个 5 张子手牌组合并选择最高手牌等级运行它。目前最快的 7 卡评估器使用状态机或查找表来运行并且速度惊人。我有一些执行 5 卡 eval 的 go 代码,该代码经过合理优化 github.com/paulhankin/poker/blob/… 并且对于 c 程序员来说应该是可以理解的。 (用于构建快速 eval 的快速 5 和 7 卡查找表)。
-
这是个好主意。您能否详细说明如何从我的 7 张牌中提取这些副牌?我应该手动完成还是有更聪明的方法?
-
我就是这样做的(在 go 中,但它与这里的 C 基本相同):github.com/paulhankin/poker/blob/…。我优化并展开了一些循环,所以出现了一些看起来很奇怪的重复,但希望你能明白其中的原理。