Rock-Paper-Scissor的可扩展解决方案

Jag*_*uar 9 java algorithm

刚刚经历了游戏的变种: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.我需要一些帮助来重新设计我的代码以实现这两个目标:

  1. 根据RPCLS问题进一步修改.

  2. 支持超过2名玩家.

我不需要代码,只是一些指导方针应该有所帮助.

谢谢 !!

编辑:似乎我认为这个游戏可以由2个以上的玩家玩,我错了.我很抱歉这个错误,请忽略第二个要求.

sch*_*sch 31

在Rock-Paper-Scissor游戏中,很容易决定是否在一个周期内使用他们的索引来移动胜利.因此,您无需在代码中手动确定每个组合的结果,因为此处提供的其他答案.


对于Rock-Paper-Scissor-Spock-Lizard版本:

让我们为每个动作分配一个数字(0,1,2,3,4).

请注意,每一步都有两个动作:

  1. 在周期中之前的行动(或前面的四个案例)
  2. 此举在循环中领先两个案例

所以,让d = (5 + a - b) % 5.然后:

  1. d = 1或d = 3 => a获胜
  2. d = 2或d = 4 => b获胜
  3. d = 0 =>平局

对于Rock-Paper-Scissor版本:

d = (3 + a - b) % 3.然后:

  1. d = 1 =>胜利
  2. d = 2 => b获胜
  3. d = 0 =>平局

推广对于n> = 3和n odd:

我们d = (n + a - b) % n.然后:

  1. 如果d = 0 =>平局
  2. 如果d%2 = 1 => a获胜
  3. 如果d%2 = 0 => b获胜

在此输入图像描述

  • 这是迄今为止最优雅的解决方案.:) (3认同)

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的规则是什么,因为我不知道.