UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

375 lines 21.2 kB
"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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