交替使用开关功能

时间:2012-12-25 03:09:30

标签: java switch-statement blackjack

我正在编写一个程序来模拟二十一点游戏,我一直在使用开关来浏览菜单。它一直运行良好,但我想知道你是否可以扩展切换涉及多个案例。例如,每个玩家都有很多结果。例如,二十一点,二十一点与二十一点,玩家胸围&经销商没有破产,经销商破产,但玩家没有破产,玩家和经销商都破产,双倍下降和破产等等。有没有办法在这里使用开关比较多个变量,或者我是否必须堆叠if / else - 如果有多种条件?

3 个答案:

答案 0 :(得分:3)

将你的评论转到@LeoCorrea的答案,你的条件似乎是布尔人。

也许尝试类似的事情:

final int PLAYER_BUST = 1 << 0;
final int DEALER_BUST = 1 << 1;
// ...

int total = 0;
total |= player.bust ? PLAYER_BUST : 0;
total |= dealer.bust ? DEALER_BUST : 0;

switch(total) {
    case 0:
        // neither player nor dealer has bust
        break;
    case PLAYER_BUST:
        // just player bust, so dealer wins
        break;
    case DEALER_BUST:
        // just dealer bust, so player wins
        break;
    case PLAYER_BUST | DEALER_BUST:
        // both have bust
        break;
}

1 << x为2 ^ x,|为按位OR。我的例子是n = 2,但是n可以是任何合理的数字。

这就像how PHP encodes its error levels。注意大多数级别如何用2的幂表示(二进制中只有一个'1'数字)。

我们在这些级别上使用|来获得n个布尔值的组合结果。 int total中的每个位代表其中一个条件。

由于n个布尔值有2 ^ n个可能的组合结果,我们可以将每个结果与n位的整数相匹配。我们无法启用n布尔值,但幸运的是,我们可以在代表n布尔值的整数switch上使用total

答案 1 :(得分:1)

不幸的是,Java中不可能对多个变量switch。除了@irrelephant建议的位掩码之外,您可以尝试重新考虑您的评估:

我并不完全熟悉二十一点,但我相信不是设置player.busted和类似的字段,你可以将玩家的分数设置为-1(或者,如果得分为30则是比得分25更差,你可以把它设置为-score),然后简单地比较得分。


P.S。而不是

if (player.bust == false && dealer.bust == true)

你可以输入

if (!player.bust && dealer.bust)

它节省了大量的输入并且更具可读性。

答案 2 :(得分:0)

我不确定你说的是什么语言,因为你没有指定它,但是在Ruby中使用case语句(就像switch语句一样)

您可以执行类似

的操作
case [A, B]
when [true, true] then ...
when [false, true] then ...

您还可以让多个条件输出相同的输出

case condition
  when ("a" and "b")
    # do something
  when "c"
    # do something
end

你的问题非常模糊,我认为你应该考虑让它更具体地使用你所使用的语言。