如何轻松实施二十一点基本策略

时间:2014-12-18 13:49:22

标签: c# blackjack

我正在进行二十一点游戏。我想实施二十一点基本策略来编程,以帮助玩家。

基本策略(来自blackjackinstitute.com

http://www.blackjackinstitute.com/store/images/Basic_Strategy_Chart.jpg

我可以用大量的if语句来做。例如

if(dealerHand[0] == 2 && playerTotal == 9){

  MessageBox.Show("Hit")

} 

else if(dealerHand[0] == 2 && playerTotal == 10){

  MessageBox.Show("Double Down")

} 

也许我可以使用开关盒。但我不确定。我怎样才能以简单的方式实现它?

2 个答案:

答案 0 :(得分:0)

您可以实现一个简单的二维数组:

var NextPlay[][] rules = new NextPlay[12][99]; // dealer x player
rules[2][5] = NextPlay.Hit;
rules[2][6] = NextPlay.Hit;
// ....
rules[11][99] = NextPlay.Stay;

然后你可以访问它:

var nextPlay = rules[dealerHand[0]][playerTotal];

注意:我认为你可以保存"特殊的手"使用"特殊值",例如两个9是一个"玩家总数" 99.

更优雅,但更复杂的是某种查找表,例如类似的东西:

public class Hand
{
    public int DealerCard { get; set; }
    public int? PlayerTotal { get; set; }
    public int? PlayerCard1 { get; set; }
    public int? PlayerCard2 { get; set; }
    public NextPlay Play { get; set; }
}

var List<Hand> rules = new List<Hand>();
rules.Add(new Hand() { DealerCard = 2, PlayerTotal = 5, Play = NextPlay.Stay });
// ...
rules.Add(new Hand()
   { DealerCard = 11, PlayerCard1 = 9, PlayerCard2 = 9, Play = NextPlay.Stay });

然后查一查:

var nextPlay = rules.FirstOrDefault(h => h.DealerCard == dealerHand[0] &&
                   h.PlayerCard1 == playerHand[0] && h.PlayerCard2 == playerHand[1]);
if (nextPlay == null)
{
    nextPlay = rules.FirstOrDefault(h => h.DealerCard == dealerHand[0]
                  && h.PlayerTotal == playerTotal);
}
var play = nextPlay.Play;

答案 1 :(得分:0)

您展示的小型表格易于打印,但隐藏了它实际上是四个独立的表格。关键是你以正确的顺序做所有事情,这意味着:

  1. 投降(约200位信息)
  2. 配对分割(100位信息)
  3. Double down(&lt; 200 bits)
  4. 命中/站立(&lt; 200位)
  5. 这些中的每一个都是2D表,其中一个轴是经销商的upcard,另一个轴在情况#2中是排名,在情况1,3和&amp;中是硬和软总计。这对于BASIC战略来说已经足够了。如果要对基于完整计数的策略进行编码,则需要3D表,其中另一个轴是计数值。

    保险是无关紧要的一面。

    您可以通过运行模拟并填写这些表格来确定游戏的基本策略,在这种情况下,您必须按相反的顺序执行:首先确定硬20的命中/替换,硬19 ,. ..硬4(你需要更高数量的策略来找出更低的数字)。然后使用您已有的信息进行软总计20..12。然后做硬双下表,软双表,然后是对拆分表,最后是投降表。

相关问题