c# - 填充扑克 jar

标签 c# poker

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

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

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) 的位置至关重要。

最佳答案

我不会用 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。


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

关于c# - 填充扑克 jar ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17224913/

相关文章:

c# - 在 form2 中无法访问在 form1 中创建的公共(public) textBox7

java - 扑克手牌 - 用 Ja​​va 解析日志文件

c++ - 使用 pokerstove 库提高性能

c# - 在抛出未处理的 JavaScript 错误之前,不查询 IServiceProvider IElementBehaviorFactory

c# - 通过混淆 C# 中的讲师注释来修复调用方法分配问题

algorithm - 我可以在这里做得比二进制搜索更好吗?

PHP 获取扑克的所有独特棋盘结果

Python:如何查找列表中特定数量的项目是否相同?

c# - 如何更新 XML 节点?

c# - 在 C# 中使用 ProtonMail 发送电子邮件