diff --git a/src/model/Referee.java b/src/model/Referee.java index d8ca0b1..07b8e96 100644 --- a/src/model/Referee.java +++ b/src/model/Referee.java @@ -28,14 +28,14 @@ public class Referee implements Runnable { private final HumanPlayer humanPlayer = new HumanPlayer(); private final MainFrame mf; - private final PlayerModel playerModel; + private PlayerModel playerModel = null; public Referee(MainFrame mnFrm) { if (PlayerModel.TRY_LOAD && PlayerModel.exists()) { playerModel = PlayerModel.load(); } - else { + if (playerModel == null) { playerModel = new PlayerModel(); } @@ -84,6 +84,11 @@ public class Referee implements Runnable { mf.updateBoard(); play(); playerModel.logGame(getPlayerScore()); + + if (!playerModel.save()) { + System.err.println("Saving PlayerModel failed."); + } + new HighScoreDialog(mf, playerModel); } } diff --git a/src/model/playerModel/GameLog.java b/src/model/playerModel/GameLog.java index 4d223c6..37e4609 100644 --- a/src/model/playerModel/GameLog.java +++ b/src/model/playerModel/GameLog.java @@ -1,7 +1,10 @@ package model.playerModel; -public class GameLog implements Comparable { +import java.io.Serializable; + +public class GameLog implements Comparable, Serializable { public static boolean SORT_BY_SCORE = true; + private static final long serialVersionUID = 1L; private final int gameNum; private final int score; diff --git a/src/model/playerModel/Node.java b/src/model/playerModel/Node.java index 1eea00e..9f4c359 100644 --- a/src/model/playerModel/Node.java +++ b/src/model/playerModel/Node.java @@ -1,6 +1,8 @@ package model.playerModel; -public interface Node { +import java.io.Serializable; + +public interface Node extends Serializable { boolean axon(); diff --git a/src/model/playerModel/PlayerModel.java b/src/model/playerModel/PlayerModel.java index 912bb2a..bebb524 100644 --- a/src/model/playerModel/PlayerModel.java +++ b/src/model/playerModel/PlayerModel.java @@ -1,6 +1,11 @@ package model.playerModel; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -31,8 +36,18 @@ public class PlayerModel implements Serializable { } public static PlayerModel load() { - // TODO Import the PlayerModel from a file. - return new PlayerModel(); + FileInputStream fin = null; + ObjectInputStream oin = null; + + try { + fin = new FileInputStream(PLAYER_MODEL_PATH); + oin = new ObjectInputStream(fin); + PlayerModel pm = (PlayerModel) oin.readObject(); + oin.close(); + return pm; + } catch (Exception e) { + return null; + } } private int GAME_COUNTER = 0; @@ -170,8 +185,17 @@ public class PlayerModel implements Serializable { } public boolean save() { - // TODO Implement saving. - return false; + FileOutputStream fout = null; + ObjectOutputStream oout = null; + try { + fout = new FileOutputStream(PLAYER_MODEL_PATH); + oout = new ObjectOutputStream(fout); + oout.writeObject(this); + oout.close(); + return true; + } catch (IOException ex) { + return false; + } } public void train(boolean[] example) { diff --git a/src/model/playerModel/node/InputNode.java b/src/model/playerModel/node/InputNode.java index 53a6418..6fee3f4 100644 --- a/src/model/playerModel/node/InputNode.java +++ b/src/model/playerModel/node/InputNode.java @@ -4,6 +4,7 @@ import model.playerModel.Node; public class InputNode implements Node { + private static final long serialVersionUID = 1L; private boolean dendrite = false; @Override diff --git a/src/model/playerModel/node/SigmoidNode.java b/src/model/playerModel/node/SigmoidNode.java index 7772a72..c19c02a 100644 --- a/src/model/playerModel/node/SigmoidNode.java +++ b/src/model/playerModel/node/SigmoidNode.java @@ -6,6 +6,8 @@ import model.playerModel.Node; public class SigmoidNode implements Node { + private static final long serialVersionUID = 1L; + // Training rate. private final double A = .15; diff --git a/test/puzzleTests/AllTests.java b/test/puzzleTests/AllTests.java new file mode 100644 index 0000000..efae040 --- /dev/null +++ b/test/puzzleTests/AllTests.java @@ -0,0 +1,17 @@ +package puzzleTests; + +import junit.framework.Test; +import junit.framework.TestSuite; + +public class AllTests { + + public static Test suite() { + TestSuite suite = new TestSuite( + "Tests for edu.gatech.cc.arktos.testcases"); + // $JUnit-BEGIN$ + suite.addTestSuite(Tests.class); + // $JUnit-END$ + return suite; + } + +} diff --git a/test/puzzleTests/Tests.java b/test/puzzleTests/Tests.java new file mode 100644 index 0000000..4af06f3 --- /dev/null +++ b/test/puzzleTests/Tests.java @@ -0,0 +1,118 @@ +package puzzleTests; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import junit.framework.TestCase; +import model.playerModel.PlayerModel; + +public class Tests extends TestCase { + + public static PlayerModel getFakePlayerModel() { + PlayerModel pm = new PlayerModel(); + + pm.logGame(25); + pm.logGame(30); + pm.logGame(26); + pm.logGame(34); + pm.logGame(22); + pm.logGame(30); + pm.logGame(60); + + return pm; + } + + public void testHighScores() { + PlayerModel pm = getFakePlayerModel(); + int[] highScores = pm.getHighScores(); + + assertEquals(highScores.length, 10); + assertEquals(highScores[0], 60); + assertEquals(highScores[1], 34); + assertEquals(highScores[2], 30); + assertEquals(highScores[3], 30); + assertEquals(highScores[4], 26); + assertEquals(highScores[5], 25); + assertEquals(highScores[6], 22); + assertEquals(highScores[7], -1); + assertEquals(highScores[8], -1); + assertEquals(highScores[9], -1); + } + + public void testSerializationInput() { + PlayerModel pm = getFakePlayerModel(); + + FileOutputStream fout = null; + ObjectOutputStream oout = null; + + FileInputStream fin = null; + ObjectInputStream oin = null; + try { + fout = new FileOutputStream("test/PlayerModel.dat"); + oout = new ObjectOutputStream(fout); + oout.writeObject(pm); + oout.close(); + } catch (IOException ex) { + ex.printStackTrace(); + fail("Exception"); + } + + pm = null; + + try { + fin = new FileInputStream("test/PlayerModel.dat"); + + oin = new ObjectInputStream(fin); + pm = (PlayerModel) oin.readObject(); + + oin.close(); + + int[] highScores = pm.getHighScores(); + + assertEquals(highScores.length, 10); + assertEquals(highScores[0], 60); + assertEquals(highScores[1], 34); + assertEquals(highScores[2], 30); + assertEquals(highScores[3], 30); + assertEquals(highScores[4], 26); + assertEquals(highScores[5], 25); + assertEquals(highScores[6], 22); + assertEquals(highScores[7], -1); + assertEquals(highScores[8], -1); + assertEquals(highScores[9], -1); + + } catch (FileNotFoundException e) { + e.printStackTrace(); + fail("Exception"); + } catch (IOException e) { + e.printStackTrace(); + fail("Exception"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + fail("Exception"); + } + } + + public void testSerializationOutput() { + PlayerModel pm = getFakePlayerModel(); + + FileOutputStream fout = null; + ObjectOutputStream oout = null; + try { + fout = new FileOutputStream("test/PlayerModel.dat"); + oout = new ObjectOutputStream(fout); + oout.writeObject(pm); + oout.close(); + + assertTrue((new File("test/playerModel.dat")).exists()); + } catch (IOException ex) { + ex.printStackTrace(); + fail("Exception"); + } + } +}