Java的二十一点游戏王牌价值

问题描述:

我有麻烦我的王牌的值设置为1名或11.我的教授说这样对我,当我问他是怎么做到这一点:Java的二十一点游戏王牌价值

一个王牌的价值取决于在你手中的其他牌上。你必须首先添加所有其他牌,然后决定ACE是否应该算作一个或十一个。你应该在你的手类中有一个方法(我使用了玩家类),这个方法叫做“价值”,它决定了你的手的价值。在该方法内部将是确定一个ace是一个还是十一个的逻辑。

还不完全确定如何去做。

class Card 
{ 
    private char suit; 
    private char rank; 
    private boolean facedown; 

    Card (char R, char S) 
    { 
     rank = R; 
     suit = S; 
    } 

    public int value() 
    { 
     int index = 0; 
     int [] valueArray = { 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 
     }; 
     char [] suitArray = { 
      'A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K' 
     }; 

     while (rank != suitArray[index]) { 
      index++; 
     } 

     return valueArray [index]; 
    } 
} 

class Player 
{ 
    private Card [] storage; 
    private int top; 

    public Player() 
    { 
     storage = new Card[20]; 
     top = 0; 
    } 

    public void take(Card c1) 
    { 
     storage[top] = c1; 
     top++; 
    } 

    public int value() 
    { 
    } 
} 
+2

看起来不像你已经尝试过这么远。先试一试,调试一下,看看你能做什么。将手中的牌值加起来,如果加入额外的11会导致你破产,那么你的Ace应该是1。如果你仍然失败,你会让你的球员在21上“命中”,这是错误的。 – CubeJockey

+1

我建议使用常量来计算卡片数值。一个枚举可能是CARD_ACE,CARD_KING等等。从这点出发的逻辑应该是非常简单的,正如@Trobbins – CollinD

+0

所说的那样。它看起来像是有两次相同签名的'value()'方法,这会导致编译器错误。 –

一旦你意识到一件事情就很容易处理二十一点的王牌:这绝不是玩家的选择。王牌数一;如果你的手牌中包含一张王牌,并且总数小于或等于11,那么一张王牌将晋升为11.从来没有多于一张王牌算作11,如果有必要,玩家也不会这么做。

但是,即使值本身是由规则决定的,而不是由选择决定的,“软”18和“硬”18之间仍然存在很大差异,所以如果你的值函数只返回数字18它没有完成它的工作。由于Java,C和其他语言不会让函数返回布尔值和int,所以您可能希望让函数以某种方式潜入布尔值中,如使用结果的符号位(使软值为负) ,或者添加一个固定的偏移量(比如,将软值加100)。

所以这里的一些伪代码:

soft = false 
found_ace = false 
total = 0 

for each card in hand: 
    if ace: 
     total += 1 
     found_ace = true 
    elseif facecard: 
     total += 10 
    else: 
     total += card value 
if found_ace and total < 12: 
    total += 10 
    soft = true 
return soft, total