【问题标题】:Logic for Blackjack Game二十一点游戏的逻辑
【发布时间】:2015-06-02 05:08:39
【问题描述】:

我正在编写一个二十一点游戏,但我已经完成得很远了。然而,我刚开始在每手牌后将分数加在一起(我认为这很容易),但事实证明 A 让我无休止地绞尽脑汁。由于赌场使用多副牌,从数学上讲,一手牌可能最多 21 个 A

我如何创建一个循环来遍历一个名为 Hand 的整数数组列表,它的整数与手中的牌相对应。前任。一名玩家击球,现在有一张 A、一张 5、一张 2、一张 K,现在抓到一张 A。代表他的手的arraylist是[1, 10, 2, 5, 1]

我的想法:

public void calculatePlayerScore()
{
    int counter = 0;
    int aceCount = 0;

    for (int i = 0; i < hand.size(); i++)
    {
        if (hand.get(i) != 1)
        {
            counter++;
        }
        else
        {
            aceCount++;
        }
    }

    for (int i = 0; i < aceCount; i++)
    {

      //Now that we know the regular cards
      //and we know how many aces there are
      //we should be able to loop to find the most
      //optimal score without busting, and pick the highest among those

    }

如果有人对此有任何想法,请告诉我。非常感谢帮忙。

【问题讨论】:

  • 对于本网站来说,这是一个非常广泛的问题,需要付出大量努力才能回答。见stackoverflow.com/help/how-to-ask
  • 我知道这有点偏离问题的标准,但老实说,我不知道我是否可以更简洁地问它。我从来没有遇到过我的数组中的数字可以是 11 或 1 的情况。我问 SO,因为有人可能有一个聪明的方法来回答这类问题。如果有人可以将其编辑为:“如何计算可以是一个数字或另一个数字的 ArrayList 中的值 - 二十一点游戏”,我很抱歉我的主题行如此糟糕。

标签: java loops blackjack


【解决方案1】:

请注意,一手牌中只有一个 A 可以算作 11。 (否则,总数至少为 22。)

Calculate hand with all aces counting 1
if ( (hand total is <= 11) AND (there is at least one ace) )
      hand total += 10  // one ace counts as 11

【讨论】:

    【解决方案2】:

    只有一个 A 可以是 11。将一手牌相加如下所示:

    public int calculateScore(Hand hand) {
        int total = 0;
        bool hasAce = false;
    
        for (int i = 0; i < hand.size(); i++) {
            int r = hand.get(i);
            total += r;
    
            if (1 == r) { hasAce = true; }
        }
        if (hasAce && total < 12) { total += 10; }
        return total;
    }
    

    在真正的二十一点游戏中,您可能还希望返回总手数是软还是硬的事实。

    【讨论】:

      【解决方案3】:

      如果手牌总点数超过 21,但其中一张牌 =11,则使 11 = 1。

      【讨论】:

        【解决方案4】:

        取“Hand”ArrayList 的总和,对于您看到“Ace”的任何位置,用 1 或 11 作为加法计算该总和。如果你的总和大于 21,你就破产了。如果没有,请继续。如果正好是 21 点,那就把那手牌加到你的成功中,然后停止击球。

        解决此问题的蛮力方法是实现“前瞻”功能,您可以在其中查看您的整手牌一次,然后计算您的手牌提供的所有可能组合,包括您手牌中的 A 1 或 11 的。生成此可能性列表后,您可以查看哪个可能性具有最少的牌数来创建二十一点或最高手牌值,然后选择该可能性。这是一个常见的算法问题,可能有非常有效的解决方案供您查看。

        【讨论】:

          猜你喜欢
          • 2017-10-07
          • 2023-03-21
          • 2020-05-18
          • 1970-01-01
          • 2011-02-04
          • 2020-03-06
          • 2014-10-22
          • 2022-11-12
          • 1970-01-01
          相关资源
          最近更新 更多