刚刚经历了游戏的一个变体: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。我需要一些帮助重新设计我的代码以实现两个目标:
  • 根据R-P-C-L-S问题的进一步修改。
  • 支持2个以上的播放器。

  • 我不需要代码,仅需一些指导即可。
    谢谢 !!
    编辑:似乎我以为这个游戏可以由2个以上的玩家玩弄是错误的。对于这个错误,我们感到抱歉,请忽略第二个要求。

    最佳答案

    在Rock-Paper-Scissor游戏中,很容易用一个循环来确定a步相对b步是否获胜。因此,您无需在代码中手动确定每个组合的结果,如此处的其他答案所示。

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

    让我们为每个移动分配一个数字(0、1、2、3、4)。

    请注意,每一步都击败了两步:

  • 循环中之前的移动(或前面四种情况)
  • 周期
  • 向前移动两种情况

    因此,让d = (5 + a - b) % 5。然后:
  • d = 1或d = 3 => a wins
  • d = 2或d = 4 => b赢得
  • d = 0 =>并列


  • 对于剪刀石头布版本:

    d = (3 + a - b) % 3。然后:
  • d = 1 => a赢得
  • d = 2 => b赢得
  • d = 0 =>并列


  • 泛化对于n> = 3和n奇数:

    d = (n + a - b) % n。然后:
  • 如果d = 0 =>并列
  • 如果d%2 = 1 => a获胜
  • 如果d%2 = 0 => b赢得
  • 07-24 22:16