2016-11-29 34 views
0

我正在制作计算机播放两个球员的岩石,纸张,剪刀,蜥蜴,Spock程序。我试图让游戏停止,当player1或player2连续赢得四次时。岩石剪刀蜥蜴Spock - 虽然循环问题

我试过这个使用while循环,但它似乎没有评估while循环的条件,因为游戏永远不会结束,当我运行它。为了看看发生了什么,我在每轮之后打印出consecutiveWins的号码,并且实际上保持了胜利的计数,

问题是,它只是在它达到4或-4。

任何人都可以看到为什么会发生这种情况?

输出:

Player 1 chooses Spock. 

Player 2 chooses scissors. 

Spock melts scissors. 

Player 1 wins. 

-5706 

Player 1 chooses lizard. 

Player 2 chooses rock. 

Rock crushes lizard. 

Player 2 wins. 

-5705 

Player 1 chooses paper. 


Player 2 chooses rock. 

Paper covers rock. 

Player 1 wins. 

-5706 

这里是我的代码:

public class RockPaperScissorsLizardSpock { 


private int lastWinner = 0; 
public static final int ROCK = 1; 
public static final int PAPER = 2; 
public static final int SCISSORS = 3; 
public static final int LIZARD = 4; 
public static final int SPOCK = 5; 
public static final int PLAYER1 = 1; 
public static final int PLAYER2 = 2; 

public void play(int player1, int player2) { 


    int consecutiveWins =0; 
    while ((consecutiveWins < 4) || (consecutiveWins > -4)) { 
     String play1; 
     String play2; 

     player1 = random(); 
     player2 = random(); 
     play1 = convert(player1); 
     play2 = convert(player2); 

     switch (play1) { 
     case "rock": // Player 1 chooses Rock 
      System.out.println("Player 1 chooses rock."); 
      if ("rock".equalsIgnoreCase(play2)) // Rock 
      { 
       System.out.println("Player 2 chooses rock. 
\nTie.\n"+consecutiveWins); 
      } else if ("paper".equalsIgnoreCase(play2)) // Paper 
      { 
       System.out.println("Player 2 chooses paper. 
\nPaper covers rock.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
      { 
       System.out.println("Player 2 chooses scissors. 
\nRock smashes scissors.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
      { 
       System.out.println("Player 2 chooses lizard. 
\nRock crushes lizard.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("spock".equalsIgnoreCase(play2)) // Spock 
      { 
       System.out.println("Player 2 chooses Spock. 
\nSpock vaporizes rock.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } 
      break; 

     case "paper": // Player 1 chooses paper 
      System.out.println("Player 1 chooses paper."); 
      if ("rock".equalsIgnoreCase(play2)) // Rock 
      { 
       System.out.println("Player 2 chooses rock. 
\nPaper covers rock.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("paper".equalsIgnoreCase(play2)) // Paper 
      { 
       System.out.println("Player 2 chooses paper. 
\nTie.\n"+consecutiveWins); 
      } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
      { 
       System.out.println("Player 2 chooses scissors. 
\nScissors cut paper.\nPlayer 2 wins.\n" +consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
      { 
       System.out.println("Player 2 chooses lizard. 
\nLizard eats paper.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("spock".equalsIgnoreCase(play2)) // Spock 
      { 
       System.out.println("Player 2 chooses Spock. 
\nPaper disproves Spock.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } 
      break; 

     case "scissors": // User chooses scissors 
      System.out.println("Player 1 chooses scissors."); 
      if ("rock".equalsIgnoreCase(play2)) // Rock 
      { 
       System.out.println("Player 2 chooses rock. 
\nRock smashes scissors.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("paper".equalsIgnoreCase(play2)) // Paper 
      { 
       System.out.println("Player 2 chooses paper. 
\nPaper covers rock.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
      { 
       System.out.println("Player 2 chooses scissors. 
\nTie.\n"+consecutiveWins); 
      } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
      { 
       System.out.println("Player 2 chooses lizard. 
\nRock smashes lizard.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("spock".equalsIgnoreCase(play2)) // Spock 
      { 
       System.out.println("Player 2 chooses Spock. 
\nSpock melts scissors.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } 
      break; 

     case "lizard": // User chooses lizard 
      System.out.println("Player 1 chooses lizard."); 
      if ("rock".equalsIgnoreCase(play2)) // Rock 
      { 
       System.out.println("Player 2 chooses rock. 
\nRock crushes lizard.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("paper".equalsIgnoreCase(play2)) // Paper 
      { 
       System.out.println("Player 2 chooses paper. 
\nPaper covers rock.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
      { 
       System.out.println("Player 2 chooses scissors. 
\nRock smashes scissors.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
      { 
       System.out.println("Player 2 chooses lizard. 
\nTie.\n"+consecutiveWins); 
      } else if ("spock".equalsIgnoreCase(play2)) // Spock 
      { 
       System.out.println("Player 2 chooses Spock. 
\nLizard poisons Spock.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } 
      break; 

     case "spock": // User chooses spock 
      System.out.println("Player 1 chooses Spock."); 
      if ("rock".equalsIgnoreCase(play2)) // Rock 
      { 
       System.out.println("Player 2 chooses rock. 
\nSpock evaporates rock.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("paper".equalsIgnoreCase(play2)) // Paper 
      { 
       System.out.println("Player 2 chooses paper. 
\nPaper disproves Spock.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
      { 
       System.out.println("Player 2 chooses scissors. 
\nSpock melts scissors.\nPlayer 1 wins.\n"+consecutiveWins); 
       consecutiveWins++; 
      } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
      { 
       System.out.println("Player 2 chooses lizard. 
\nLizard poisons Spock.\nPlayer 2 wins.\n"+consecutiveWins); 
       consecutiveWins=(consecutiveWins-1); 
      } else if ("spock".equalsIgnoreCase(play2)) // Spock 
      { 
       System.out.println("Player 2 chooses Spock. 
\nTie.\n"+consecutiveWins); 
      } 
      break; 

     default: 
      System.out.println("There was an error. Please try again."); 
      break; 
      } 
     } 
    } 
public int random() { 
     int random = (int) (Math.random() * 5) + 1; 
     return random; 
    } 
public int getLastWinner() { 
    return lastWinner; 
    } 

    // https://gist.github.com/vinothpandian/4216643#file-rpsls-in-java 
    public static String convert(int n) { 
     switch (n) { 
     case 1: 
      return "rock"; 
     case 2: 
      return "paper"; 
    case 3: 
     return "scissors"; 
    case 4: 
       return "lizard"; 
     case 5: 
     return "spock"; 
     default: 
     return "Invalid choice"; 
    } 
    } 

} 
+1

你有一个逻辑问题''(连续的胜利<4)|| (连续赢> -4)'总是如此...... – Edward

+0

谢谢@Edward我现在明白了! – Tiff

回答

0

一个问题,我用你的代码看到:

while ((consecutiveWins < 4) || (consecutiveWins > -4)) 

每当连胜变为4第二OR条件仍然满意并继续执行。让我们来看看玩家1连续获胜3场的情况,从此玩家2连续获得4场胜利,那么变量连续胜率不等于-1?快速解决问题的办法是简单地为每个玩家保存一个变量,并验证while循环中的第一个变量。 刚刚修改您的代码,我暗示:

public class RockPaperScissorsLizardSpock { 
    private int lastWinner = 0; 
    public static final int ROCK = 1; 
    public static final int PAPER = 2; 
    public static final int SCISSORS = 3; 
    public static final int LIZARD = 4; 
    public static final int SPOCK = 5; 
    public static final int PLAYER1 = 1; 
    public static final int PLAYER2 = 2; 

    public void play(int player1, int player2) { 
    int consecutiveWins1 =0,consecutiveWins2=0; 
    while ((consecutiveWins1 < 4) && (consecutiveWins2 < 4)) { 
     String play1; 
     String play2; 

    player1 = random(); 
    player2 = random(); 
    play1 = convert(player1); 
    play2 = convert(player2); 

    switch (play1) { 
    case "rock": // Player 1 chooses Rock 
     System.out.println("Player 1 chooses rock."); 
     if ("rock".equalsIgnoreCase(play2)) // Rock 
     { consecutiveWins1=0; 
      consecutiveWins2=0; 
      System.out.println("Player 2 chooses rock.\nTie.\n"); 
     } else if ("paper".equalsIgnoreCase(play2)) // Paper 
     { 
      System.out.println("Player 2 chooses paper.\nPaper covers rock.\nPlayer 2 wins.\n"); 
      consecutiveWins1=0; 
      consecutiveWins2++; 
     } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
     { 
      System.out.println("Player 2 chooses scissors.\nRock smashes scissors.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
     { 
      System.out.println("Player 2 chooses lizard.\nRock crushes lizard.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("spock".equalsIgnoreCase(play2)) // Spock 
     { 
      System.out.println("Player 2 chooses Spock.\nSpock vaporizes rock.\nPlayer 2 wins.\n"); 
      consecutiveWins1=0; 
      consecutiveWins2++; 
     } 
     break; 

    case "paper": // Player 1 chooses paper 
     System.out.println("Player 1 chooses paper."); 
     if ("rock".equalsIgnoreCase(play2)) // Rock 
     { 
      System.out.println("Player 2 chooses rock.\nPaper covers rock.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("paper".equalsIgnoreCase(play2)) // Paper 
     { 
      System.out.println("Player 2 chooses paper.\nTie.\n"); 
      consecutiveWins1=consecutiveWins2=0; 
     } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
     { 
      System.out.println("Player 2 chooses scissors.\nScissors cut paper.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
     { 
      System.out.println("Player 2 chooses lizard.\nLizard eats paper.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; consecutiveWins1=0; 
     } else if ("spock".equalsIgnoreCase(play2)) // Spock 
     { 
      System.out.println("Player 2 chooses Spock.\nPaper disproves Spock.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } 
     break; 

    case "scissors": // User chooses scissors 
     System.out.println("Player 1 chooses scissors."); 
     if ("rock".equalsIgnoreCase(play2)) // Rock 
     { 
      System.out.println("Player 2 chooses rock.\nRock smashes scissors.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("paper".equalsIgnoreCase(play2)) // Paper 
     { 
      System.out.println("Player 2 chooses paper.\nPaper covers rock.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
     { 
      System.out.println("Player 2 chooses scissors.\nTie.\n"); 
      consecutiveWins1=consecutiveWins2=0; 
     } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
     { 
      System.out.println("Player 2 chooses lizard.\nRock smashes lizard.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("spock".equalsIgnoreCase(play2)) // Spock 
     { 
      System.out.println("Player 2 chooses Spock.\nSpock melts scissors.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } 
     break; 

    case "lizard": // User chooses lizard 
     System.out.println("Player 1 chooses lizard."); 
     if ("rock".equalsIgnoreCase(play2)) // Rock 
     { 
      System.out.println("Player 2 chooses rock.\nRock crushes lizard.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("paper".equalsIgnoreCase(play2)) // Paper 
     { 
      System.out.println("Player 2 chooses paper.\nPaper covers rock.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
     { 
      System.out.println("Player 2 chooses scissors.\nRock smashes scissors.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
     { 
      System.out.println("Player 2 chooses lizard.\nTie.\n"); 
      consecutiveWins1=consecutiveWins2=0; 
     } else if ("spock".equalsIgnoreCase(play2)) // Spock 
     { 
      System.out.println("Player 2 chooses Spock.\nLizard poisons Spock.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } 
     break; 

    case "spock": // User chooses spock 
     System.out.println("Player 1 chooses Spock."); 
     if ("rock".equalsIgnoreCase(play2)) // Rock 
     { 
      System.out.println("Player 2 chooses rock.\nSpock evaporates rock.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("paper".equalsIgnoreCase(play2)) // Paper 
     { 
      System.out.println("Player 2 chooses paper.\nPaper disproves Spock.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("scissors".equalsIgnoreCase(play2)) // Scissors 
     { 
      System.out.println("Player 2 chooses scissors.\nSpock melts scissors.\nPlayer 1 wins.\n"); 
      consecutiveWins1++; 
      consecutiveWins2=0; 
     } else if ("lizard".equalsIgnoreCase(play2)) // Lizard 
     { 
      System.out.println("Player 2 chooses lizard.\nLizard poisons Spock.\nPlayer 2 wins.\n"); 
      consecutiveWins2++; 
      consecutiveWins1=0; 
     } else if ("spock".equalsIgnoreCase(play2)) // Spock 
     { 
      System.out.println("Player 2 chooses Spock.\nTie.\n"); 
      consecutiveWins1=consecutiveWins2=0; 
     } 
     break; 

    default: 
     System.out.println("There was an error. Please try again."); 
     break; 
     } 
    } 
} 
public int random() { 
    int random = (int) (Math.random() * 5) + 1; 
    return random; 
} 
public int getLastWinner() { 
return lastWinner; 
} 

// https://gist.github.com/vinothpandian/4216643#file-rpsls-in-java 
public static String convert(int n) { 
    switch (n) { 
    case 1: 
     return "rock"; 
    case 2: 
     return "paper"; 
case 3: 
    return "scissors"; 
case 4: 
      return "lizard"; 
    case 5: 
    return "spock"; 
    default: 
    return "Invalid choice"; 
} 
} 

    } 
+0

谢谢!我不知道为什么OR对我来说很难包围我的头:) – Tiff

+0

您所做的建议的作品,但它只是计数总胜利,而不是连续的胜利。 – Tiff

+0

@蒂夫我尝试了我的建议,并在任何球员连续4次获胜后终止。 –