/** * Run the game with time limit (asynchronous mode). This is how it will be done in the * competition. Can be played with and without visual display of game states. * * @param pacManController The Pac-Man controller * @param ghostController The Ghosts controller * @param visual Indicates whether or not to use visuals */ public void runGameTimed( Controller<MOVE> pacManController, Controller<EnumMap<GHOST, MOVE>> ghostController, boolean visual) { Game game = new Game(0); GameView gv = null; if (visual) gv = new GameView(game).showGame(); if (pacManController instanceof HumanController) gv.getFrame().addKeyListener(((HumanController) pacManController).getKeyboardInput()); new Thread(pacManController).start(); new Thread(ghostController).start(); while (!game.gameOver()) { pacManController.update(game.copy(), System.currentTimeMillis() + DELAY); ghostController.update(game.copy(), System.currentTimeMillis() + DELAY); try { Thread.sleep(DELAY); } catch (InterruptedException e) { e.printStackTrace(); } game.advanceGame(pacManController.getMove(), ghostController.getMove()); if (visual) gv.repaint(); } pacManController.terminate(); ghostController.terminate(); }
/** * Run a game in asynchronous mode: the game waits until a move is returned. In order to slow * thing down in case the controllers return very quickly, a time limit can be used. If fasted * gameplay is required, this delay should be put as 0. * * @param pacManController The Pac-Man controller * @param ghostController The Ghosts controller * @param visual Indicates whether or not to use visuals * @param delay The delay between time-steps */ public void runGame( Controller<MOVE> pacManController, Controller<EnumMap<GHOST, MOVE>> ghostController, boolean visual, int delay) { try { PrintStream out = new PrintStream("replay.txt"); Game game = new Game(0); GameView gv = null; if (visual) gv = new GameView(game).showGame(); while (!game.gameOver()) { game.advanceGame( pacManController.getMove(game.copy(), -1), ghostController.getMove(game.copy(), System.currentTimeMillis() + Long.MAX_VALUE)); try { Thread.sleep(delay); } catch (Exception e) { } if (visual) gv.repaint(); out.println(game.getGameState()); out.flush(); } out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
/** * Run the game in asynchronous mode but proceed as soon as both controllers replied. The time * limit still applies so so the game will proceed after 40ms regardless of whether the * controllers managed to calculate a turn. * * @param pacManController The Pac-Man controller * @param ghostController The Ghosts controller * @param fixedTime Whether or not to wait until 40ms are up even if both controllers already * responded * @param visual Indicates whether or not to use visuals */ public void runGameTimedSpeedOptimised( Controller<MOVE> pacManController, Controller<EnumMap<GHOST, MOVE>> ghostController, boolean fixedTime, boolean visual) { Game game = new Game(0); GameView gv = null; if (visual) gv = new GameView(game).showGame(); if (pacManController instanceof HumanController) gv.getFrame().addKeyListener(((HumanController) pacManController).getKeyboardInput()); new Thread(pacManController).start(); new Thread(ghostController).start(); while (!game.gameOver()) { pacManController.update(game.copy(), System.currentTimeMillis() + DELAY); ghostController.update(game.copy(), System.currentTimeMillis() + DELAY); try { int waited = DELAY / INTERVAL_WAIT; for (int j = 0; j < DELAY / INTERVAL_WAIT; j++) { Thread.sleep(INTERVAL_WAIT); if (pacManController.hasComputed() && ghostController.hasComputed()) { waited = j; break; } } if (fixedTime) Thread.sleep(((DELAY / INTERVAL_WAIT) - waited) * INTERVAL_WAIT); game.advanceGame(pacManController.getMove(), ghostController.getMove()); } catch (InterruptedException e) { e.printStackTrace(); } if (visual) gv.repaint(); } pacManController.terminate(); ghostController.terminate(); }
/** * Replay a previously saved game. * * @param fileName The file name of the game to be played * @param visual Indicates whether or not to use visuals */ public void replayGame(String fileName, boolean visual) { ArrayList<String> timeSteps = loadReplay(fileName); Game game = new Game(0); GameView gv = null; if (visual) gv = new GameView(game).showGame(); for (int j = 0; j < timeSteps.size(); j++) { game.setGameState(timeSteps.get(j)); try { Thread.sleep(DELAY); } catch (InterruptedException e) { e.printStackTrace(); } if (visual) gv.repaint(); } }