tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
401 lines • 27.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.HDirection = exports.VDirection = exports.directionToDeltaMap = exports.MoveType = exports.directions = exports.Direction = void 0;
exports.reverseDirection = reverseDirection;
exports.movableDirections = movableDirections;
exports.resolveMoveType = resolveMoveType;
exports.vectorToDirectionAndDistance = vectorToDirectionAndDistance;
exports.directionToVDirection = directionToVDirection;
exports.directionToHDirection = directionToHDirection;
var Direction;
(function (Direction) {
Direction["UP"] = "up";
Direction["DOWN"] = "down";
Direction["LEFT"] = "left";
Direction["RIGHT"] = "right";
Direction["LEFT_UP"] = "left_up";
Direction["RIGHT_UP"] = "right_up";
Direction["LEFT_DOWN"] = "left_down";
Direction["RIGHT_DOWN"] = "right_down";
Direction["LEFT_UP_KNIGHT"] = "left_up_knight";
Direction["RIGHT_UP_KNIGHT"] = "right_up_knight";
Direction["LEFT_DOWN_KNIGHT"] = "left_down_knight";
Direction["RIGHT_DOWN_KNIGHT"] = "right_down_knight";
})(Direction || (exports.Direction = Direction = {}));
const reverseMap = {
up: Direction.DOWN,
down: Direction.UP,
left: Direction.RIGHT,
right: Direction.LEFT,
left_up: Direction.RIGHT_DOWN,
right_up: Direction.LEFT_DOWN,
left_down: Direction.RIGHT_UP,
right_down: Direction.LEFT_UP,
left_up_knight: Direction.RIGHT_DOWN_KNIGHT,
right_up_knight: Direction.LEFT_DOWN_KNIGHT,
left_down_knight: Direction.RIGHT_UP_KNIGHT,
right_down_knight: Direction.LEFT_UP_KNIGHT,
};
/**
* 反転した方向を返します。
* @param dir
*/
function reverseDirection(dir) {
return reverseMap[dir];
}
exports.directions = [
Direction.UP,
Direction.DOWN,
Direction.LEFT,
Direction.RIGHT,
Direction.LEFT_UP,
Direction.RIGHT_UP,
Direction.LEFT_DOWN,
Direction.RIGHT_DOWN,
Direction.LEFT_UP_KNIGHT,
Direction.RIGHT_UP_KNIGHT,
Direction.LEFT_DOWN_KNIGHT,
Direction.RIGHT_DOWN_KNIGHT,
];
var MoveType;
(function (MoveType) {
MoveType["SHORT"] = "short";
MoveType["LONG"] = "long";
})(MoveType || (exports.MoveType = MoveType = {}));
const movableDirectionMap = {
black: {
pawn: { up: MoveType.SHORT },
lance: { up: MoveType.LONG },
knight: { left_up_knight: MoveType.SHORT, right_up_knight: MoveType.SHORT },
silver: {
left_up: MoveType.SHORT,
up: MoveType.SHORT,
right_up: MoveType.SHORT,
left_down: MoveType.SHORT,
right_down: MoveType.SHORT,
},
gold: {
left_up: MoveType.SHORT,
up: MoveType.SHORT,
right_up: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
down: MoveType.SHORT,
},
bishop: {
left_up: MoveType.LONG,
right_up: MoveType.LONG,
left_down: MoveType.LONG,
right_down: MoveType.LONG,
},
rook: {
up: MoveType.LONG,
left: MoveType.LONG,
right: MoveType.LONG,
down: MoveType.LONG,
},
king: {
left_down: MoveType.SHORT,
right_down: MoveType.SHORT,
left_up: MoveType.SHORT,
right_up: MoveType.SHORT,
down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
promPawn: {
left_up: MoveType.SHORT,
up: MoveType.SHORT,
right_up: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
down: MoveType.SHORT,
},
promLance: {
left_up: MoveType.SHORT,
up: MoveType.SHORT,
right_up: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
down: MoveType.SHORT,
},
promKnight: {
left_up: MoveType.SHORT,
up: MoveType.SHORT,
right_up: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
down: MoveType.SHORT,
},
promSilver: {
left_up: MoveType.SHORT,
up: MoveType.SHORT,
right_up: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
down: MoveType.SHORT,
},
horse: {
left_up: MoveType.LONG,
right_up: MoveType.LONG,
left_down: MoveType.LONG,
right_down: MoveType.LONG,
up: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
down: MoveType.SHORT,
},
dragon: {
up: MoveType.LONG,
left: MoveType.LONG,
right: MoveType.LONG,
down: MoveType.LONG,
left_up: MoveType.SHORT,
right_up: MoveType.SHORT,
left_down: MoveType.SHORT,
right_down: MoveType.SHORT,
},
},
white: {
pawn: { down: MoveType.SHORT },
lance: { down: MoveType.LONG },
knight: {
left_down_knight: MoveType.SHORT,
right_down_knight: MoveType.SHORT,
},
silver: {
left_down: MoveType.SHORT,
down: MoveType.SHORT,
right_down: MoveType.SHORT,
left_up: MoveType.SHORT,
right_up: MoveType.SHORT,
},
gold: {
left_down: MoveType.SHORT,
down: MoveType.SHORT,
right_down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
bishop: {
left_down: MoveType.LONG,
right_down: MoveType.LONG,
left_up: MoveType.LONG,
right_up: MoveType.LONG,
},
rook: {
down: MoveType.LONG,
left: MoveType.LONG,
right: MoveType.LONG,
up: MoveType.LONG,
},
king: {
left_down: MoveType.SHORT,
right_down: MoveType.SHORT,
left_up: MoveType.SHORT,
right_up: MoveType.SHORT,
down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
promPawn: {
left_down: MoveType.SHORT,
down: MoveType.SHORT,
right_down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
promLance: {
left_down: MoveType.SHORT,
down: MoveType.SHORT,
right_down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
promKnight: {
left_down: MoveType.SHORT,
down: MoveType.SHORT,
right_down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
promSilver: {
left_down: MoveType.SHORT,
down: MoveType.SHORT,
right_down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
horse: {
left_down: MoveType.LONG,
right_down: MoveType.LONG,
left_up: MoveType.LONG,
right_up: MoveType.LONG,
down: MoveType.SHORT,
left: MoveType.SHORT,
right: MoveType.SHORT,
up: MoveType.SHORT,
},
dragon: {
down: MoveType.LONG,
left: MoveType.LONG,
right: MoveType.LONG,
up: MoveType.LONG,
left_down: MoveType.SHORT,
right_down: MoveType.SHORT,
left_up: MoveType.SHORT,
right_up: MoveType.SHORT,
},
},
};
/**
* 指定した駒の移動可能な方向を返します。
* @param piece
*/
function movableDirections(piece) {
return Object.keys(movableDirectionMap[piece.color][piece.type]);
}
/**
* 指定した駒と方向に対して、1マスのみ移動可能か遠距離移動可能かを返します。
* @param piece
* @param direction
*/
function resolveMoveType(piece, direction) {
return movableDirectionMap[piece.color][piece.type][direction];
}
exports.directionToDeltaMap = {
up: { x: 0, y: -1 },
down: { x: 0, y: 1 },
left: { x: -1, y: 0 },
right: { x: 1, y: 0 },
left_up: { x: -1, y: -1 },
right_up: { x: 1, y: -1 },
left_down: { x: -1, y: 1 },
right_down: { x: 1, y: 1 },
left_up_knight: { x: -1, y: -2 },
right_up_knight: { x: 1, y: -2 },
left_down_knight: { x: -1, y: 2 },
right_down_knight: { x: 1, y: 2 },
};
/**
* ベクトルを方向と距離に変換します。
* @param x
* @param y
*/
function vectorToDirectionAndDistance(x, y) {
if (x === 1 && y === -2) {
return { direction: Direction.RIGHT_UP_KNIGHT, distance: 1, ok: true };
}
if (x === -1 && y === -2) {
return { direction: Direction.LEFT_UP_KNIGHT, distance: 1, ok: true };
}
if (x === 1 && y === 2) {
return { direction: Direction.RIGHT_DOWN_KNIGHT, distance: 1, ok: true };
}
if (x === -1 && y === 2) {
return { direction: Direction.LEFT_DOWN_KNIGHT, distance: 1, ok: true };
}
if (x !== 0 && y !== 0 && Math.abs(x) !== Math.abs(y)) {
return { direction: "", distance: 0, ok: false };
}
let dx = x;
let dy = y;
let distance = 0;
if (dx !== 0) {
distance = Math.abs(dx);
dx /= distance;
}
if (dy !== 0) {
distance = Math.abs(dy);
dy /= distance;
}
if (dx === -1 && dy === -1) {
return { direction: Direction.LEFT_UP, distance, ok: true };
}
if (dx === 0 && dy === -1) {
return { direction: Direction.UP, distance, ok: true };
}
if (dx === 1 && dy === -1) {
return { direction: Direction.RIGHT_UP, distance, ok: true };
}
if (dx === -1 && dy === 0) {
return { direction: Direction.LEFT, distance, ok: true };
}
if (dx === 1 && dy === 0) {
return { direction: Direction.RIGHT, distance, ok: true };
}
if (dx === -1 && dy === 1) {
return { direction: Direction.LEFT_DOWN, distance, ok: true };
}
if (dx === 0 && dy === 1) {
return { direction: Direction.DOWN, distance, ok: true };
}
if (dx === 1 && dy === 1) {
return { direction: Direction.RIGHT_DOWN, distance, ok: true };
}
return { direction: "", distance: 0, ok: false };
}
var VDirection;
(function (VDirection) {
VDirection["UP"] = "up";
VDirection["NONE"] = "none";
VDirection["DOWN"] = "down";
})(VDirection || (exports.VDirection = VDirection = {}));
/**
* 垂直方向の動きを取り出します。
* @param direction
*/
function directionToVDirection(direction) {
switch (direction) {
case Direction.UP:
case Direction.LEFT_UP:
case Direction.RIGHT_UP:
case Direction.LEFT_UP_KNIGHT:
case Direction.RIGHT_UP_KNIGHT:
return VDirection.UP;
case Direction.DOWN:
case Direction.LEFT_DOWN:
case Direction.RIGHT_DOWN:
case Direction.LEFT_DOWN_KNIGHT:
case Direction.RIGHT_DOWN_KNIGHT:
return VDirection.DOWN;
default:
return VDirection.NONE;
}
}
var HDirection;
(function (HDirection) {
HDirection["LEFT"] = "left";
HDirection["NONE"] = "none";
HDirection["RIGHT"] = "right";
})(HDirection || (exports.HDirection = HDirection = {}));
/**
* 水平方向の動きを取り出します。
* @param direction
*/
function directionToHDirection(direction) {
switch (direction) {
case Direction.LEFT:
case Direction.LEFT_UP:
case Direction.LEFT_DOWN:
case Direction.LEFT_UP_KNIGHT:
case Direction.LEFT_DOWN_KNIGHT:
return HDirection.LEFT;
case Direction.RIGHT:
case Direction.RIGHT_UP:
case Direction.RIGHT_DOWN:
case Direction.RIGHT_UP_KNIGHT:
case Direction.RIGHT_DOWN_KNIGHT:
return HDirection.RIGHT;
default:
return HDirection.NONE;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpcmVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzQ0EsNENBRUM7QUFnT0QsOENBRUM7QUFPRCwwQ0FFQztBQXdCRCxvRUEyREM7QUFZRCxzREFpQkM7QUFZRCxzREFpQkM7QUE5WkQsSUFBWSxTQWFYO0FBYkQsV0FBWSxTQUFTO0lBQ25CLHNCQUFTLENBQUE7SUFDVCwwQkFBYSxDQUFBO0lBQ2IsMEJBQWEsQ0FBQTtJQUNiLDRCQUFlLENBQUE7SUFDZixnQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBcUIsQ0FBQTtJQUNyQixvQ0FBdUIsQ0FBQTtJQUN2QixzQ0FBeUIsQ0FBQTtJQUN6Qiw4Q0FBaUMsQ0FBQTtJQUNqQyxnREFBbUMsQ0FBQTtJQUNuQyxrREFBcUMsQ0FBQTtJQUNyQyxvREFBdUMsQ0FBQTtBQUN6QyxDQUFDLEVBYlcsU0FBUyx5QkFBVCxTQUFTLFFBYXBCO0FBRUQsTUFBTSxVQUFVLEdBRVo7SUFDRixFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUk7SUFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0lBQ2xCLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSztJQUNyQixLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUk7SUFDckIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxVQUFVO0lBQzdCLFFBQVEsRUFBRSxTQUFTLENBQUMsU0FBUztJQUM3QixTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVE7SUFDN0IsVUFBVSxFQUFFLFNBQVMsQ0FBQyxPQUFPO0lBQzdCLGNBQWMsRUFBRSxTQUFTLENBQUMsaUJBQWlCO0lBQzNDLGVBQWUsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO0lBQzNDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxlQUFlO0lBQzNDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxjQUFjO0NBQzVDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFnQixnQkFB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QUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBZSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ2hFLENBQUM7QUFFRCxJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsdUJBQVMsQ0FBQTtJQUNULDJCQUFhLENBQUE7SUFDYiwyQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUpXLFVBQVUsMEJBQVYsVUFBVSxRQUlyQjtBQUVEOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFNBQW9CO0lBQ3hELFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ2xCLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUN2QixLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDeEIsS0FBSyxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQzlCLEtBQUssU0FBUyxDQUFDLGVBQWU7WUFDNUIsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQztRQUNwQixLQUFLLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDekIsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQzFCLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDO1FBQ2hDLEtBQUssU0FBUyxDQUFDLGlCQUFpQjtZQUM5QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDekI7WUFDRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLDJCQUFhLENBQUE7SUFDYiw2QkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxVQUFVLDBCQUFWLFVBQVUsUUFJckI7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxTQUFvQjtJQUN4RCxRQUFRLFNBQVMsRUFBRSxDQUFDO1FBQ2xCLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQztRQUNwQixLQUFLLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDdkIsS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ3pCLEtBQUssU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUM5QixLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7WUFDN0IsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3pCLEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNyQixLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDeEIsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQzFCLEtBQUssU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUMvQixLQUFLLFNBQVMsQ0FBQyxpQkFBaUI7WUFDOUIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzFCO1lBQ0UsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7QUFDSCxDQUFDIn0=