UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

191 lines 14.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Hand = void 0; const piece_1 = require("./piece.cjs"); const color_1 = require("./color.cjs"); function buildSFEN(n, piece) { if (n === 0) { return ""; } return (n !== 1 ? n : "") + piece.sfen; } /** * 持ち駒 */ class Hand { pieces; constructor() { this.pieces = new Map(); this.pieces.set(piece_1.PieceType.PAWN, 0); this.pieces.set(piece_1.PieceType.LANCE, 0); this.pieces.set(piece_1.PieceType.KNIGHT, 0); this.pieces.set(piece_1.PieceType.SILVER, 0); this.pieces.set(piece_1.PieceType.GOLD, 0); this.pieces.set(piece_1.PieceType.BISHOP, 0); this.pieces.set(piece_1.PieceType.ROOK, 0); } /** * 持ち駒の種類と枚数の一覧を取得します。 */ get counts() { return [ { type: piece_1.PieceType.ROOK, count: this.count(piece_1.PieceType.ROOK) }, { type: piece_1.PieceType.BISHOP, count: this.count(piece_1.PieceType.BISHOP) }, { type: piece_1.PieceType.GOLD, count: this.count(piece_1.PieceType.GOLD) }, { type: piece_1.PieceType.SILVER, count: this.count(piece_1.PieceType.SILVER) }, { type: piece_1.PieceType.KNIGHT, count: this.count(piece_1.PieceType.KNIGHT) }, { type: piece_1.PieceType.LANCE, count: this.count(piece_1.PieceType.LANCE) }, { type: piece_1.PieceType.PAWN, count: this.count(piece_1.PieceType.PAWN) }, ]; } /** * 持ち駒の枚数を取得します。 * @param pieceType */ count(pieceType) { return Math.max(this.pieces.get(pieceType), 0); } /** * 持ち駒の枚数を設定します。 * @param pieceType * @param count */ set(pieceType, count) { this.pieces.set(pieceType, count); } /** * 持ち駒を追加します。 * @param pieceType * @param n */ add(pieceType, n) { let c = this.pieces.get(pieceType); c += n; this.pieces.set(pieceType, c); return c; } /** * 持ち駒を減らします。 * @param pieceType * @param n */ reduce(pieceType, n) { let c = this.pieces.get(pieceType); c -= n; this.pieces.set(pieceType, c); return c; } /** * 駒の種類ごとにハンドラーを呼び出します。 * @param handler */ forEach(handler) { handler(piece_1.PieceType.PAWN, this.pieces.get(piece_1.PieceType.PAWN)); handler(piece_1.PieceType.LANCE, this.pieces.get(piece_1.PieceType.LANCE)); handler(piece_1.PieceType.KNIGHT, this.pieces.get(piece_1.PieceType.KNIGHT)); handler(piece_1.PieceType.SILVER, this.pieces.get(piece_1.PieceType.SILVER)); handler(piece_1.PieceType.GOLD, this.pieces.get(piece_1.PieceType.GOLD)); handler(piece_1.PieceType.BISHOP, this.pieces.get(piece_1.PieceType.BISHOP)); handler(piece_1.PieceType.ROOK, this.pieces.get(piece_1.PieceType.ROOK)); } /** * 先手の持ち駒に対してSFEN形式の文字列を取得します。 */ get sfenBlack() { return this.formatSFEN(color_1.Color.BLACK); } /** * 後手の持ち駒に対してSFEN形式の文字列を取得します。 */ get sfenWhite() { return this.formatSFEN(color_1.Color.WHITE); } /** * SFEN形式の文字列を取得します。 * @param color */ formatSFEN(color) { let ret = ""; ret += buildSFEN(this.count(piece_1.PieceType.ROOK), new piece_1.Piece(color, piece_1.PieceType.ROOK)); ret += buildSFEN(this.count(piece_1.PieceType.BISHOP), new piece_1.Piece(color, piece_1.PieceType.BISHOP)); ret += buildSFEN(this.count(piece_1.PieceType.GOLD), new piece_1.Piece(color, piece_1.PieceType.GOLD)); ret += buildSFEN(this.count(piece_1.PieceType.SILVER), new piece_1.Piece(color, piece_1.PieceType.SILVER)); ret += buildSFEN(this.count(piece_1.PieceType.KNIGHT), new piece_1.Piece(color, piece_1.PieceType.KNIGHT)); ret += buildSFEN(this.count(piece_1.PieceType.LANCE), new piece_1.Piece(color, piece_1.PieceType.LANCE)); ret += buildSFEN(this.count(piece_1.PieceType.PAWN), new piece_1.Piece(color, piece_1.PieceType.PAWN)); if (ret === "") { return "-"; } return ret; } /** * SFEN形式の文字列を取得します。 * @param black * @param white */ static formatSFEN(black, white) { const b = black.sfenBlack; const w = white.sfenWhite; if (b === "-" && w === "-") { return "-"; } if (w === "-") { return b; } if (b === "-") { return w; } return b + w; } /** * 指定した文字列が正しい持ち駒のSFENであるかどうかを判定します。 * @param sfen */ static isValidSFEN(sfen) { if (sfen === "-") { return true; } return /^(?:[0-9]{0,2}[PLNSGBRplnsgbr])+$/.test(sfen); } /** * 持ち駒のSFENを解析します。 * @param sfen */ static parseSFEN(sfen) { if (sfen === "-") { return { black: new Hand(), white: new Hand() }; } const sections = sfen.match(/([0-9]{0,2}[PLNSGBRplnsgbr])/g); if (!sections) { return null; } const black = new Hand(); const white = new Hand(); for (let i = 0; i < sections.length; i += 1) { const section = sections[i]; let n = 1; if (section.length >= 2) { n = Number(section.substring(0, section.length - 1)); } const piece = piece_1.Piece.newBySFEN(section[section.length - 1]); if (piece.color === color_1.Color.BLACK) { black.add(piece.type, n); } else { white.add(piece.type, n); } } return { black, white }; } /** * 別のオブジェクトからコピーします。 * @param hand */ copyFrom(hand) { hand.pieces.forEach((n, pieceType) => { this.pieces.set(pieceType, n); }); } } exports.Hand = Hand; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUEyQztBQUMzQyxtQ0FBZ0M7QUFFaEMsU0FBUyxTQUFTLENBQUMsQ0FBUyxFQUFFLEtBQVk7SUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ3pDLENBQUM7QUFtQ0Q7O0dBRUc7QUFDSCxNQUFhLElBQUk7SUFDUCxNQUFNLENBQXlCO0lBRXZDO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcs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