填充扑克牌

时间:2013-06-20 22:28:28

标签: c# poker

基本上有桌子和玩家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)至关重要。

1 个答案:

答案 0 :(得分: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。


我认为以锅为中心的方法更为复杂。你不是保留每个玩家的贡献,而是保留一个中央底池和侧壶的列表,并且每个底池都有一个参与该底池的玩家列表(可能有多少玩家玩家)。然后在外面给出底池,而不是像上面那样从里到外。这更像是经销商被教导如何在真实游戏中做到这一点。

相关问题