2013-06-20 136 views
2

本質上有一張桌子和一個玩家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)的位置至關重要。

+0

您是否記得實施側鍋?不完全確定這將如何在您的程序中實現你到底有什麼困難完成? – CodeCamper

+0

這正是我正在嘗試實施的,打破了鍋的邊緣,這個功能應該做到這一點。 – user2498443

回答

3

我不能說C#,但既然你在這裏沒有答案,我會告訴你一般如何處理撲克壺。有兩種方法:以玩家爲中心和以玩家爲中心。由於需要管理的數據較少,我通常更喜歡後者。

您需要一個變量用於「組合鍋」(我們稱之爲POT),一個變量用於「當前總投注量」(CBET),一個用於最後加註量(LRAISE),以及每個玩家三個變量:賭注(PSTAKE [N]),「當前賭注」(PBET [N]),「對籌碼的貢獻」(PCONTRIB [N])。

當發牌時,將POT和每個玩家的PCONTRIB []設置爲0.如果有antes,將它們添加到POT和每個玩家的PCONTRIB [],並從PSTAKE []中移除它們。

在每個投注回合開始,設置CBET,LRAISE和所有PBET []爲0。如果這是第一輪,並有百葉窗,設置這些球員的盲人數量PBET [],刪除它們來自PSTAKE []。 (1)fold(你可能想禁止這個,如果CBET爲0),(2)調用,在這種情況下,他必須讓他的PBET []等於CBET(如果CBET爲0時,稱爲「檢查」,否則調用量爲CBET-PBET [],必須從PSTAKE []移至PBET [])。 (3)提高,其中玩家必須至少提高LETISE的CBET金額(並遵守任何其他限制,該金額成爲新的LRAISE),從其股權移動所需的金額。注意:你還需要跟蹤最後一位加註者是誰,所以他不允許自己養大。

如果玩家的賭注不足以致電或加註,他可以「全押」(如果允許的話)將他的全部賭注移到他的PBET []。當所有球員都打電話給CBET或全部進場時,投注回合結束。如果一個玩家舉起了,所有其他玩家都摺疊起來,而沒有一個玩家全部進入,那麼就把獎盃拿給籌碼者。否則,對於每個玩家,將他的PBET []添加到他的PCONTRIB []和POT。

如果手繼續攤牌,像這樣獎勵鍋:從最好的牌開始:他贏得的金額(W)是他的PCONTRIB []。轉到每個玩家(包括他),從POT中減去W和該玩家的PCONTRIB []中的較小者,並將其獎勵給贏家。從玩家列表中刪除優勝者,移除其PCONTRIB []現在爲0的玩家,並繼續使用下一手牌。刪除那個贏家等,並繼續,直到POT爲0.


我認爲以罐爲中心的方法更復雜。您不必保留每個玩家的貢獻,而是保留一箇中央鍋和邊鍋的列表,並且爲每個鍋添加一個參與該鍋的玩家的列表(可能有與玩家一樣多的底池)。然後這些花盆被授予外部輸入,而不是像上面那樣內部輸出。這更像是如何教授經銷商在真實遊戲中做到這一點。