return false;
}
- // TODO: IsGoodPosition to check that 2 knights are on the board...
+ static IsGoodPosition(position) {
+ if (!ChessRules.IsGoodPosition(position)) return false;
+ // Check that (at least) 2 knights per side are on the board
+ const rows = position.split("/");
+ let knights = { 'N': 0, 'n': 0 };
+ for (let row of rows) {
+ for (let i = 0; i < row.length; i++) {
+ if (['N','n'].includes(row[i])) knights[row[i]]++;
+ }
+ }
+ if (Object.values(knights).some(v => v < 2)) return false;
+ return true;
+ }
getPotentialMovesFrom([x, y]) {
let moves = super.getPotentialMovesFrom([x, y]);
// Check if a (non-knight) piece at knight distance
// is guarded by a knight (and thus attacking)
- // --> Except for pawns targetting last rank.
+ // --> Except for kings, and pawns targetting last rank.
const x = sq[0],
y = sq[1];
// Last rank for me, that is to say oppCol of color:
this.getColor(x+step[0],y+step[1]) == color
) {
const piece = this.getPiece(x+step[0],y+step[1]);
- if (piece != V.KNIGHT && (piece != V.PAWN || x != lastRank)) {
+ if (
+ ![V.KNIGHT, V.KING].includes(piece) &&
+ (piece != V.PAWN || x != lastRank)
+ ) {
for (const step2 of V.steps[V.KNIGHT]) {
const xx = x+step[0]+step2[0],
yy = y+step[1]+step2[1];