我正在尝试计算简单的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;
}
答案 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
检查王牌
执行逻辑
答案 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,但我稍后会担心。
感谢您的帮助。