That's right! I'm using my own talk page to pass homework stuff back and forth to myself from school to home. class Nim2 { public static void main(String [ ] args) { System.out.print("Welcome to Nim!\n\n\n");

EasyReader reader = new EasyReader(); int turn = 0; String dummy;

player p1 = new player(); //creates as many human players as the user wants int numofplay =p1.inputNum("How many players?(1-30) ",1,30); int humans = p1.inputNum("How many of these are human?", numofplay-9, numofplay); player pn[] = new player[numofplay]; System.out.print("\n");

//gives these players names and avatars for(int i = 0; i < humans; i++) { System.out.print("What's your name player "+(i+1)+"? "); String tempstrg; tempstrg = reader.readLine(); System.out.print("\nEnter a character to use as your" +" avatar: "); char tempchar = reader.readChar(); pn[i] = new player(tempstrg, tempchar); dummy = reader.readLine(); System.out.print("\n"); }


for(int i = 0; i < numofplay-humans; i++) { pn[i] = new AIplayer(i+1); } //creates a new "columns" object, which the user sets columns j = new columns(p1);

//mov will hold user inputs. After these are digested //pos will remember the position of the ">" int mov; int pos = 0;

//Lets the user play until there are no more tokens while(j.Gameover()==false) { j.displaytok(pos,pn[turn%numofplay]); mov = pn[0].inputNum("", 1, 9); //If the user enters "5" it calls removetok if(mov==5) { int oldMax = j.getmaxtok(); if(j.removetok(pos)==true) { turn++; AIplayer AI1 = new AIplayer(2); System.out.print(AI1.getNimSum(j)); if(oldMax - j.getmaxtok() != 0) pos = j.fudge(pos); } } //moves ">" if(j.goodpos(pos + j.move(mov))==true) pos += j.move(mov); // System.out.print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); } turn--; System.out.print("After " + (turn+1) + " turns " + pn[turn%numofplay].getname() + " lost the game!!\n\nWinner"); if(numofplay > 2) System.out.print("s");

System.out.print(": "); for(int i = 0; i < numofplay-1; i++) { turn++; System.out.print(pn[turn%numofplay].getname() + "\n "); if(numofplay > 2) System.out.print(" "); } System.out.print("\n"); }

}


class player { String name; char avatar;

player() {}

player(String usename, char useavatar) { name = usename; avatar = useavatar; }

String getname() {return name;}

char getavatar() {return avatar;}

public static int inputNum(String prompt, int min, int max) { if (min < 0) min = 0; System.out.print(prompt); EasyReader reader = new EasyReader(); String SNum = reader.readLine(); int rValue; //not-a-number test try { Integer wrap = new Integer(SNum); rValue = wrap.intValue(); } catch (NumberFormatException e) {rValue = inputNum("\nNot a number.\n" + prompt, min, max);} //too big too small test if(rValue < min || rValue > max) rValue = inputNum("Must be greater than " + (min-1) + " and less than " + (max+1) + ".\n" + prompt, min, max); return rValue; }

public static int inputNum(String prompt, int min, int max, columns unused) { if (min < 0) min = 0; System.out.print(prompt); EasyReader reader = new EasyReader(); String SNum = reader.readLine(); int rValue; //not-a-number test try { Integer wrap = new Integer(SNum); rValue = wrap.intValue(); } catch (NumberFormatException e) {rValue = inputNum("\nNot a number.\n" + prompt, min, max);} //too big too small test if(rValue < min || rValue > max) rValue = inputNum("Must be greater than " + (min-1) + " and less than " + (max+1) + ".\n" + prompt, min, max); return rValue; } }

class AIplayer extends player { AIplayer(int number) { name = "Computer" + number; String temp = "" + number; avatar = temp.charAt(0); }


static int pow(int base, int exponent) { Double result = new Double(Math.pow(base, exponent)); return result.intValue(); }


int getNimSum(columns reference) { int nimsum = 0; columns board = new columns(reference); for (int exp = 0; pow(2,exp) <= board.getmaxtok(); exp++) { int evnodd = 0; for (int col = 0; col < board.getcol(); col++) { evnodd += board.gettok(col) % pow(2,exp+1); if (board.gettok(col) % pow(2,exp+1) == 1) board.settok(col, board.gettok(col)-pow(2,exp)); } if ((evnodd / pow(2,exp) % 2) == 1) nimsum += pow(2,exp); } return nimsum; }

int choosePoint(columns board) { int nimsum = getNimSum(board); int col = 0; for(int tokens = 0; tokens >= nimsum && col <= board.getcol(); col++) tokens = board.gettok(col); return (board.getmaxtok() - nimsum) * board.getcol() + col; }

// public static int inputNum(String hidden1, int hidden2, int hidden3, columns board) // { // ; // } }

class columns { int mycol; int[] mytok;

//creates a useless dummy class columns(){}

columns(columns image) { mycol = image.getcol(); mytok = image.mytok; }

int gettok(int col) {return mytok[col];}

int getcol() {return mycol;}

void settok(int col, int tok) {mytok[col] = tok;}

//asks the user to set columns(player play) { //Sets "mycol" mycol = play.inputNum("How many columns do you want? ", 1, 20); System.out.print("\n");

//Sets "mytok" int [] toks = new int [mycol] ; for (int i = 0; i < mycol; i++) toks[i] = play.inputNum("Column "+ (i+1) + ": How many tokens do you want? ", 0, 50); mytok = toks; }

//returns the maximum tokens in all columns int getmaxtok() { int max = 0; for (int i = 0; i < mycol; i++) { if (mytok[i] > max) max = mytok[i]; } return max; }

//takes user input returns the change in position int move (int use) { int val=0; if(use==7||use==8||use==9) val=-1*mycol; if(use==1||use==2||use==3) val=mycol; if(use==7||use==4||use==1) val--; if(use==9||use==6||use==3) val++; return val; }

//returns vertical position based on value int posv(int use) {return getmaxtok() - use/mycol;}

//returns horizontal position based on value int posh(int use) {return use%mycol;}

//makes sure > is on the board boolean goodpos(int use) { if(posh(use) >=0 && posh(use) < mycol && posv(use) > 0 && posv(use) <= getmaxtok()) return true; else return false; }

int fudge (int pos) { int fudgeNum = posh(pos) + (getmaxtok()-mytok[posh(pos)]) * mycol; if(mytok[posh(pos)] == getmaxtok()) //example: # ># - return fudgeNum; else //example: # >- - return fudgeNum - mycol; }

//returns "true" when all tokens have been removed boolean Gameover() { for (int i = 0; i < mycol; i++) if(mytok[i] != 0) return false; return true; }

//removes tokens in a single column boolean removetok(int position) { int col = posh(position); int tokens = posv(position)-1; if(tokens < mytok[col]) { mytok[col] = tokens; return true; } else return false; }

//display token set up void displaytok(int point, player guy) { //note that the a 3x3 board will look like /* 0 1 2 ph

3 0 1 2 2 3 4 5 1 6 7 8 tok */ //pv and ph hold the ">"'s position int pv = posv(point); int ph = posh(point);

System.out.println(guy.getname() + "'s turn to move."); for (int i = getmaxtok(); i > 0; i--) { for (int j = 0; j < mycol; j++) { if (pv==i&&ph==j) System.out.print(guy.getavatar()); else System.out.print(" "); if(mytok[j] >= i) System.out.print("# "); else System.out.print ("- "); } System.out.print("\n"); } } }