UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

392 lines 27 kB
export 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 || (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 */ export function reverseDirection(dir) { return reverseMap[dir]; } export const 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, ]; export var MoveType; (function (MoveType) { MoveType["SHORT"] = "short"; MoveType["LONG"] = "long"; })(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 */ export function movableDirections(piece) { return Object.keys(movableDirectionMap[piece.color][piece.type]); } /** * 指定した駒と方向に対して、1マスのみ移動可能か遠距離移動可能かを返します。 * @param piece * @param direction */ export function resolveMoveType(piece, direction) { return movableDirectionMap[piece.color][piece.type][direction]; } export const 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 */ export 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 }; } export var VDirection; (function (VDirection) { VDirection["UP"] = "up"; VDirection["NONE"] = "none"; VDirection["DOWN"] = "down"; })(VDirection || (VDirection = {})); /** * 垂直方向の動きを取り出します。 * @param direction */ export 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; } } export var HDirection; (function (HDirection) { HDirection["LEFT"] = "left"; HDirection["NONE"] = "none"; HDirection["RIGHT"] = "right"; })(HDirection || (HDirection = {})); /** * 水平方向の動きを取り出します。 * @param direction */ export 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpcmVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQU4sSUFBWSxTQWFYO0FBYkQsV0FBWSxTQUFTO0lBQ25CLHNCQUFTLENBQUE7SUFDVCwwQkFBYSxDQUFBO0lBQ2IsMEJBQWEsQ0FBQTtJQUNiLDRCQUFlLENBQUE7SUFDZixnQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBcUIsQ0FBQTtJQUNyQixvQ0FBdUIsQ0FBQTtJQUN2QixzQ0FBeUIsQ0FBQTtJQUN6Qiw4Q0FBaUMsQ0FBQTtJQUNqQyxnREFBbUMsQ0FBQTtJQUNuQyxrREFBcUMsQ0FBQTtJQUNyQyxvREFBdUMsQ0FBQTtBQUN6QyxDQUFDLEVBYlcsU0FBUyxLQUFULFNBQVMsUUFhcEI7QUFFRCxNQUFNLFVBQVUsR0FFWjtJQUNGLEVBQUUsRUFBRSxTQUFTLENBQUMsSUFBSTtJQUNsQixJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7SUFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLO0lBQ3JCLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSTtJQUNyQixPQUFPLEVBQUUsU0FBUyxDQUFDLFVBQVU7SUFDN0IsUUFBUSxFQUFFLFNBQVMsQ0FBQyxTQUFTO0lBQzdCLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUTtJQUM3QixVQUFVLEVBQUUsU0FBUyxDQUFDLE9BQU87SUFDN0IsY0FBYyxFQUFFLFNBQVMsQ0FBQyxpQkFBaUI7SUFDM0MsZUFBZSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7SUFDM0MsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLGVBQWU7SUFDM0MsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLGNBQWM7Q0FDNUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFjO0lBQzdDLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFF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USxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFlLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBTixJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsdUJBQVMsQ0FBQTtJQUNULDJCQUFhLENBQUE7SUFDYiwyQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUpXLFVBQVUsS0FBVixVQUFVLFFBSXJCO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFNBQW9CO0lBQ3hELFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ2xCLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUN2QixLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDeEIsS0FBSyxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQzlCLEtBQUssU0FBUyxDQUFDLGVBQWU7WUFDNUIsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQztRQUNwQixLQUFLLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDekIsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQzFCLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDO1FBQ2hDLEtBQUssU0FBUyxDQUFDLGlCQUFpQjtZQUM5QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDekI7WUFDRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQU4sSUFBWSxVQUlYO0FBSkQsV0FBWSxVQUFVO0lBQ3BCLDJCQUFhLENBQUE7SUFDYiwyQkFBYSxDQUFBO0lBQ2IsNkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSlcsVUFBVSxLQUFWLFVBQVUsUUFJckI7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsU0FBb0I7SUFDeEQsUUFBUSxTQUFTLEVBQUUsQ0FBQztRQUNsQixLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDcEIsS0FBSyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLEtBQUssU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUN6QixLQUFLLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFDOUIsS0FBSyxTQUFTLENBQUMsZ0JBQWdCO1lBQzdCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztRQUN6QixLQUFLLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDckIsS0FBSyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3hCLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUMxQixLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDL0IsS0FBSyxTQUFTLENBQUMsaUJBQWlCO1lBQzlCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztRQUMxQjtZQUNFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0FBQ0gsQ0FBQyJ9