Java 在21点游戏中,如何决定王牌什么时候算1或11?
我正在计算简单21点游戏的分数。我希望计算机能够根据卡片的情况选择何时将Ace卡片计算为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();
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