constructor(fen, moves)
{
this.moves = moves;
+ this.hashStates = {}; //for repetitions detection
// Use fen string to initialize variables, flags and board
this.board = VariantRules.GetBoard(fen);
this.setFlags(fen);
this.kingPos[c] = [move.start.x, move.start.y];
}
+ // Store a hash of the position + flags + turn after a move is played
+ // (for repetitions detection)
+ addHashState()
+ {
+ const strToHash = this.getFen() + " " + this.turn;
+ const hash = hex_md5(strToHash);
+ if (!this.hashStates[hash])
+ this.hashStates[hash] = 1;
+ else
+ this.hashStates[hash]++;
+ }
+
play(move, ingame)
{
+ // DEBUG:
+// if (!this.states) this.states = [];
+// if (!ingame) this.states.push(JSON.stringify(this.board));
+
if (!!ingame)
move.notation = [this.getNotation(move), this.getLongNotation(move)];
this.moves.push(move);
this.epSquares.push( this.getEpSquare(move) );
VariantRules.PlayOnBoard(this.board, move);
+
+ if (!!ingame)
+ this.addHashState();
}
undo(move)
this.moves.pop();
this.unupdateVariables(move);
this.parseFlags(JSON.parse(move.flags));
+
+ // DEBUG:
+// if (JSON.stringify(this.board) != this.states[this.states.length-1])
+// debugger;
+// this.states.pop();
}
//////////////
// END OF GAME
- // Basic check for 3 repetitions (in the last moves only)
- // TODO: extend to usual 3-repetition recognition (storing FEN with move?)
+ // Check for 3 repetitions (position + flags + turn)
checkRepetition()
{
- if (this.moves.length >= 8)
- {
- const L = this.moves.length;
- if (_.isEqual(this.moves[L-1], this.moves[L-5]) &&
- _.isEqual(this.moves[L-2], this.moves[L-6]) &&
- _.isEqual(this.moves[L-3], this.moves[L-7]) &&
- _.isEqual(this.moves[L-4], this.moves[L-8]))
- {
- return true;
- }
- }
- return false;
+ return Object.values(this.hashStates).some(elt => { return (elt >= 3); });
}
// Is game over ? And if yes, what is the score ?