我正在编写一个二十一点游戏,我很远。然而,我只是在每只手之后加上得分(我觉得这很容易),但是Aces被证明无休止地支撑着我的大脑。由于赌场玩多个牌组,因此可以在数学上用同一只手获得高达21 aces 。
如何创建一个循环来遍历一个名为Hand的整数ArrayList,它具有与手中的牌相对应的整数。 EX。一名球员击中并且现在有一个Ace,一个5,一个2,一个国王,现在画一个Ace。代表他的手的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
}
如果有人对此有所了解,请告诉我。非常感谢帮忙。
答案 0 :(得分:2)
请注意,手中只有一个ace可以算作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
答案 1 :(得分:0)
只有一个ace可以是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;
}
在一个真正的二十一点游戏中,你可能还想回归手总数是软还是硬的事实。
答案 2 :(得分:0)
如果手的总数超过21但手中的一张牌= 11,那么使11 = 1。
答案 3 :(得分:-1)
获取“Hand”ArrayList的总和,对于您看到“Ace”的任何位置,计算与1或11作为添加剂的总和。如果你的金额大于21,那么你就破产了。如果没有,继续。如果它正好是21,请将该手添加到您的成功中,然后停止击球。
解决这个问题的强力方法是实现“前瞻”功能,你可以在那里看一下整个手,然后计算你手提供的所有可能的组合,包括手中的A作为1或11。生成此可能性列表后,您可以看到哪种可能性具有最少数量的卡来创建二十一点或最高手值,并选择该可能性。这是一个常见的算法问题,你可能会看到非常有效的解决方案。