如何决定在BlackJack游戏中Ace何时算作1或11?

时间:2012-11-22 19:08:31

标签: java logic blackjack

我正在尝试计算简单的BlackJack游戏的分数。我希望能够让计算机根据卡的情况选择何时将Ace卡计为1或11,但我不想硬编码这种情况。

我该怎么做?

这就是我在经销商/玩家手上的分数:

public int calcScore()
{
    int score = 0;
    Link current = first;

    while(current != null)
    {
        score = score + current.card.getValue();
        current = current.next;
    }

    return score;
}

这就是我在Card类中指定卡片的价值:

public int getValue()
{
    int value = 0;

    if (rank == 1)
        value = 11;
    else if (rank == 11 || rank == 12 || rank == 13)
        value = 10;
    else
        value = rank;

    return value;
}

5 个答案:

答案 0 :(得分:3)

问题是计算需要知道当前的总数是多少,所以按照这样的方式编码:

public int getValue(int currentTotal) {
    int value = 0;

    if (rank == 1 && currentTotal < 11)
        value = 11;
    else if (rank == 1)
        value = 1;
    else if (rank == 11 || rank == 12 || rank == 13)
        value = 10;
    else
        value = rank;

    return value;
}

我没有彻底通过那个,但我很确定你不需要检查多个跟随aces,因为唯一的方法就是如果你击中了21,没有人会这样做。如果这不起作用,你可能不得不传递累计已经计算了多少个A并使用更复杂的逻辑。

答案 1 :(得分:2)

我认为你不能把所有的逻辑用于确定卡片对象中的牌值,因为你不知道在你计算所有牌的价值之前,无论ace = 11是否会导致牌局破产 - 在这种情况下,王牌神奇地变成了1。

我会修改设计,以便卡片有getMinValue()getMaxValue()。它们的工作方式与getValue()完全相同,只是如果卡是ace,则getMinValue返回1,getMaxValue返回11.

现在,您重新设计calcScore,首先使用getMaxValue计算得分。如果手牌破裂,你会对getMaxValue和getMinValue进行更复杂的计算。

通过这种方式,您的卡片类不必封装二十一点的business logic,但它仍然提供足够的信息,您可以在游戏级别处理规则。

答案 2 :(得分:1)

我知道已经有了一个答案,但问题是如何通用的方法和一切都在java中。这是答案的伪代码逻辑。

计算得分,ace等于1

  1. 设置变量得分
  2. 循环通过手
  3. 设置一个等于卡值的变量数
  4. 如果数字大于10,则设置等于​​10
  5. 将新号码添加到总分
  6. 检查王牌

    1. 将isThereAnAce的变量设置为false
    2. 循环通过牌组并检查是否有任何牌是ace如果至少有一套牌isThereAnAce为真
    3. 执行逻辑

      1. 如果isThereAnAce等于true且当前得分小于12则为得分增加10

答案 3 :(得分:0)

您可以做的一件事就是在您的卡片对象中或者您正在调用的内容中,您可以根据当前的总数返回值。所以你可以直接从卡中输入你得到的总数,如果你有一个ace,它将决定是否给你1或11

另一种方式也许最简单的方法就是检查获取值函数中的总数。

public int getValue(int currentVal)
{
    int value = 0;

    if (rank == 1 && currentVal < 11)
        value = 11;
    else if(rank == 1)
        value = 1;
    else if (rank == 11 || rank == 12 || rank == 13)
        value = 10;
    else
        value = rank;

    return value;
}

两者都能起作用取决于你想做什么。

答案 4 :(得分:0)

正如我记得你们给我的提示以及来自另一个post的一些提示,就像fgb建议的那样,我想出了这个。

而不是在需要时计算一次卡片,而不是在我的Hand类的插入方法中计算卡片。

这让我可以统计牌并决定是否使用1或11作为王牌。

public void insert(Card card)
{
    Link newLink = new Link(card);
    newLink.next = first;

    if (card.rank == 1 && cardTotal + card.getValue() > 21)
        cardTotal = cardTotal + (card.getValue() - 10);
    else
        cardTotal = cardTotal + card.getValue();

    first = newLink;
}

问题是,如果我应该让玩家决定何时使用1或11,但我稍后会担心。

感谢您的帮助。