2007 Game State
<< 2007StudentAnswerSheet | APQuestionsTrailIndex | 2006TimeIntervalAppointment >>
GameState
import java.util.ArrayList; public interface GameState { /** @return true if game over * false otherwise */ boolean isGameOver(); /** precondition isGameOver() returns true * @return the winner, or null if no winner */ Player getWinner(); /** precondition isGameOver() returns false * @return the player who has the next move */ Player getCurrentPlayer(); /** @return a list of valid moves */ ArrayList<String> getCurrentMoves(); /** updates the game state * @param move is the move to be made */ void makeMove(String move); /** @return a string version of the current GameState */ String toString(); }
Player
public class Player { private String name; //name of player public Player(String aName) { name = aName; } public String getName() { return name; } /** This chooses the first valid move * Override this method to define players with other strategies * @param state current state of the game * @return a string representing the move chosen * "no move" if there are no vaid moves */ public String getNextMove(GameState state) { return state.getCurrentMoves().get(0);//answer to part (a) } }
RandomPlayer
import java.util.ArrayList; class RandomPlayer { //part a here }
HumanPlayer
import java.util.ArrayList; import java.util.Scanner; class HumanNimPlayer extends Player { public HumanNimPlayer(String aName) { super(aName); } public String getNextMove(GameState state) { ArrayList<String> moves = state.getCurrentMoves(); int max=moves.size(); System.out.print("How many to remove? (1 to "+max+"):"); Scanner kb=new Scanner(System.in); int choice="0123".indexOf(kb.nextLine()); while (choice<1) { System.out.print("How many to remove? (1 to "+max+"):"); choice="0123".indexOf(kb.nextLine()); } if (choice==1) return "take1"; if (choice==2) return "take2"; return "take3"; } }
GameDriver
public class GameDriver { private GameState state; //the current state of the game public GameDriver(GameState initial) { state = initial; } /** Plays an entire game */ public void play() / { //part b here } }
NimGame
import java.util.*; /** * * There are 21 sticks in one pile. * Players alternate turns removing sticks. * The Winner is the one who removes the last stick. * Players may remove 1, 2, or 3 sticks when it is their turn. * * @author Chris Thiel * @version March 20 2008 */ public class Nim21 implements GameState { private ArrayList <String> moves; private boolean over; private Player one; private Player two; private int count; private int turn; public Nim21() { moves = new ArrayList (); moves.add("take1"); moves.add("take2"); moves.add("take3"); one = new ExpertNimPlayer("Expert"); two = new HumanNimPlayer("You "); over = false; count = 21; turn =1; } public boolean isGameOver() { return count<1; } public Player getWinner() { if (turn%2==0) { return one; }else { return two; } } public Player getCurrentPlayer() { if (turn%2==0) { return two; }else { return one; } } public ArrayList <String> getCurrentMoves() { if (count==2) moves.remove(2);//cannot take 3 if (count==1) moves.remove(1);//cannot take 2stat return moves; } /** * updates the gameState and prints it */ public void makeMove(String move) { if (move.equals("take1")) count--; if (move.equals("take2")) count-=2; if (move.equals("take3")) count-=3; if(count == 0) over = true; turn++; System.out.println(count+" sticks remain"); } public String toString() { return count+" sticks remain in one pile.\n Players alternate turns removing sticks.\n The Winner is the one who removes the last stick.\n Players may remove 1, 2, or 3 sticks when it is their turn."; } }