tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
375 lines • 21.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Piece = exports.handPieceTypes = exports.pieceTypes = exports.PieceType = void 0;
exports.standardPieceName = standardPieceName;
exports.isPromotable = isPromotable;
exports.promotedPieceType = promotedPieceType;
exports.unpromotedPieceType = unpromotedPieceType;
exports.pieceTypeToSFEN = pieceTypeToSFEN;
const color_1 = require("./color.cjs");
var PieceType;
(function (PieceType) {
PieceType["PAWN"] = "pawn";
PieceType["LANCE"] = "lance";
PieceType["KNIGHT"] = "knight";
PieceType["SILVER"] = "silver";
PieceType["GOLD"] = "gold";
PieceType["BISHOP"] = "bishop";
PieceType["ROOK"] = "rook";
PieceType["KING"] = "king";
PieceType["PROM_PAWN"] = "promPawn";
PieceType["PROM_LANCE"] = "promLance";
PieceType["PROM_KNIGHT"] = "promKnight";
PieceType["PROM_SILVER"] = "promSilver";
PieceType["HORSE"] = "horse";
PieceType["DRAGON"] = "dragon";
})(PieceType || (exports.PieceType = PieceType = {}));
const standardPieceNameMap = {
pawn: "歩",
lance: "香",
knight: "桂",
silver: "銀",
gold: "金",
bishop: "角",
rook: "飛",
king: "玉",
promPawn: "と",
promLance: "成香",
promKnight: "成桂",
promSilver: "成銀",
horse: "馬",
dragon: "竜",
};
/**
* 標準的な駒の名前を返します。
* @param type
*/
function standardPieceName(type) {
const val = standardPieceNameMap[type];
return val || "";
}
exports.pieceTypes = [
PieceType.PAWN,
PieceType.LANCE,
PieceType.KNIGHT,
PieceType.SILVER,
PieceType.GOLD,
PieceType.BISHOP,
PieceType.ROOK,
PieceType.KING,
PieceType.PROM_PAWN,
PieceType.PROM_LANCE,
PieceType.PROM_KNIGHT,
PieceType.PROM_SILVER,
PieceType.HORSE,
PieceType.DRAGON,
];
exports.handPieceTypes = [
PieceType.PAWN,
PieceType.LANCE,
PieceType.KNIGHT,
PieceType.SILVER,
PieceType.GOLD,
PieceType.BISHOP,
PieceType.ROOK,
];
const promotable = {
pawn: true,
lance: true,
knight: true,
silver: true,
gold: false,
bishop: true,
rook: true,
king: false,
promPawn: false,
promLance: false,
promKnight: false,
promSilver: false,
horse: false,
dragon: false,
};
/**
* 成ることができる駒かどうかを返します。
* @param pieceType
*/
function isPromotable(pieceType) {
return !!promotable[pieceType];
}
const promoteMap = {
pawn: PieceType.PROM_PAWN,
lance: PieceType.PROM_LANCE,
knight: PieceType.PROM_KNIGHT,
silver: PieceType.PROM_SILVER,
bishop: PieceType.HORSE,
rook: PieceType.DRAGON,
};
/**
* 成った時の駒の種類を返します。
* @param pieceType
*/
function promotedPieceType(pieceType) {
return promoteMap[pieceType] || pieceType;
}
const unpromoteMap = {
promPawn: PieceType.PAWN,
promLance: PieceType.LANCE,
promKnight: PieceType.KNIGHT,
promSilver: PieceType.SILVER,
horse: PieceType.BISHOP,
dragon: PieceType.ROOK,
};
/**
* 成る前の駒の種類を返します。
* @param pieceType
*/
function unpromotedPieceType(pieceType) {
return unpromoteMap[pieceType] || pieceType;
}
const toSFENCharBlack = {
pawn: "P",
lance: "L",
knight: "N",
silver: "S",
gold: "G",
bishop: "B",
rook: "R",
king: "K",
promPawn: "+P",
promLance: "+L",
promKnight: "+N",
promSilver: "+S",
horse: "+B",
dragon: "+R",
};
/**
* SFEN形式の駒種を表す文字列を返します。
* @param type
*/
function pieceTypeToSFEN(type) {
return toSFENCharBlack[type];
}
const toSFENCharWhite = {
pawn: "p",
lance: "l",
knight: "n",
silver: "s",
gold: "g",
bishop: "b",
rook: "r",
king: "k",
promPawn: "+p",
promLance: "+l",
promKnight: "+n",
promSilver: "+s",
horse: "+b",
dragon: "+r",
};
const sfenCharToTypeMap = {
P: PieceType.PAWN,
L: PieceType.LANCE,
N: PieceType.KNIGHT,
S: PieceType.SILVER,
G: PieceType.GOLD,
B: PieceType.BISHOP,
R: PieceType.ROOK,
K: PieceType.KING,
"+P": PieceType.PROM_PAWN,
"+L": PieceType.PROM_LANCE,
"+N": PieceType.PROM_KNIGHT,
"+S": PieceType.PROM_SILVER,
"+B": PieceType.HORSE,
"+R": PieceType.DRAGON,
p: PieceType.PAWN,
l: PieceType.LANCE,
n: PieceType.KNIGHT,
s: PieceType.SILVER,
g: PieceType.GOLD,
b: PieceType.BISHOP,
r: PieceType.ROOK,
k: PieceType.KING,
"+p": PieceType.PROM_PAWN,
"+l": PieceType.PROM_LANCE,
"+n": PieceType.PROM_KNIGHT,
"+s": PieceType.PROM_SILVER,
"+b": PieceType.HORSE,
"+r": PieceType.DRAGON,
};
const sfenCharToColorMap = {
P: color_1.Color.BLACK,
L: color_1.Color.BLACK,
N: color_1.Color.BLACK,
S: color_1.Color.BLACK,
G: color_1.Color.BLACK,
B: color_1.Color.BLACK,
R: color_1.Color.BLACK,
K: color_1.Color.BLACK,
"+P": color_1.Color.BLACK,
"+L": color_1.Color.BLACK,
"+N": color_1.Color.BLACK,
"+S": color_1.Color.BLACK,
"+B": color_1.Color.BLACK,
"+R": color_1.Color.BLACK,
p: color_1.Color.WHITE,
l: color_1.Color.WHITE,
n: color_1.Color.WHITE,
s: color_1.Color.WHITE,
g: color_1.Color.WHITE,
b: color_1.Color.WHITE,
r: color_1.Color.WHITE,
k: color_1.Color.WHITE,
"+p": color_1.Color.WHITE,
"+l": color_1.Color.WHITE,
"+n": color_1.Color.WHITE,
"+s": color_1.Color.WHITE,
"+b": color_1.Color.WHITE,
"+r": color_1.Color.WHITE,
};
const rotateMap = new Map();
rotateMap.set(PieceType.PAWN, {
type: PieceType.PROM_PAWN,
reverseColor: false,
});
rotateMap.set(PieceType.LANCE, {
type: PieceType.PROM_LANCE,
reverseColor: false,
});
rotateMap.set(PieceType.KNIGHT, {
type: PieceType.PROM_KNIGHT,
reverseColor: false,
});
rotateMap.set(PieceType.SILVER, {
type: PieceType.PROM_SILVER,
reverseColor: false,
});
rotateMap.set(PieceType.GOLD, { type: PieceType.GOLD, reverseColor: true });
rotateMap.set(PieceType.BISHOP, { type: PieceType.HORSE, reverseColor: false });
rotateMap.set(PieceType.ROOK, { type: PieceType.DRAGON, reverseColor: false });
rotateMap.set(PieceType.KING, { type: PieceType.KING, reverseColor: true });
rotateMap.set(PieceType.PROM_PAWN, {
type: PieceType.PAWN,
reverseColor: true,
});
rotateMap.set(PieceType.PROM_LANCE, {
type: PieceType.LANCE,
reverseColor: true,
});
rotateMap.set(PieceType.PROM_KNIGHT, {
type: PieceType.KNIGHT,
reverseColor: true,
});
rotateMap.set(PieceType.PROM_SILVER, {
type: PieceType.SILVER,
reverseColor: true,
});
rotateMap.set(PieceType.HORSE, { type: PieceType.BISHOP, reverseColor: true });
rotateMap.set(PieceType.DRAGON, { type: PieceType.ROOK, reverseColor: true });
/**
* 駒(手番を含む)
*/
class Piece {
color;
type;
constructor(color, type) {
this.color = color;
this.type = type;
}
/**
* 先手番の駒に変換します。
*/
black() {
return this.withColor(color_1.Color.BLACK);
}
/**
* 後手番の駒に変換します。
*/
white() {
return this.withColor(color_1.Color.WHITE);
}
/**
* 手番を変更した駒を返します。
*/
withColor(color) {
return new Piece(color, this.type);
}
/**
* 等しい駒かどうかを判定します。
*/
equals(piece) {
return this.type === piece.type && this.color === piece.color;
}
/**
* 成った駒を返します。
*/
promoted() {
const type = promoteMap[this.type];
return new Piece(this.color, type || this.type);
}
/**
* 成る前の駒を返します。
*/
unpromoted() {
const type = unpromoteMap[this.type];
return new Piece(this.color, type || this.type);
}
/**
* 成ることが可能な駒かどうかを返します。
*/
isPromotable() {
return isPromotable(this.type);
}
/**
* 駒の向きと種類をローテートします。
* ex) 先手・歩 -> 先手・と -> 後手・歩 -> 後手・と -> 先手・歩
*/
rotate() {
const r = rotateMap.get(this.type);
const piece = new Piece(this.color, r ? r.type : this.type);
if (r && r.reverseColor) {
piece.color = (0, color_1.reverseColor)(this.color);
}
return piece;
}
/**
* 手番と種類を一意に識別する ID を返します。
*/
get id() {
return this.color + "_" + this.type;
}
/**
* SFEN形式の文字列を取得します。
*/
get sfen() {
switch (this.color) {
default:
case color_1.Color.BLACK:
return toSFENCharBlack[this.type];
case color_1.Color.WHITE:
return toSFENCharWhite[this.type];
}
}
/**
* 指定した文字列が正しいSFEN形式の駒かどうかを判定します。
* @param sfen
*/
static isValidSFEN(sfen) {
return !!sfenCharToTypeMap[sfen];
}
/**
* SFEN形式の文字列から駒を生成します。
* @param sfen
*/
static newBySFEN(sfen) {
const type = sfenCharToTypeMap[sfen];
if (!type) {
return null;
}
const color = sfenCharToColorMap[sfen];
if (!color) {
return null;
}
return new Piece(color, type);
}
}
exports.Piece = Piece;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGllY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBd0NBLDhDQUdDO0FBa0RELG9DQUVDO0FBZUQsOENBRUM7QUFlRCxrREFFQztBQXVCRCwwQ0FFQztBQTFKRCxtQ0FBOEM7QUFFOUMsSUFBWSxTQWVYO0FBZkQsV0FBWSxTQUFTO0lBQ25CLDBCQUFhLENBQUE7SUFDYiw0QkFBZSxDQUFBO0lBQ2YsOEJBQWlCLENBQUE7SUFDakIsOEJBQWlCLENBQUE7SUFDakIsMEJBQWEsQ0FBQTtJQUNiLDhCQUFpQixDQUFBO0lBQ2pCLDBCQUFhLENBQUE7SUFDYiwwQkFBYSxDQUFBO0lBQ2IsbUNBQXNCLENBQUE7SUFDdEIscUNBQXdCLENBQUE7SUFDeEIsdUNBQTBCLENBQUE7SUFDMUIsdUNBQTBCLENBQUE7SUFDMUIsNEJBQWUsQ0FBQTtJQUNmLDhCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFmVyxTQUFTLHlCQUFULFNBQVMsUUFlcEI7QUFFRCxNQUFNLG9CQUFvQixHQUF5QztJQUNqRSxJQUFJLEVBQUUsR0FBRztJQUNULEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7SUFDWCxNQUFNLEVBQUUsR0FBRztJQUNYLElBQUksRUFBRSxHQUFHO0lBQ1QsTUFBTSxFQUFFLEdBQUc7SUFDWCxJQUFJLEVBQUUsR0FBRztJQUNULElBQUksRUFBRSxHQUFHO0lBQ1QsUUFBUSxFQUFFLEdBQUc7SUFDYixTQUFTLEVBQUUsSUFBSTtJQUNmLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7Q0FDWixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsSUFBZTtJQUMvQyxNQUFNLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxPQUFP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