确定摇滚纸剪刀游戏中的赢家

时间:2013-11-26 10:18:55

标签: java methods

在这个摇滚剪刀游戏中,我需要一种不同的方法来确定胜利者。当我运行我的程序时,其余的运行顺利,但我不会显示赢家。我认为他们的代码可能是一个逻辑错误。

public static void determineWinner(String userLower, String comp) {

      String user = userLower;
      String computer = comp;

      if(user.equals(computer)) {
            System.out.println("It's a tie!");
      } else if(user.equals("rock")) {
            if(computer.equals("scissors")) {
                  System.out.println("You win!");
            }
      } else if(computer.equals("rock")) {
            if(user.equals("scissors")) {
                  System.out.println("You lose!");
            }
      } else if(user.equals("scissors")) {
            if(computer.equals("paper")){
                  System.out.println("You win!");
            }
      } else if(computer.equals("scissors")) {
            if(user.equals("paper")) {
                  System.out.println("You lose");
            }
      } else if(user.equals("paper")) {
            if(computer.equals("rock")) {
                  System.out.println("You Win!");
            }
      } else if(computer.equals("paper")) {
            if(user.equals("rock")) {
                  System.out.println("You lose!");
            }    
      }       

8 个答案:

答案 0 :(得分:2)

基本上,您正在测试每种可能的组合(除了平局)。使用石头剪刀,你有9种不同的结果,其中3种是领带,所以剩下6种。

现在想象一下,你必须为21世纪的变形“摇滚纸剪刀 - 蜥蜴 - Spock”​​做到这一点:25种不同的结果。这是一长串if else s。

但是:所有可能的结果都可以存储到表中,并且该表可以根据需要小(或大)。此表适用于RPSLS(无法找到RPS),但原理相同:

rock-paper-scissors-lizard-spock winners

您可以垂直选择您的选择并将计算机水平选择;然后,左边的数字是你的分数(很明显,1代表Win,-1代表Lose),右边的数字代表对手。


(编辑)这是Rock-Paper-Scissors表。每个组合不需要两个元素,另一个元素总是与显示的元素相反。该表显示列中的Winner,行中的Loser。

+----------+-------+-------+--------+
|          | Rock  | Paper |Scissors|
+----------+-------+-------+--------+
| Rock     |   0   |   1   |   -1   |
| Paper    |  -1   |   0   |    1   |
| Scissors |   1   |  -1   |    0   |
+----------+-------+-------+--------+

答案 1 :(得分:1)

您必须为用户检查3个案例:他有摇滚,纸张或剪刀。对于每个操作,计算机将有2个选项(因为已经处理了平局),请参阅下面的代码

     if(user.equals(computer)){
                System.out.println("It's a tie!");


            }
            else if(user.equals("rock")){
                if(computer.equals("scissors")){
                    System.out.println("You win!");
                else if (computer.equals("paper"){
                    System.out.println("Computer wins!");
                }


                }
            }else if(user.equals("scissors")){
                if(computer.equals("paper")){
                    System.out.println("You win!");
                else if (computer.equals("rock"){
                    System.out.println("Computer wins!");
                }


                }
            }else if(user.equals("paper")){
                if(computer.equals("rock")){
                    System.out.println("You Win!");

                }
                else if (computer.equals("scissors"){
                    System.out.println("Computer wins!");
                }
            }

答案 2 :(得分:1)

尝试在没有else if语句的情况下进行评估,并使用简单的if语句。

例如,假设为user="rock"computer!="scissors",则后面的第一个else if语句为true,但第二个if语句为false。因为下一个else if语句与第一个else if相关(这是真的),所以它不会被执行。

                 else if(user.equals("rock")){
                    if(computer.equals("scissors")){
                        System.out.println("You win!");


                    }
                }else if(computer.equals("rock")){
                    if(user.equals("scissors")){
                        System.out.println("You lose!");


                    }

答案 3 :(得分:0)

使用else if时,它是独占的。例如:

else if (user.equals("rock")){
   if (computer.equals("scissors")) {
      System.out.println("You win!");
   }
}

想象一下,用户选择了"rock",但计算机选择了"paper"。然后if / else构造将退出而不打印胜利者。

你需要重新思考你的逻辑!

答案 4 :(得分:0)

您需要else条款来涵盖所有情况:

 } else if(user.equals("rock")) {
     if(computer.equals("scissors")) {
         System.out.println("You win!");
     } // There is no logic to handle user = "rock", computer != "sicssors"
 } else if ...

您是打算写这个呢?

 } else if(user.equals("rock") && computer.equals("scissors")) {
     System.out.println("You win!");
 } else if ...

您还可以为不同的项目分配数字,并执行简单的数学运算以确定获胜者:

Map<String, int> map = new HashMap<String, int>();
map.put("rock", 1);
map.put("paper", 2);
map.put("scissors", 3);

int user = map.get(userLower);
int computer = map.get(comp) % 3;

if(user %3 == computer) {
    System.out.println("It's a tie!");
} else if(user == computer-1) {
    System.out.println("You win!");
} else {
    System.out.println("You lose!");
}

答案 5 :(得分:0)

试试这个。

if (user.equals (computer)) {
    System.out.println ("It's a tie!");
} else if (user.equals ("rock")) {
    if (computer.equals ("scissors")) {
    System.out.println ("You win!");
    } else if (computer.equals ("paper")) {
    System.out.println ("You lose!");
    }
} else if (user.equals ("scissors")) {
    if (computer.equals ("rock")) {
    System.out.println ("You lose!");
    } else if (computer.equals ("paper")) {
    System.out.println ("You win!");
    }
} else if (user.equals ("paper")) {
    if (computer.equals ("rock")) {
    System.out.println ("You win!");
    } else if (computer.equals ("scissors")) {
    System.out.println ("You lose!");
    }
}

答案 6 :(得分:0)

您无需在第一个if级别检查两个输入。 这应该适合你。

public static void determineWinner(String userLower, String comp) {
     String user = userLower;
     String computer = comp;

if(user.equals(computer)){
    System.out.println("It's a tie!");
}
else if(user.equals("rock")){
    if(computer.equals("scissors") || computer.equals("paper")){
        System.out.println("You win!");
    }
}else if(user.equals("scissors")){
    if(computer.equals("paper")){
        System.out.println("You win!");
    }else if(computer.equals("rock")){
        System.out.println("You lose!");
    }
}else if(user.equals("paper")){
    if(computer.equals("rock")){
        System.out.println("You Win!");
    }else if(computer.equals("scissor")){
        System.out.println("You lose!");
    }
}

}

答案 7 :(得分:0)

让我们为两个球员的行动定义得分:

Player + S is 1
Player + P is 2
Player + R is 4

//same actions of computer yeld negative score with same amounts

if (player.score() + AI.score() == 0)
   return tie(); // both players did same action

if (player.score() + AI.score() == 1)
//S + P combination we need to check who plays S
   return player.score() == 1 ? win() : lose()

if (player.score() + AI.score() == 2)
//P + R combination same check here
   return player.score() == 2 ? win() : lose()

if (player.score() + AI.score() == 3)
//S + R combination same check here
   return player.score() == 4 ? win() : lose()

使用ENUM或switchcase,这可以通过完全跳过某些检查来更加优化

添加

int [] scoretable = {1, 2, 4,
                    -2,-4,-1};
//                   R  S  P

//lose condition zero result
// R+P 1-1  = 0
// P+S 4-4  = 0
// S+R 2-2  = 0

//all other conditions are win or tie, tie checked before score calculated

允许在单线行动中检查胜利。