刚刚经历了一个变种的游戏:
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 / case.我需要一些帮助重新设计我的代码来实现2个目标:
>根据R-P-C-L-S问题进一步修改.
>支持超过2名玩家.
我不需要代码,只是一些准则应该有帮助.
谢谢 !!
编辑:似乎我错了,认为这个游戏可以由超过2名玩家玩.对于这个错误我很抱歉,请忽略第二个要求.
解决方法
在Rock-Paper-Scissor游戏中,很容易决定是否在一个循环中使用他们的索引移动一个胜利.所以你不需要在你的代码手动决定每个组合的结果,其他答案在这里建议.
对于Rock-Paper-Scissor-Spock-Lizard版本:
让我们为每个动作(0,1,2,3,4)分配一个数字.
请注意,每一步都会跳动两步:
>在这个循环之前的动作(或四个提前)
>这个举动在这个循环中提前两个
所以让d =(5 a – b)%5.然后:
> d = 1或d = 3 =>一胜
> d = 2或d = 4 => b胜
> d = 0 =>领带
对于Rock-Paper-Scissor版本:
让d =(3 a – b)%3.然后:
> d = 1 =>一胜
> d = 2 => b胜
> d = 0 =>领带
n = 3和n奇数的泛化:
令d =(n a – b)%n.然后:
>如果d = 0 =>领带>如果d%2 = 1 =>一胜>如果d%2 = 0 => b胜