diff --git a/.classpath b/.classpath
index 83f2c4a..e4beaea 100644
--- a/.classpath
+++ b/.classpath
@@ -7,11 +7,7 @@
-
-
-
-
-
+
diff --git a/src/dev/kske/chess/board/Board.java b/src/dev/kske/chess/board/Board.java
index 4ae9622..1a21ff4 100644
--- a/src/dev/kske/chess/board/Board.java
+++ b/src/dev/kske/chess/board/Board.java
@@ -545,7 +545,7 @@ public class Board implements Cloneable {
board.kingPos = new HashMap<>();
board.kingPos.putAll(kingPos);
- board.log = (Log) log.clone();
+ board.log = new Log(log);
return board;
}
diff --git a/src/dev/kske/chess/board/Log.java b/src/dev/kske/chess/board/Log.java
index 8bdb5e1..c05ae3f 100644
--- a/src/dev/kske/chess/board/Log.java
+++ b/src/dev/kske/chess/board/Log.java
@@ -1,7 +1,7 @@
package dev.kske.chess.board;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
import dev.kske.chess.board.Piece.Color;
@@ -11,7 +11,7 @@ import dev.kske.chess.board.Piece.Color;
* Created: 09.07.2019
* Author: Kai S. K. Engelbart
*/
-public class Log implements Cloneable {
+public class Log {
private MoveNode root, current;
@@ -23,21 +23,24 @@ public class Log implements Cloneable {
reset();
}
- // TODO: Adjust to variations
- @Override
- public Object clone() {
- Log log = null;
- try {
- log = (Log) super.clone();
- if (!isEmpty()) {
- log.current = (MoveNode) current.clone();
- if (current == root) log.root = log.current;
- else log.root = (MoveNode) root.clone();
- }
- } catch (CloneNotSupportedException e) {
- e.printStackTrace();
+ /**
+ * Creates a partial deep copy of another {@link Log} instance which begins with
+ * the current node.
+ *
+ * @param other The {@link Log} instance to copy
+ */
+ public Log(Log other) {
+ enPassant = other.enPassant;
+ activeColor = other.activeColor;
+ fullmoveCounter = other.fullmoveCounter;
+ halfmoveClock = other.halfmoveClock;
+
+ // The new root is the current node of the copied instance
+ if (!other.isEmpty()) {
+ root = new MoveNode(other.current);
+ root.parent = null;
+ current = root;
}
- return log;
}
/**
@@ -69,19 +72,12 @@ public class Log implements Cloneable {
* move.
*/
public void removeLast() {
- if (!isEmpty()) {
- if (current.parent == null) {
- current = null;
- root = null;
- } else {
- current = current.parent;
- if (!isEmpty()) {
- activeColor = current.activeColor;
- enPassant = current.enPassant;
- fullmoveCounter = current.fullmoveCounter;
- halfmoveClock = current.halfmoveClock;
- } else reset();
- }
+ if (!isEmpty() && current.parent != null) {
+ current = current.parent;
+ activeColor = current.activeColor;
+ enPassant = current.enPassant;
+ fullmoveCounter = current.fullmoveCounter;
+ halfmoveClock = current.halfmoveClock;
} else reset();
}
@@ -135,8 +131,19 @@ public class Log implements Cloneable {
public final int fullmoveCounter, halfmoveClock;
private MoveNode parent;
- private Set variations = new HashSet<>();
+ private List variations = new ArrayList<>();
+ /**
+ * Creates a new {@link MoveNode}
+ *
+ * @param move The logged {@link Move}
+ * @param capturedPiece The {@link Piece} captures by the logged {@link Move}
+ * @param enPassant The en passant {@link Position} valid after the logged
+ * {@link Move}, or {@code null} if there is none
+ * @param activeColor The {@link Color} active after the logged {@link Move}
+ * @param fullmoveCounter
+ * @param halfmoveClock
+ */
public MoveNode(Move move, Piece capturedPiece, Position enPassant, Color activeColor, int fullmoveCounter,
int halfmoveClock) {
this.move = move;
@@ -147,11 +154,26 @@ public class Log implements Cloneable {
this.halfmoveClock = halfmoveClock;
}
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
+ /**
+ * Creates a deep copy of another {@link MoveNode}.
+ *
+ * @param other The {@link MoveNode} to copy
+ */
+ public MoveNode(MoveNode other) {
+ this(other.move, other.capturedPiece, other.enPassant, other.activeColor, other.fullmoveCounter,
+ other.halfmoveClock);
+ other.variations.forEach(variation -> {
+ MoveNode copy = new MoveNode(variation);
+ copy.parent = this;
+ variations.add(copy);
+ });
}
+ /**
+ * Adds another {@link MoveNode} as a child node.
+ *
+ * @param variation The {@link MoveNode} to append to this {@link MoveNode}
+ */
public void addVariation(MoveNode variation) {
if (!variations.contains(variation)) {
variations.add(variation);
@@ -159,4 +181,4 @@ public class Log implements Cloneable {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/src/dev/kske/chess/ui/LogPanel.java b/src/dev/kske/chess/ui/LogPanel.java
index 21488e2..7343fb2 100644
--- a/src/dev/kske/chess/ui/LogPanel.java
+++ b/src/dev/kske/chess/ui/LogPanel.java
@@ -57,6 +57,7 @@ public class LogPanel extends JPanel implements Subscribable {
public void handle(Event> event) {
if (log == null) return;
+ // TODO: Display log with variations
final List moves = /* log.getLoggedMoves() */ new ArrayList<>();
String[][] data = new String[moves.size() / 2 + moves.size() % 2][2];
for (int i = 0; i < data.length; i++) {
diff --git a/test/dev/kske/chess/board/LogTest.java b/test/dev/kske/chess/board/LogTest.java
index 2c19a1c..2185ec8 100644
--- a/test/dev/kske/chess/board/LogTest.java
+++ b/test/dev/kske/chess/board/LogTest.java
@@ -39,7 +39,7 @@ class LogTest {
*/
@Test
void testClone() {
- Log other = (Log) log.clone();
+ Log other = new Log(log);
log.setActiveColor(Color.WHITE);
other.setActiveColor(Color.BLACK);
assertNotEquals(other.getActiveColor(), log.getActiveColor());