import java.io.*;
import java.util.*;
class Nim {
public static void main(String[] args) {
ConsoleReader console = new ConsoleReader(System.in);
Random generator = new Random();
int height = Math.abs(generator.nextInt()) % 90 + 10;
PileOfMarbles pile = new PileOfMarbles(height);
System.out.println("You are working with a pile of height: "
+ pile.report());
int number, currentHeight;
while (true) {
System.out.println("*** Computer moves.");
System.out.println("Pile of marbles of height: " + pile.report());
currentHeight = pile.report();
if (currentHeight == 1) {
number = 1;
} else {
number = Math.abs(generator.nextInt()) % (currentHeight / 2) + 1;
}
System.out.println("Computer chooses to remove: "
+ number + " marbles.");
pile.move(number);
System.out.println("--------------------------");
System.out.println("*** Now the user has to move.");
System.out.println("Pile of marbles of height: " + pile.report());
System.out.print("Please enter number of marbles you want to take: ");
number = console.readInt();
pile.move(number);
System.out.println("--------------------------");
}
}
}
class PileOfMarbles {
int height;
PileOfMarbles (int height) {
this.height = height;
}
int report() {
return this.height;
}
void move(int number) {
System.out.println("***Removing " + number + " marbles from the pile.");
if (number <= 0 ||
((number > height / 2) && (number != 1))) {
// A player must take at least one but at most half of the marbles.
// (The players take turns, the one who takes the last marble loses).
// How do you write that?
System.out.println("***Bad move: you lose.");
System.exit(0);
} else {
this.height -= number;
if (this.height == 0) {
System.out.println("***End of game: you lost.");
System.exit(0);
}
}
System.out.println("Pile of marbles is now: " + this.report());
}
}
class ConsoleReader {
public ConsoleReader(InputStream inStream) {
reader = new BufferedReader(
new InputStreamReader(
inStream));
}
public String readLine() {
String inputLine = "";
try {
inputLine = reader.readLine();
} catch (IOException e) {
System.out.println(e);
System.exit(1);
}
return inputLine;
}
public int readInt() {
String inputString = readLine();
int n = Integer.parseInt(inputString);
return n;
}
public double readDouble() {
String inputString = readLine();
double x = Double.parseDouble(inputString);
return x;
}
private BufferedReader reader;
}