【问题标题】:Given a 7 card poker hand, find all 5 card straights (C)给定一手 7 张牌,找出所有 5 张顺子 (C)
【发布时间】:2021-02-07 21:52:52
【问题描述】:

我是 C 编程的新手,所以如果我有点不知所措,请告诉我。

我正在尝试编写一个扑克手评估器。我现在面临的主要挑战是在 7 张牌中找到所有可用的 5 张牌顺子。我需要所有顺子,而不仅仅是最高顺子的原因是稍后使用我找到的顺子来搜索同花顺。

这是我目前所得到的:

  1. 定义卡片的结构
typedef struct
{
    short pips; // could be 1-13
    suit suit; // taken from above enum
} card;
  1. 枚举定义西装
typedef enum { spades, hearts, clubs, diamonds} suit;
  1. 返回 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/…。我优化并展开了一些循环,所以出现了一些看起来很奇怪的重复,但希望你能明白其中的原理。

标签: c poker


【解决方案1】:

我认为这是一个练习 C 编程技能的好项目,它是你熟悉的东西,你可以快速检查输出,而且看起来你已经朝着正确的方向前进了。你只需要照顾一些小事。

目前的问题是当你找到顺子时,你memcpy手中连续五张牌,这不是你想要的重复值。

我认为处理重复值是这个项目的主要问题。也许你可以尝试一种不同的方法来解决这个问题?首先检查重复值并为它们制作单独的手?使用更多代码而不是试图将所有代码都放在一个循环中是可以的。

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2011-04-19
    • 1970-01-01
    • 2014-12-21
    • 2021-05-17
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多