- Reorganized packages so that the computer agents are inside the model package.
- Added support for the player model inside Referee.java; high scores should now persist over a single execution of the program. - Refactored PlayerModel.java to support game logging. All games are now logged so that we can track overall progress. - Added scaffolding to allow saving and importing of PlayerModel.java. It is not yet functional, but it will be with two function implementations and then the appropriate calls.
This commit is contained in:
@@ -5,7 +5,8 @@ import java.awt.event.MouseListener;
|
|||||||
import java.awt.event.MouseWheelEvent;
|
import java.awt.event.MouseWheelEvent;
|
||||||
import java.awt.event.MouseWheelListener;
|
import java.awt.event.MouseWheelListener;
|
||||||
|
|
||||||
import player.HumanPlayer;
|
import model.comPlayer.HumanPlayer;
|
||||||
|
|
||||||
import view.Tile;
|
import view.Tile;
|
||||||
import view.TileSelectionPanel;
|
import view.TileSelectionPanel;
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ package controller;
|
|||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
|
|
||||||
import player.HumanPlayer;
|
|
||||||
|
|
||||||
import view.TileSelectionPanel;
|
import view.TileSelectionPanel;
|
||||||
|
|
||||||
import model.Board.TileColor;
|
import model.Board.TileColor;
|
||||||
|
import model.comPlayer.HumanPlayer;
|
||||||
|
|
||||||
public class TSPMouseListener implements MouseListener{
|
public class TSPMouseListener implements MouseListener{
|
||||||
private HumanPlayer pc;
|
private HumanPlayer pc;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package model;
|
package model;
|
||||||
|
|
||||||
import model.Board.TileColor;
|
import model.Board.TileColor;
|
||||||
|
import model.comPlayer.AlphaBetaComPlayer;
|
||||||
|
import model.comPlayer.HumanPlayer;
|
||||||
|
import model.comPlayer.Player;
|
||||||
import model.playerModel.PlayerModel;
|
import model.playerModel.PlayerModel;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import player.AlphaBetaComPlayer;
|
|
||||||
import player.HumanPlayer;
|
|
||||||
import player.Player;
|
|
||||||
import view.BoardPanel;
|
import view.BoardPanel;
|
||||||
import view.HighScoreDialog;
|
import view.HighScoreDialog;
|
||||||
import view.MainFrame;
|
import view.MainFrame;
|
||||||
@@ -27,10 +27,18 @@ public class Referee implements Runnable {
|
|||||||
private Player computerPlayer;
|
private Player computerPlayer;
|
||||||
|
|
||||||
private final HumanPlayer humanPlayer = new HumanPlayer();
|
private final HumanPlayer humanPlayer = new HumanPlayer();
|
||||||
|
|
||||||
private final MainFrame mf;
|
private final MainFrame mf;
|
||||||
|
private final PlayerModel playerModel;
|
||||||
|
|
||||||
public Referee(MainFrame mnFrm) {
|
public Referee(MainFrame mnFrm) {
|
||||||
|
if (PlayerModel.TRY_LOAD && PlayerModel.exists()) {
|
||||||
|
playerModel = PlayerModel.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
playerModel = new PlayerModel();
|
||||||
|
}
|
||||||
|
|
||||||
mf = mnFrm;
|
mf = mnFrm;
|
||||||
initGame();
|
initGame();
|
||||||
}
|
}
|
||||||
@@ -75,7 +83,8 @@ public class Referee implements Runnable {
|
|||||||
initGame();
|
initGame();
|
||||||
mf.updateBoard();
|
mf.updateBoard();
|
||||||
play();
|
play();
|
||||||
new HighScoreDialog(mf, new PlayerModel());
|
playerModel.logGame(getPlayerScore());
|
||||||
|
new HighScoreDialog(mf, playerModel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package player;
|
package model.comPlayer;
|
||||||
|
|
||||||
import model.Board;
|
import model.Board;
|
||||||
import model.Move;
|
import model.Move;
|
||||||
import player.generator.AlphaBetaMoveGenerator;
|
import model.comPlayer.generator.AlphaBetaMoveGenerator;
|
||||||
import player.generator.MoveGenerator;
|
import model.comPlayer.generator.MoveGenerator;
|
||||||
|
|
||||||
public class AlphaBetaComPlayer implements Player {
|
public class AlphaBetaComPlayer implements Player {
|
||||||
private MoveGenerator moveGenerator = new AlphaBetaMoveGenerator();
|
private MoveGenerator moveGenerator = new AlphaBetaMoveGenerator();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player;
|
package model.comPlayer;
|
||||||
|
|
||||||
import model.Board;
|
import model.Board;
|
||||||
import model.CellPointer;
|
import model.CellPointer;
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package player;
|
package model.comPlayer;
|
||||||
|
|
||||||
import model.Board;
|
import model.Board;
|
||||||
import model.Move;
|
import model.Move;
|
||||||
import player.generator.MinimaxMoveGenerator;
|
import model.comPlayer.generator.MinimaxMoveGenerator;
|
||||||
import player.generator.MoveGenerator;
|
import model.comPlayer.generator.MoveGenerator;
|
||||||
|
|
||||||
public class MinimaxComPlayer implements Player{
|
public class MinimaxComPlayer implements Player{
|
||||||
private MoveGenerator moveGenerator = new MinimaxMoveGenerator();
|
private MoveGenerator moveGenerator = new MinimaxMoveGenerator();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player;
|
package model.comPlayer;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player;
|
package model.comPlayer;
|
||||||
|
|
||||||
import model.Board;
|
import model.Board;
|
||||||
import model.Move;
|
import model.Move;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player;
|
package model.comPlayer;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player.generator;
|
package model.comPlayer.generator;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player.generator;
|
package model.comPlayer.generator;
|
||||||
|
|
||||||
public class GameScore {
|
public class GameScore {
|
||||||
boolean terminal;
|
boolean terminal;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player.generator;
|
package model.comPlayer.generator;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player.generator;
|
package model.comPlayer.generator;
|
||||||
|
|
||||||
import model.Move;
|
import model.Move;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player.generator;
|
package model.comPlayer.generator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package player.generator;
|
package model.comPlayer.generator;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
32
src/model/playerModel/GameLog.java
Normal file
32
src/model/playerModel/GameLog.java
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package model.playerModel;
|
||||||
|
|
||||||
|
public class GameLog implements Comparable<GameLog> {
|
||||||
|
public static boolean SORT_BY_SCORE = true;
|
||||||
|
private final int gameNum;
|
||||||
|
|
||||||
|
private final int score;
|
||||||
|
|
||||||
|
public GameLog(int scr, int gmNm) {
|
||||||
|
score = scr;
|
||||||
|
gameNum = gmNm;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(GameLog o) {
|
||||||
|
if (SORT_BY_SCORE) {
|
||||||
|
return o.getScore() - getScore();
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
return getGameNum() - o.getGameNum();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getGameNum() {
|
||||||
|
return gameNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getScore() {
|
||||||
|
return score;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,19 +1,44 @@
|
|||||||
package model.playerModel;
|
package model.playerModel;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import model.Board;
|
import model.Board;
|
||||||
import model.playerModel.node.InputNode;
|
import model.playerModel.node.InputNode;
|
||||||
import model.playerModel.node.SigmoidNode;
|
import model.playerModel.node.SigmoidNode;
|
||||||
|
|
||||||
public class PlayerModel {
|
public class PlayerModel implements Serializable {
|
||||||
|
|
||||||
public static final Random rand = new Random();
|
public static final String PLAYER_MODEL_PATH = "playerModel.dat"; // Path to
|
||||||
|
// the
|
||||||
|
// stored
|
||||||
|
// player
|
||||||
|
// model.
|
||||||
|
public static final Random rand = new Random(); // Randomizer object.
|
||||||
|
public static final boolean TRY_LOAD = true; // Set to false if any existing
|
||||||
|
// player model should be
|
||||||
|
// discarded and the next
|
||||||
|
// game should begin a new
|
||||||
|
// sequence.
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public static boolean exists() {
|
||||||
|
return (new File(PLAYER_MODEL_PATH)).exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PlayerModel load() {
|
||||||
|
// TODO Import the PlayerModel from a file.
|
||||||
|
return new PlayerModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GAME_COUNTER = 0;
|
||||||
private final SigmoidNode[] hiddenLayer;
|
private final SigmoidNode[] hiddenLayer;
|
||||||
private final int[] highScore = new int[10];
|
|
||||||
|
|
||||||
private int highScoresAchieved = 0;
|
private int highScoresAchieved = 0;
|
||||||
|
|
||||||
// One node for each tile-color combination, plus one for each upcoming
|
// One node for each tile-color combination, plus one for each upcoming
|
||||||
// tile-color combination.
|
// tile-color combination.
|
||||||
private final InputNode[] inputNode = new InputNode[(Board.NUM_COLS
|
private final InputNode[] inputNode = new InputNode[(Board.NUM_COLS
|
||||||
@@ -34,11 +59,9 @@ public class PlayerModel {
|
|||||||
// should be placed.
|
// should be placed.
|
||||||
private final SigmoidNode[] outputNode = new SigmoidNode[(Board.NUM_COLS * Board.NUM_ROWS) + 4];
|
private final SigmoidNode[] outputNode = new SigmoidNode[(Board.NUM_COLS * Board.NUM_ROWS) + 4];
|
||||||
|
|
||||||
public PlayerModel() {
|
private final ArrayList<GameLog> scores = new ArrayList<GameLog>();
|
||||||
for (int i = 0; i < highScore.length; i++) {
|
|
||||||
highScore[i] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public PlayerModel() {
|
||||||
hiddenLayer = new SigmoidNode[inputNode.length
|
hiddenLayer = new SigmoidNode[inputNode.length
|
||||||
+ ((inputNode.length * 2) / 3)];
|
+ ((inputNode.length * 2) / 3)];
|
||||||
|
|
||||||
@@ -64,7 +87,23 @@ public class PlayerModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int[] getHighScores() {
|
public int[] getHighScores() {
|
||||||
return highScore;
|
GameLog.SORT_BY_SCORE = true;
|
||||||
|
|
||||||
|
Collections.sort(scores);
|
||||||
|
|
||||||
|
int[] highScores = new int[10];
|
||||||
|
|
||||||
|
for (int i = 0; i < highScores.length; i++) {
|
||||||
|
if (i >= scores.size()) {
|
||||||
|
highScores[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
highScores[i] = scores.get(i).getScore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return highScores;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean[] getPrediction(boolean[] input) {
|
public boolean[] getPrediction(boolean[] input) {
|
||||||
@@ -124,25 +163,15 @@ public class PlayerModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void logGame(int score) {
|
public void logGame(int score) {
|
||||||
if (highScore[0] == -1) {
|
scores.add(new GameLog(score, GAME_COUNTER));
|
||||||
highScore[0] = score;
|
GAME_COUNTER++;
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
loop: for (int i = 0; i < highScore.length; i++) {
|
|
||||||
if (score > highScore[i]) {
|
|
||||||
for (int j = highScore.length - 2; j >= i; j--) {
|
|
||||||
highScore[j + 1] = highScore[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
highScore[i] = score;
|
|
||||||
break loop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
highScoresAchieved += (score == highScore[0]) ? 1 : 0;
|
|
||||||
nextHighInGames--;
|
nextHighInGames--;
|
||||||
|
highScoresAchieved += (score == getHighScore()) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean save() {
|
||||||
|
// TODO Implement saving.
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void train(boolean[] example) {
|
public void train(boolean[] example) {
|
||||||
@@ -154,6 +183,6 @@ public class PlayerModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int getHighScore() {
|
private int getHighScore() {
|
||||||
return highScore[0];
|
return getHighScores()[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ import javax.swing.JLabel;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import player.HumanPlayer;
|
|
||||||
|
|
||||||
import controller.TSPMouseListener;
|
import controller.TSPMouseListener;
|
||||||
|
|
||||||
import model.Board.TileColor;
|
import model.Board.TileColor;
|
||||||
|
import model.comPlayer.HumanPlayer;
|
||||||
|
|
||||||
public class TileSelectionPanel extends JPanel {
|
public class TileSelectionPanel extends JPanel {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user