136 lines
6.3 KiB
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");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|