chessengine
Version:
Cchess move validator in node
116 lines (98 loc) • 3.16 kB
JavaScript
module.exports = Square;
function Square (pos, board) {
this.pos = pos;
this.posX = pos[0];
this.posY = pos[1];
this.isEmpty = true;
this.piece = null;
this.player = null;
this.board = board;
this.isSelected = false;
}
Square.UP = 0;
Square.UP_RIGHT = 1;
Square.RIGHT = 2;
Square.DOWN_RIGHT = 3;
Square.DOWN = 4;
Square.DOWN_LEFT = 5;
Square.LEFT = 6;
Square.UP_LEFT = 7;
Square.prototype.getDiffOf = function getDiffOf(square, destSquare) {
var xDiff = Math.abs(square.posX - destSquare.posX);
var yDiff = Math.abs(square.posY - destSquare.posY);
return {x: xDiff, y: yDiff};
}
Square.prototype.isInSameColumn = function isInSameColumn (square) {
return square.pos[0] === this.pos[0];
};
Square.prototype.isInSameRow = function isInSameRow (square) {
return square.pos[1] === this.pos[1];
};
Square.prototype.isInSameDiag = function isInSameDiag(square) {
var diff = this.getDiffOf(this, square);
return diff.x === diff.y
}
Square.prototype.isColinearWith = function isInSameAll(square) {
return this.isInSameColumn(square) || this.isInSameRow(square) || this.isInSameDiag(square);
};
Square.prototype.getDirectionTo = function inDir(square) {
if (this.posY > square.posY && this.posX === square.posX) {
return Square.UP;
} else if (this.posY > square.posY && this.posX < square.posX) {
return Square.UP_RIGHT;
} else if (this.posY === square.posY && this.posX < square.posX) {
return Square.RIGHT
} else if (this.posY < square.posY && this.posX < square.posX) {
return Square.DOWN_RIGHT
} else if (this.posY < square.posY && this.posX === square.posX) {
return Square.DOWN
} else if (this.posY < square.posY && this.posX > square.posX) {
return Square.DOWN_LEFT
} else if (this.posY === square.posY && this.posX > square.posX) {
return Square.LEFT
} else if (this.posY > square.posY && this.posX > square.posX) {
return Square.UP_LEFT
}
}
Square.prototype.getAdj = function getAdj (dir) {
switch (dir) {
case Square.UP:
return this.board.getSquare([this.posX, this.posY-1]);
break;
case Square.UP_RIGHT:
return this.board.getSquare([this.posX+1, this.posY-1]);
break
case Square.RIGHT:
return this.board.getSquare([this.posX+1, this.posY]);
break
case Square.DOWN_RIGHT:
return this.board.getSquare([this.posX+1, this.posY+1]);
break
case Square.DOWN:
return this.board.getSquare([this.posX, this.posY+1]);
break
case Square.DOWN_LEFT:
return this.board.getSquare([this.posX-1, this.posY+1]);
break
case Square.LEFT:
return this.board.getSquare([this.posX-1, this.posY]);
break
case Square.UP_LEFT:
return this.board.getSquare([this.posX-1, this.posY-1]);
break
}
}
Square.prototype.isClearPathTo = function isClearPathTo (destSquare) {
var curSquare = this;
var dir = this.getDirectionTo(destSquare);
while((curSquare.getAdj(dir) !== undefined) && curSquare.getAdj(dir) !== destSquare) {
curSquare = curSquare.getAdj(dir);
if (!curSquare.isEmpty) return false;
}
return true;
}
//doopity do
//boobity ba
//foo
//ba
//bat