tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
392 lines • 27 kB
JavaScript
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