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