Rock, Paper, Scissors 12/2/2010
Another Java forum classic: rock, paper, scissors. Or chifoumi, as it is called in France.
An interesting solution involves an enum (which I called Choice below). The only “fancy” thing in the code is checkWinner which checks if the first value is equal to the second value + 1, modulo 3 (as paper is stronger than rock, scissors stronger than paper, and rock stronger than scissors, so there’s a circular thing going on there). I haven’t bothered checking the user’s input, but that should really be done.
import java.util.Random;
import java.util.Scanner;
public class RockPaperScissors {
public enum Choice {
ROCK(0),
PAPER(1),
SCISSORS(2);
private final int value;
Choice(int value) {
this.value = value;
}
public int value() {
return value;
}
}
private int checkWinner(Choice choice1, Choice choice2) {
if (choice2 == choice1) {
return 0;
} else if (choice1.value() == ((choice2.value() + 1) %3)) {
return 1;
} else return 2;
}
private Choice getChoiceAtRandom() {
return Choice.values()[new Random().nextInt(3)];
}
private Choice readChoice() {
System.out.println("Rock, paper or scissors?");
Scanner scanner = new Scanner(System.in);
String choice = scanner.next();
return Choice.valueOf(choice.toUpperCase());
}
public void doGameLoop() {
int counter = 0;
while (counter < 3) {
Choice userChoice = readChoice();
Choice computerChoice = getChoiceAtRandom();
int winner = checkWinner(userChoice, computerChoice);
if (winner == 0) {
System.out.println("Both " + userChoice + ". It’s a tie");
} else if (winner == 1) {
System.out.println("You win! You played " + userChoice
+ " and computer played " + computerChoice) ;
} else {
System.out.println("You lose. You played " + userChoice
+ " and computer played " + computerChoice) ;
}
counter++;
}
}
public static void main(String[] args) {
new RockPaperScissors().doGameLoop();
}
}
And that’s pretty much it — connoisseurs will appreciate the use of Scanner which I usually spit upon!
I highly recommend reading the Wikipedia entry for Rock, paper, scissors, it’s quite entertaining… Did you know it’s been used in a (US) federal court?!