Java 在21点游戏中,如何决定王牌什么时候算1或11?

Java 在21点游戏中,如何决定王牌什么时候算1或11?,java,logic,blackjack,Java,Logic,Blackjack,我正在计算简单21点游戏的分数。我希望计算机能够根据卡片的情况选择何时将Ace卡片计算为1或11,但我不想硬编码这种情况 我该怎么做 这是我在经销商/玩家手牌课程中计算分数的方法: public int calcScore() { int score = 0; Link current = first; while(current != null) { score = score + current.card.getValue();

我正在计算简单21点游戏的分数。我希望计算机能够根据卡片的情况选择何时将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;
}

问题是,计算需要知道当前的总数,因此请按以下方式编码:

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;
}
public int getValue(int currentTotal){
int值=0;
如果(秩==1&¤tTotal<11)
数值=11;
else if(秩==1)
数值=1;
else if(秩=11 | |秩=12 | |秩=13)
数值=10;
其他的
价值=等级;
返回值;
}

我还没有完全完成,但我很确定你不需要检查下面的多个A,因为唯一的办法是如果你点击21,没有人会这么做。如果这不起作用,您可能必须传递已计数的ACE数量的累计总数,并使用更复杂的逻辑。

问题是计算需要知道当前的总数,因此请按此方式编码:

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;
}
public int getValue(int currentTotal){
int值=0;
如果(秩==1&¤tTotal<11)
数值=11;
else if(秩==1)
数值=1;
else if(秩=11 | |秩=12 | |秩=13)
数值=10;
其他的
价值=等级;
返回值;
}

我还没有完全完成,但我很确定你不需要检查下面的多个A,因为唯一的办法是如果你点击21,没有人会这么做。如果这不起作用,您可能必须传递已计算的ACE总数,并使用更复杂的逻辑。

我认为您无法将确定卡片值的所有逻辑都放在卡片对象中,因为直到你计算了所有牌的价值后,你才知道ace=11是否会导致手部破裂——在这种情况下,ace神奇地变成1

我会修改设计,使卡具有
getMinValue()
getMaxValue()
。它们的工作原理与您的
getValue()
完全相同,只是如果卡是ace,则getMinValue返回1,getMaxValue返回11

现在重新设计CalcCore,首先使用getMaxValue计算分数。如果手变为半身,则对getMaxValue和getMinValue进行更复杂的计算


通过这种方式,您的卡类不必封装21点的
业务逻辑,但它仍然提供了足够的信息,您可以在游戏级别处理规则。

我认为您不能将确定卡值的所有逻辑都放在卡对象中,因为直到你计算了所有牌的价值后,你才知道ace=11是否会导致手部破裂——在这种情况下,ace神奇地变成1

我会修改设计,使卡具有
getMinValue()
getMaxValue()
。它们的工作原理与您的
getValue()
完全相同,只是如果卡是ace,则getMinValue返回1,getMaxValue返回11

现在重新设计CalcCore,首先使用getMaxValue计算分数。如果手变为半身,则对getMaxValue和getMinValue进行更复杂的计算


这样,您的card类就不必封装blackjack的
业务逻辑
,但它仍然提供了足够的信息,您可以在游戏级别处理规则。

您可以做的一件事是在您的卡对象中,或者无论您如何调用它,您都可以根据当前的总数返回值。所以你可以把你的总数输入卡上的get值,如果你有一张a,它会决定给你1还是11

另一种可能也是最简单的方法就是在get value函数中检查总数

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;
}
public int getValue(int currentVal)
{
int值=0;
if(秩==1&¤tVal<11)
数值=11;
else if(秩==1)
数值=1;
else if(秩=11 | |秩=12 | |秩=13)
数值=10;
其他的
价值=等级;
返回值;
}

这两种方法都会起作用,这取决于你想用什么方法。你可以做的一件事是在你的卡对象中,或者你调用它时,你可以根据你当前拥有的总数返回值。所以你可以把你的总数输入卡上的get值,如果你有一张a,它会决定给你1还是11

另一种可能也是最简单的方法就是在get value函数中检查总数

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;
}
public int getValue(int currentVal)
{
int值=0;
if(秩==1&¤tVal<11)
数值=11;
else if(秩==1)
数值=1;
else if(秩=11 | |秩=12 | |秩=13)
数值=10;
其他的
价值=等级;
返回值;
}

这两种方法都能起作用,这取决于你想用什么方法来做。

我一直在想你们给我的建议,再加上fgb建议的其他人给我的一些建议,所以我想到了这个

当我需要的时候,我宁愿数卡片,因为它们在我的手类的插入方法中

这让我数数牌数,决定是用1还是11作为A

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,但我稍后会担心这个问题


谢谢你的帮助。

我一直在想你们给我的建议,再加上fgb建议的其他人给我的一些建议,所以我想到了这个

当我需要的时候,我宁愿数卡片,因为它们在我的手类的插入方法中

这让我想到c