3

基本上有一张桌子,玩家 A 加注到 100 美元,玩家 B 跟注(接受),玩家 C 只有 50 美元,所以底池被创建为 100 美元(在玩家 A 和 B 之间)和 150 美元(在所有三个玩家之间,因为每个人都以 50 美元筹码)。

我将如何实现这样的功能并正确处理所有的罐子?这是我到目前为止所拥有的:

static public void FillPots(Room r, decimal Val, int Player)
        {
            decimal NewRaise = Val;

            if (NewRaise > 0)
            {
                foreach (Program.Player pz in r.Seated)
                {
                    if (pz == null) { continue; }
                    if (pz.BuyIn < NewRaise)
                    {
                        Pot _pot = new Pot { PotSize = r.MaxPlayers, PotBuy = (NewRaise - pz.BuyIn), PotVal = new decimal[r.MaxPlayers] };
                        Array.Clear(_pot.PotVal, 0, r.MaxPlayers);
                        r.Pots.Add(_pot);
                        NewRaise -= (NewRaise - pz.BuyIn);
                    }
                }
            }

            for (int i = 0; i < r.Pots.Count; i++)
            {
                if (r.Pots[i].PotVal[Player] == 0m && NewRaise >= r.Pots[i].PotBuy)
                {
                    r.Pots[i].PotVal[Player] += r.Pots[i].PotBuy;
                    NewRaise -= r.Pots[i].PotBuy;
                }
            }

            if (NewRaise > 0)
            {
                Pot _pot = new Pot { PotSize = r.MaxPlayers, PotBuy = (NewRaise), PotVal = new decimal[r.MaxPlayers] };
                Array.Clear(_pot.PotVal, 0, r.MaxPlayers);
                _pot.PotVal[Player] += NewRaise;
                r.Pots.Add(_pot);
                NewRaise = 0;
            }
        }

这一切都很令人困惑。保持每个玩家相对于数组中玩家编号(int Player)的位置至关重要。

4

2 回答 2

3

我不会用 C# 说话,但既然你在这里没有答案,我会告诉你一般如何处理扑克底池。有两种方法:以底池为中心和以玩家为中心。我通常更喜欢后者,因为要管理的数据较少。

您需要一个变量用于“组合底池”(我们称之为 POT),一个变量用于“当前总投注额”(CBET),一个变量用于最后一次加注(LRAISE),每个玩家需要三个变量:本金(PSTAKE [N])、“当前下注”(PBET[N])、“对底池的贡献”(PCONTRIB[N])。

发牌时,将 POT 和每个玩家的 PCONTRIB[] 设置为 0。如果有底注,将它们添加到 POT 和每个玩家的 PCONTRIB[],从 PSTAKE[] 中删除它们。

在每轮投注开始时,将 CBET、LRAISE 和所有 PBET[] 设置为 0。如果这是第一轮,并且有盲注,则将这些玩家的 PBET[] 设置为盲注金额,将其从 PSTAKE[] 中删除.

每个玩家轮流有三个选择:(1)弃牌(如果 CBET 为 0,你可能想要禁止这样做),(2)跟注,在这种情况下,他必须让他的 PBET[] 等于 CBET(如果 CBET 为 0,这称为“支票”,否则调用金额为 CBET-PBET[],必须从 PSTAKE[] 移动到 PBET[])。(3) 加注,其中玩家必须将 CBET 金额至少增加 LRAISE(并遵守任何其他限制,该金额成为新的 LRAISE),从他的赌注中转移所需的金额。注意:您还需要跟踪最后一个加注者是谁,这样他就不允许自己加注。

如果玩家的赌注不足以跟注或加注,他可以“全押”(如果另有允许)将他的全部赌注转移到他的 PBET[]。当所有玩家都跟注 CBET 或全押时,下注回合结束。如果一个玩家加注,其他人都弃牌,没有人全押,那么就将底池分给加注者。否则,对于每个玩家,将他的 PBET[] 添加到他的 PCONTRIB[] 和 POT 中。

如果手牌继续摊牌,按如下方式奖励底池:从最好的手牌开始:他的可赢金额 (W) 是他的 PCONTRIB[]。转到每个玩家(包括他),从 POT 中减去 W 和该玩家的 PCONTRIB[] 中的较小者,并将其奖励给获胜者。从玩家列表中移除获胜者,移除所有 PCONTRIB[] 现在为 0 的玩家,然后继续下一个最佳手牌。移除那个获胜者等,并继续直到 POT 为 0。


我认为以锅为中心的方法更复杂。不是保留每个玩家的贡献,而是保留中央底池和边池的列表,并为每个底池列出参与该底池的玩家列表(可能有与玩家一样多的底池)。然后底池是由外向内,而不是像上面那样由内向外。这更像是在真实游戏中教庄家如何做到这一点。

于 2013-06-24T01:09:11.430 回答
0

更新:

我刚刚意识到我在“跳过”并没有真正回答 OP 的要求。但我会在这里留下我的答案,因为这个问题仍然出现在与程序化扑克底池解决方案相关的搜索中。在解决芯片的去向之前,我已经开发了所有的动作逻辑。



上一个答案:

回答未回答的问题是否为时已晚?我也在寻找这个问题的答案。我找到的答案有点混乱,所以我终于在 dotnetfiddle 上编写了自己的代码:

https://dotnetfiddle.net/P0wgR5

看到我没有完全按照 Lee Daniel Crocker 提到的那样做,我想知道我所做的是否存在错误。我很乐意在这里修复它们并更新代码。

我不确定将 140 行代码粘贴到 StackOverflow 中是否是一种好习惯,但这就是我最终得到的行数。控制台显示正在执行的操作,您可以在 Main 函数中尝试手动创建。

我对此进行了彻底的测试,并将结果与​​这个底池计算器进行了比较: https ://www.pokerlistings.com/rules-for-poker-all-in-situations-poker-side-pot-calculator

结果似乎是一致的。

于 2021-10-11T23:53:59.623 回答