im trying to create a 2 player rock paper scissors game with a prompt to continue or end the game. and also re-ask for your move if entered incorrectly. i've been trying to use do-while loops but i get an error every time.
it doesn't recognize the do-while i put in, because it's not reading the while(playAgain.equals("Y");
let me know what i can fix and where i should start my do and start my while. thanks!
import java.util.Scanner;
public class RPS {
public static void main(String[] args) {
//player one input
Scanner in = new Scanner(System.in);
//loop start?
do {
System.out.println("Player One, please enter your move [R/P/S]: ");
String playerOne = in.nextLine();
//verify move is valid
if (!playerOne.equals("R") && !playerOne.equals("P") && !playerOne.equals("S")) {
System.out.println("Invalid input, please enter valid move.");
} else {
//player two input
System.out.println("Player Two, please enter your move [R/P/S]: ");
String playerTwo = in.nextLine();
//verify move is valid
if (!playerTwo.equals("R") && !playerTwo.equals("P") && !playerTwo.equals("S")) {
System.out.println("Invalid input, please enter valid move.");
}
//game outcome
if (playerOne.equals(playerTwo)) {
System.out.println("You tied!");
} else if (
(playerOne.equals("R") && playerTwo.equals("S")) ||
(playerOne.equals("S") && playerTwo.equals("P")) ||
(playerOne.equals("P") && playerTwo.equals("R"))) {
System.out.println("Player One has won!");
} else if (
(playerTwo.equals("R") && playerOne.equals("S")) ||
(playerTwo.equals("S") && playerOne.equals("P")) ||
(playerTwo.equals("P") && playerOne.equals("R"))) {
System.out.println("Player Two has won!");
}}}//loop end?
while (playAgain.equals("Y"));
//prompt user to play again
System.out.println("Would you like to play again? [Y/N]");
String playAgain = in.nextLine();
if (playAgain.equals("N")) {
System.out.println("Game stopped. Thanks for playing!");
}
if (!playAgain.equals("Y") && !playAgain.equals("N")) {
System.out.println("Invalid input, please enter valid response.");
}}}
CodePudding user response:
I will look further, though to improve readability|simplify logic
if (!playerOne.equals("R") && !playerOne.equals("P") && !playerOne.equals("S"))
is the same as
if (!((playerOne.equals("R") || playerOne.equals("P") || playerOne.equals("S")))
EDIT: In your logic, I don't see a case for asking the player again. This can/will lead to a logic hole.
bool inPlay = true;
while(inPlay)
{
...
if(valid plays)
{
if(tie) print tie;
else if(p1 wins) print player1;
else if(p2 wins) print player2;
inPlay = ask: want to play again?
}else
{
tell them it is invalid, loop again;
}
...
}
^This will allow you to ask again
EDIT 2: for a do-while
, it is essentially the same deal:
bool inPlay = true;
do
{
above logic;
}while(inPlay);
EDIT 3: With your most recent version I see a vital flaw here:
do
{
...
}
while (playAgain.equals("Y"));//<-- semicolon
//prompt user to play again
System.out.println("Would you like to play again? [Y/N]");
...
You can't go back to the start of the do-while
loop with that prompt after the semicolon ;
has been reached. You need to ask that question within the curly brackets {}
after the game has been finished.
EDIT 4: to expand on OP's "I'm getting an error that my playAgain
variable is not initialized even when I add String playAgain;
"
String playAgain = "";
do
{
...
playAgain = their answer;
...
}while(playAgain.equals("Y"));
However, I don't think you need to keep the String outside the scope of the loop, a boolean is all you need, and a boolean is easier to read. So perhaps:
//See EDIT 2 above
...
// will result in true for Y and false for !Y
playAgain = (answer == 'Y')
...