刚刚经历了游戏的一个变体:Rock-Paper-Scissor-Lizard-Spock
我已经为传统的R-P-S问题编写了Java代码,但是当我尝试将代码扩展到较新版本的游戏(R-P-S-L-S)时。我觉得我的代码非常糟糕不好。这是一个片段:
if (player1.equals("ROCK") &&
player2.equals("SCISSORS")) {
winner = 1;
}
// Paper covers rock...
else if (player1.equals("PAPER") &&
player2.equals("ROCK")) {
winner = 1;
}
// Scissors cut paper...
else if (player1.equals("SCISSORS") &&
player2.equals("PAPER")) {
winner = 1;
}
else {
winner = 2;
}
我意识到,对于新版本以及超过2个播放器,无法轻松扩展代码。这主要是由于多个if/else或switch/cases。我需要一些帮助重新设计我的代码以实现两个目标:我不需要代码,仅需一些指导即可。
谢谢 !!
编辑:似乎我以为这个游戏可以由2个以上的玩家玩弄是错误的。对于这个错误,我们感到抱歉,请忽略第二个要求。
最佳答案
在Rock-Paper-Scissor游戏中,很容易用一个循环来确定a步相对b步是否获胜。因此,您无需在代码中手动确定每个组合的结果,如此处的其他答案所示。
对于Rock-Paper-Scissor-Spock-Lizard版本:
让我们为每个移动分配一个数字(0、1、2、3、4)。
请注意,每一步都击败了两步:
因此,让
d = (5 + a - b) % 5
。然后:对于剪刀石头布版本:
让
d = (3 + a - b) % 3
。然后:泛化对于n> = 3和n奇数:
让
d = (n + a - b) % n
。然后: