简体   繁体   中英

Rock, Paper, Scissors game

I have my app class for the game Rock, Paper, Scissors. My problem is if I win two times or the computer wins two times I need the game to stop generating but it keeps going one more time. How can I rectify this?

import javax.swing.JOptionPane;
public class RockPaperScissorsApp
{
    public static void main(String args[])
    {
        String player1, winner;
        int player2, gamesPlayed = 1, player1Wins = 0, player2Wins = 0;
        do
        {
            RockPaperScissors myRock = new RockPaperScissors();

            player1 = JOptionPane.showInputDialog(null,
                    "Please enter your choice, Rock, Paper or Scissors");
            myRock.setPlayer1(player1);

            myRock.compute();

            winner = myRock.getWinner();
            player2 = myRock.getPlayer2();

            if(winner.equals("Player 1"))
            {
                if(player2 == 1)
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "Congratulations, you have beaten the computer! The computer chose Rock");
                }
                else if(player2 == 2)
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "Congratulations, you have beaten the computer! The computer chose Paper");
                }
                else
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "Congratulations, you have beaten the computer! The computer chose Scissors");
                }
                player1Wins = player1Wins + 1;
            }

            else if(winner.equals("Player 2"))
            {
                if(player2 == 1)
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "Hard Luck, you have been beaten by the computer! The computer chose Rock");
                }
                else if(player2 == 2)
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "Hard Luck, you have been beaten by the computer!The computer chose Paper");
                }
                else
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "Hard Luck, you have been beaten by the computer! The computer chose Scissors");
                }
                player2Wins = player2Wins + 1;
            }

            else if(winner.equals("draw"))
            {
                if(player2 == 1)
                {
                    JOptionPane.showMessageDialog(null,
                            "It was a draw this time! The computer chose Rock");
                }
                else if(player2 == 2)
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "It was a draw this time! The computer chose Paper");
                }
                else
                {
                    JOptionPane
                            .showMessageDialog(null,
                                    "It was a draw this time! The computer chose Scissors");
                }
                gamesPlayed = gamesPlayed + 0;

            }
            else
            {
                JOptionPane.showMessageDialog(null,
                        "You have entered an invalid option");

                gamesPlayed = gamesPlayed - 1;
            }

            if(player1Wins == 2)
            {
                JOptionPane.showMessageDialog(null, "You win");
                gamesPlayed = gamesPlayed + 2;
            }
            else if(player2Wins == 2)
            {
                JOptionPane.showMessageDialog(null, "He wins");
                gamesPlayed = gamesPlayed + 2;
            }

            if((gamesPlayed == 2) || (gamesPlayed == 3))
            {
                JOptionPane.showMessageDialog(null, "The score is "
                        + player1Wins + " for player1 and " + player2Wins
                        + " for player2");
            }
            gamesPlayed = gamesPlayed + 1;
        }
        while(gamesPlayed <= 3);
    }
}

Change your while loop condition:

while(player1Wins < 2 && player2Wins < 2)

Also, I would advise against using magic numbers; this is more maintainable:

public static final int VICTORY_THRESHOLD = 2;
.
.
.
while(player1Wins < VICTORY_THRESHOLD 
   && player2Wins < VICTORY_THRESHOLD)

Also, consider creating an Enum for ROCK,PAPER,SCISORS . Then consider making a Comparator that takes the two Enums and returns -1 for losses, 0, for draw, and 1 for win.

public Enum RPS {
  ROCK(),PAPER(),SCISSORS();

  public int compare(RPS that) {
    if(this==that)
      return 0;

    switch(this) {
      case ROCK:     return that==RPS.PAPER    ? -1 : 1;
      case PAPER:    return that==RPS.SCISSORS ? -1 : 1;
      case SCISSORS: return that==RPS.ROCK     ? -1 : 1;
      default: return null; /* never reached */
    }
  }
  public String toString() {
    switch(this) {
      case ROCK:     return "Rock";
      case PAPER:    return "Paper";
      case SCISSORS: return "Scissors";
      default: return null; /* never reached */
    }
  }
}

Using an Enum would make your conditional code much cleaner:

RPS player1Choice = RPS.ROCK;
RPS player2Choice = RPS.SCISSORS;
int result player1Choice.compare(player2Choice); /* 1 */

if(result == 0) 
  System.out.println("Draw, you both chose "+player1Choice);
else
  System.out.println("You "+ (result > 0 ? "won" : "lost") +
                     " with "+player1Choice+
                     "\nThe computer chose"+player2Choice);
if(result != 0)
   result >  0 ? ++player1Wins : ++player2Wins;
++gamesPlayed;

You said do... while(gamesPlayed <= 3) which means after 3 games have been played, the statement is still true, so it goes ahead and loops again.

To fix this, you can either change that 3 to a 2 or change the <= sign to a < sign.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM