RosettaCodeData/Task/21-game/Java/21-game.java

136 lines
6.3 KiB
Java

import java.util.Random;
import java.util.Scanner;
public class TwentyOneGame {
public static void main(String[] args) {
new TwentyOneGame().run(true, 21, new int[] {1, 2, 3});
}
public void run(boolean computerPlay, int max, int[] valid) {
String comma = "";
for ( int i = 0 ; i < valid.length ; i++ ) {
comma += valid[i];
if ( i < valid.length - 2 && valid.length >= 3 ) {
comma += ", ";
}
if ( i == valid.length - 2 ) {
comma += " or ";
}
}
System.out.printf("The %d game.%nEach player chooses to add %s to a running total.%n" +
"The player whose turn it is when the total reaches %d will win the game.%n" +
"Winner of the game starts the next game. Enter q to quit.%n%n", max, comma, max);
int cGames = 0;
int hGames = 0;
boolean anotherGame = true;
try (Scanner scanner = new Scanner(System.in);) {
while ( anotherGame ) {
Random r = new Random();
int round = 0;
int total = 0;
System.out.printf("Start game %d%n", hGames + cGames + 1);
DONE:
while ( true ) {
round++;
System.out.printf("ROUND %d:%n%n", round);
for ( int play = 0 ; play < 2 ; play++ ) {
if ( computerPlay ) {
int guess = 0;
// try find one equal
for ( int test : valid ) {
if ( total + test == max ) {
guess = test;
break;
}
}
// try find one greater than
if ( guess == 0 ) {
for ( int test : valid ) {
if ( total + test >= max ) {
guess = test;
break;
}
}
}
if ( guess == 0 ) {
guess = valid[r.nextInt(valid.length)];
}
total += guess;
System.out.printf("The computer chooses %d%n", guess);
System.out.printf("Running total is now %d%n%n", total);
if ( total >= max ) {
break DONE;
}
}
else {
while ( true ) {
System.out.printf("Your choice among %s: ", comma);
String line = scanner.nextLine();
if ( line.matches("^[qQ].*") ) {
System.out.printf("Computer wins %d game%s, human wins %d game%s. One game incomplete.%nQuitting.%n", cGames, cGames == 1 ? "" : "s", hGames, hGames == 1 ? "" : "s");
return;
}
try {
int input = Integer.parseInt(line);
boolean inputOk = false;
for ( int test : valid ) {
if ( input == test ) {
inputOk = true;
break;
}
}
if ( inputOk ) {
total += input;
System.out.printf("Running total is now %d%n%n", total);
if ( total >= max ) {
break DONE;
}
break;
}
else {
System.out.printf("Invalid input - must be a number among %s. Try again.%n", comma);
}
}
catch (NumberFormatException e) {
System.out.printf("Invalid input - must be a number among %s. Try again.%n", comma);
}
}
}
computerPlay = !computerPlay;
}
}
String win;
if ( computerPlay ) {
win = "Computer wins!!";
cGames++;
}
else {
win = "You win and probably had help from another computer!!";
hGames++;
}
System.out.printf("%s%n", win);
System.out.printf("Computer wins %d game%s, human wins %d game%s%n%n", cGames, cGames == 1 ? "" : "s", hGames, hGames == 1 ? "" : "s");
while ( true ) {
System.out.printf("Another game (y/n)? ");
String line = scanner.nextLine();
if ( line.matches("^[yY]$") ) {
// OK
System.out.printf("%n");
break;
}
else if ( line.matches("^[nN]$") ) {
anotherGame = false;
System.out.printf("Quitting.%n");
break;
}
else {
System.out.printf("Invalid input - must be a y or n. Try again.%n");
}
}
}
}
}
}