diff --git a/src/controller/BoardPanelMouseListener.java b/src/controller/BoardPanelMouseListener.java index b758464..2a21bd9 100644 --- a/src/controller/BoardPanelMouseListener.java +++ b/src/controller/BoardPanelMouseListener.java @@ -5,7 +5,8 @@ import java.awt.event.MouseListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; -import player.HumanPlayer; +import model.comPlayer.HumanPlayer; + import view.Tile; import view.TileSelectionPanel; diff --git a/src/controller/TSPMouseListener.java b/src/controller/TSPMouseListener.java index c92cd63..25a2106 100644 --- a/src/controller/TSPMouseListener.java +++ b/src/controller/TSPMouseListener.java @@ -3,11 +3,11 @@ package controller; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; -import player.HumanPlayer; import view.TileSelectionPanel; import model.Board.TileColor; +import model.comPlayer.HumanPlayer; public class TSPMouseListener implements MouseListener{ private HumanPlayer pc; diff --git a/src/model/Referee.java b/src/model/Referee.java index 06172a6..d8ca0b1 100644 --- a/src/model/Referee.java +++ b/src/model/Referee.java @@ -1,13 +1,13 @@ package model; import model.Board.TileColor; +import model.comPlayer.AlphaBetaComPlayer; +import model.comPlayer.HumanPlayer; +import model.comPlayer.Player; import model.playerModel.PlayerModel; import org.apache.log4j.Logger; -import player.AlphaBetaComPlayer; -import player.HumanPlayer; -import player.Player; import view.BoardPanel; import view.HighScoreDialog; import view.MainFrame; @@ -27,10 +27,18 @@ public class Referee implements Runnable { private Player computerPlayer; private final HumanPlayer humanPlayer = new HumanPlayer(); - private final MainFrame mf; + private final PlayerModel playerModel; public Referee(MainFrame mnFrm) { + if (PlayerModel.TRY_LOAD && PlayerModel.exists()) { + playerModel = PlayerModel.load(); + } + + else { + playerModel = new PlayerModel(); + } + mf = mnFrm; initGame(); } @@ -75,7 +83,8 @@ public class Referee implements Runnable { initGame(); mf.updateBoard(); play(); - new HighScoreDialog(mf, new PlayerModel()); + playerModel.logGame(getPlayerScore()); + new HighScoreDialog(mf, playerModel); } } diff --git a/src/player/AlphaBetaComPlayer.java b/src/model/comPlayer/AlphaBetaComPlayer.java similarity index 78% rename from src/player/AlphaBetaComPlayer.java rename to src/model/comPlayer/AlphaBetaComPlayer.java index 79a51ed..5289fa6 100644 --- a/src/player/AlphaBetaComPlayer.java +++ b/src/model/comPlayer/AlphaBetaComPlayer.java @@ -1,9 +1,9 @@ -package player; +package model.comPlayer; import model.Board; import model.Move; -import player.generator.AlphaBetaMoveGenerator; -import player.generator.MoveGenerator; +import model.comPlayer.generator.AlphaBetaMoveGenerator; +import model.comPlayer.generator.MoveGenerator; public class AlphaBetaComPlayer implements Player { private MoveGenerator moveGenerator = new AlphaBetaMoveGenerator(); diff --git a/src/player/HumanPlayer.java b/src/model/comPlayer/HumanPlayer.java similarity index 98% rename from src/player/HumanPlayer.java rename to src/model/comPlayer/HumanPlayer.java index f07f6fe..c0ae924 100644 --- a/src/player/HumanPlayer.java +++ b/src/model/comPlayer/HumanPlayer.java @@ -1,4 +1,4 @@ -package player; +package model.comPlayer; import model.Board; import model.CellPointer; diff --git a/src/player/MinimaxComPlayer.java b/src/model/comPlayer/MinimaxComPlayer.java similarity index 78% rename from src/player/MinimaxComPlayer.java rename to src/model/comPlayer/MinimaxComPlayer.java index 5fc4e07..520132c 100644 --- a/src/player/MinimaxComPlayer.java +++ b/src/model/comPlayer/MinimaxComPlayer.java @@ -1,9 +1,9 @@ -package player; +package model.comPlayer; import model.Board; import model.Move; -import player.generator.MinimaxMoveGenerator; -import player.generator.MoveGenerator; +import model.comPlayer.generator.MinimaxMoveGenerator; +import model.comPlayer.generator.MoveGenerator; public class MinimaxComPlayer implements Player{ private MoveGenerator moveGenerator = new MinimaxMoveGenerator(); diff --git a/src/player/MonteCarloComPlayer.java b/src/model/comPlayer/MonteCarloComPlayer.java similarity index 97% rename from src/player/MonteCarloComPlayer.java rename to src/model/comPlayer/MonteCarloComPlayer.java index 061393a..44a216c 100644 --- a/src/player/MonteCarloComPlayer.java +++ b/src/model/comPlayer/MonteCarloComPlayer.java @@ -1,4 +1,4 @@ -package player; +package model.comPlayer; import java.util.Random; diff --git a/src/player/Player.java b/src/model/comPlayer/Player.java similarity index 94% rename from src/player/Player.java rename to src/model/comPlayer/Player.java index 625a77e..2467a42 100644 --- a/src/player/Player.java +++ b/src/model/comPlayer/Player.java @@ -1,4 +1,4 @@ -package player; +package model.comPlayer; import model.Board; import model.Move; diff --git a/src/player/RandomComPlayer.java b/src/model/comPlayer/RandomComPlayer.java similarity index 97% rename from src/player/RandomComPlayer.java rename to src/model/comPlayer/RandomComPlayer.java index cf791ac..db769ff 100644 --- a/src/player/RandomComPlayer.java +++ b/src/model/comPlayer/RandomComPlayer.java @@ -1,4 +1,4 @@ -package player; +package model.comPlayer; import java.util.Random; diff --git a/src/player/generator/AlphaBetaMoveGenerator.java b/src/model/comPlayer/generator/AlphaBetaMoveGenerator.java similarity index 98% rename from src/player/generator/AlphaBetaMoveGenerator.java rename to src/model/comPlayer/generator/AlphaBetaMoveGenerator.java index 32b3ed9..76aeb36 100644 --- a/src/player/generator/AlphaBetaMoveGenerator.java +++ b/src/model/comPlayer/generator/AlphaBetaMoveGenerator.java @@ -1,4 +1,4 @@ -package player.generator; +package model.comPlayer.generator; import java.util.Arrays; import java.util.List; diff --git a/src/player/generator/GameScore.java b/src/model/comPlayer/generator/GameScore.java similarity index 91% rename from src/player/generator/GameScore.java rename to src/model/comPlayer/generator/GameScore.java index e99c281..1688d78 100644 --- a/src/player/generator/GameScore.java +++ b/src/model/comPlayer/generator/GameScore.java @@ -1,4 +1,4 @@ -package player.generator; +package model.comPlayer.generator; public class GameScore { boolean terminal; diff --git a/src/player/generator/MinimaxMoveGenerator.java b/src/model/comPlayer/generator/MinimaxMoveGenerator.java similarity index 98% rename from src/player/generator/MinimaxMoveGenerator.java rename to src/model/comPlayer/generator/MinimaxMoveGenerator.java index d90ef91..ea6d256 100644 --- a/src/player/generator/MinimaxMoveGenerator.java +++ b/src/model/comPlayer/generator/MinimaxMoveGenerator.java @@ -1,4 +1,4 @@ -package player.generator; +package model.comPlayer.generator; import java.util.Arrays; import java.util.List; diff --git a/src/player/generator/MoveCandidate.java b/src/model/comPlayer/generator/MoveCandidate.java similarity index 85% rename from src/player/generator/MoveCandidate.java rename to src/model/comPlayer/generator/MoveCandidate.java index 562a0d4..c4cc1bf 100644 --- a/src/player/generator/MoveCandidate.java +++ b/src/model/comPlayer/generator/MoveCandidate.java @@ -1,4 +1,4 @@ -package player.generator; +package model.comPlayer.generator; import model.Move; diff --git a/src/player/generator/MoveGenerator.java b/src/model/comPlayer/generator/MoveGenerator.java similarity index 88% rename from src/player/generator/MoveGenerator.java rename to src/model/comPlayer/generator/MoveGenerator.java index ee64b91..1638d8c 100644 --- a/src/player/generator/MoveGenerator.java +++ b/src/model/comPlayer/generator/MoveGenerator.java @@ -1,4 +1,4 @@ -package player.generator; +package model.comPlayer.generator; import java.util.List; diff --git a/src/player/generator/ValidMoveGenerator.java b/src/model/comPlayer/generator/ValidMoveGenerator.java similarity index 96% rename from src/player/generator/ValidMoveGenerator.java rename to src/model/comPlayer/generator/ValidMoveGenerator.java index 59f4475..eb97649 100644 --- a/src/player/generator/ValidMoveGenerator.java +++ b/src/model/comPlayer/generator/ValidMoveGenerator.java @@ -1,4 +1,4 @@ -package player.generator; +package model.comPlayer.generator; import java.util.ArrayList; import java.util.Collections; diff --git a/src/model/playerModel/GameLog.java b/src/model/playerModel/GameLog.java new file mode 100644 index 0000000..4d223c6 --- /dev/null +++ b/src/model/playerModel/GameLog.java @@ -0,0 +1,32 @@ +package model.playerModel; + +public class GameLog implements Comparable { + 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; + } +} diff --git a/src/model/playerModel/PlayerModel.java b/src/model/playerModel/PlayerModel.java index 7cd2be7..912bb2a 100644 --- a/src/model/playerModel/PlayerModel.java +++ b/src/model/playerModel/PlayerModel.java @@ -1,19 +1,44 @@ package model.playerModel; +import java.io.File; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; import java.util.Random; import model.Board; import model.playerModel.node.InputNode; 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 int[] highScore = new int[10]; - private int highScoresAchieved = 0; + // One node for each tile-color combination, plus one for each upcoming // tile-color combination. private final InputNode[] inputNode = new InputNode[(Board.NUM_COLS @@ -34,11 +59,9 @@ public class PlayerModel { // should be placed. private final SigmoidNode[] outputNode = new SigmoidNode[(Board.NUM_COLS * Board.NUM_ROWS) + 4]; - public PlayerModel() { - for (int i = 0; i < highScore.length; i++) { - highScore[i] = -1; - } + private final ArrayList scores = new ArrayList(); + public PlayerModel() { hiddenLayer = new SigmoidNode[inputNode.length + ((inputNode.length * 2) / 3)]; @@ -64,7 +87,23 @@ public class PlayerModel { } 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) { @@ -124,25 +163,15 @@ public class PlayerModel { } public void logGame(int score) { - if (highScore[0] == -1) { - highScore[0] = score; - } - - 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; + scores.add(new GameLog(score, GAME_COUNTER)); + GAME_COUNTER++; nextHighInGames--; + highScoresAchieved += (score == getHighScore()) ? 1 : 0; + } + + public boolean save() { + // TODO Implement saving. + return false; } public void train(boolean[] example) { @@ -154,6 +183,6 @@ public class PlayerModel { } private int getHighScore() { - return highScore[0]; + return getHighScores()[0]; } } diff --git a/src/view/TileSelectionPanel.java b/src/view/TileSelectionPanel.java index 425e09e..e8fa32b 100644 --- a/src/view/TileSelectionPanel.java +++ b/src/view/TileSelectionPanel.java @@ -9,11 +9,11 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; -import player.HumanPlayer; import controller.TSPMouseListener; import model.Board.TileColor; +import model.comPlayer.HumanPlayer; public class TileSelectionPanel extends JPanel {