刚刚经历了游戏的变种:Rock-Paper-Scissor-Lizard-Spock
我已经为传统的RPS问题编写了一个Java代码,但是当我尝试将代码扩展到更新版本的游戏(RPSLS)时......我觉得我的代码非常糟糕.这是一个片段:
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;
}
Run Code Online (Sandbox Code Playgroud)
我意识到代码不能轻易扩展到新版本 - 以及超过2个玩家.这主要是因为多个if/else或switch/cases.我需要一些帮助来重新设计我的代码以实现这两个目标:
根据RPCLS问题进一步修改.
支持超过2名玩家.
我不需要代码,只是一些指导方针应该有所帮助.
谢谢 !!
编辑:似乎我认为这个游戏可以由2个以上的玩家玩,我错了.我很抱歉这个错误,请忽略第二个要求.
sch*_*sch 31
在Rock-Paper-Scissor游戏中,很容易决定是否在一个周期内使用他们的索引来移动胜利.因此,您无需在代码中手动确定每个组合的结果,因为此处提供的其他答案.
对于Rock-Paper-Scissor-Spock-Lizard版本:
让我们为每个动作分配一个数字(0,1,2,3,4).
请注意,每一步都有两个动作:
所以,让d = (5 + a - b) % 5.然后:
对于Rock-Paper-Scissor版本:
让d = (3 + a - b) % 3.然后:
推广对于n> = 3和n odd:
我们d = (n + a - b) % n.然后:

Tay*_*mon 10
Rock-Paper-Scissors的本质是你必须明确处理每个可能的状态组合的情况.因此,您必须覆盖的案例数量随着玩家数量呈指数增长,并且多项式(多项式的数量级为玩家数量)随选项数量增加.
话虽如此,Java的枚举对这种事情有好处.
这是我的抨击:
import java.util.Arrays;
import java.util.List;
enum Result {
WIN, LOSE, DRAW;
}
enum Option {
ROCK(SCISSORS),
PAPER(ROCK),
SCISSORS(PAPER);
private List<Option> beats;
private Option(Option... beats) {
this.beats = Arrays.asList(beats);
}
Result play(Option other) {
if beats.contains(other) {
return Result.WIN;
} else if other.beats.contains(this) {
return Result.LOSE;
} else {
return Result.DRAW;
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,添加更多案例(Lizard和Spock)相对简单.增加更多玩家会更复杂; 除此之外,你必须确定三人Rock-Paper-Scissors的规则是什么,因为我不知道.