tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
763 lines • 57.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JishogiDeclarationResult = exports.JishogiDeclarationRule = exports.Position = exports.InitialPositionSFEN = exports.InitialPositionType = void 0;
exports.initialPositionTypeToSFEN = initialPositionTypeToSFEN;
exports.isPromotableRank = isPromotableRank;
exports.countExistingPieces = countExistingPieces;
exports.countNotExistingPieces = countNotExistingPieces;
exports.countJishogiPoint = countJishogiPoint;
exports.countJishogiDeclarationPoint = countJishogiDeclarationPoint;
exports.judgeJishogiDeclaration = judgeJishogiDeclaration;
const board_1 = require("./board.cjs");
const color_1 = require("./color.cjs");
const move_1 = require("./move.cjs");
const square_1 = require("./square.cjs");
const hand_1 = require("./hand.cjs");
const piece_1 = require("./piece.cjs");
const direction_1 = require("./direction.cjs");
// Deprecated: Use InitialPositionSFEN instead.
// NOTICE: ShogiHomeのgame_setting.jsonで使用しているため互換性のために残す。
var InitialPositionType;
(function (InitialPositionType) {
InitialPositionType["STANDARD"] = "standard";
InitialPositionType["EMPTY"] = "empty";
InitialPositionType["HANDICAP_LANCE"] = "handicapLance";
InitialPositionType["HANDICAP_RIGHT_LANCE"] = "handicapRightLance";
InitialPositionType["HANDICAP_BISHOP"] = "handicapBishop";
InitialPositionType["HANDICAP_ROOK"] = "handicapRook";
InitialPositionType["HANDICAP_ROOK_LANCE"] = "handicapRookLance";
InitialPositionType["HANDICAP_2PIECES"] = "handicap2Pieces";
InitialPositionType["HANDICAP_4PIECES"] = "handicap4Pieces";
InitialPositionType["HANDICAP_6PIECES"] = "handicap6Pieces";
InitialPositionType["HANDICAP_8PIECES"] = "handicap8Pieces";
InitialPositionType["HANDICAP_10PIECES"] = "handicap10Pieces";
InitialPositionType["TSUME_SHOGI"] = "tsumeShogi";
InitialPositionType["TSUME_SHOGI_2KINGS"] = "tsumeShogi2Kings";
})(InitialPositionType || (exports.InitialPositionType = InitialPositionType = {}));
var InitialPositionSFEN;
(function (InitialPositionSFEN) {
InitialPositionSFEN["STANDARD"] = "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1";
InitialPositionSFEN["EMPTY"] = "9/9/9/9/9/9/9/9/9 b - 1";
InitialPositionSFEN["HANDICAP_LANCE"] = "lnsgkgsn1/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_RIGHT_LANCE"] = "1nsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_BISHOP"] = "lnsgkgsnl/1r7/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_ROOK"] = "lnsgkgsnl/7b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_ROOK_LANCE"] = "lnsgkgsn1/7b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_2PIECES"] = "lnsgkgsnl/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_4PIECES"] = "1nsgkgsn1/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_6PIECES"] = "2sgkgs2/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_8PIECES"] = "3gkg3/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["HANDICAP_10PIECES"] = "4k4/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1";
InitialPositionSFEN["TSUME_SHOGI"] = "4k4/9/9/9/9/9/9/9/9 b 2r2b4g4s4n4l18p 1";
InitialPositionSFEN["TSUME_SHOGI_2KINGS"] = "4k4/9/9/9/9/9/9/9/4K4 b 2r2b4g4s4n4l18p 1";
})(InitialPositionSFEN || (exports.InitialPositionSFEN = InitialPositionSFEN = {}));
/**
* InitialPositionType から SFEN 形式の文字列に変換します。
* @param type
*/
function initialPositionTypeToSFEN(type) {
return {
[InitialPositionType.STANDARD]: InitialPositionSFEN.STANDARD,
[InitialPositionType.EMPTY]: InitialPositionSFEN.EMPTY,
[InitialPositionType.HANDICAP_LANCE]: InitialPositionSFEN.HANDICAP_LANCE,
[InitialPositionType.HANDICAP_RIGHT_LANCE]: InitialPositionSFEN.HANDICAP_RIGHT_LANCE,
[InitialPositionType.HANDICAP_BISHOP]: InitialPositionSFEN.HANDICAP_BISHOP,
[InitialPositionType.HANDICAP_ROOK]: InitialPositionSFEN.HANDICAP_ROOK,
[InitialPositionType.HANDICAP_ROOK_LANCE]: InitialPositionSFEN.HANDICAP_ROOK_LANCE,
[InitialPositionType.HANDICAP_2PIECES]: InitialPositionSFEN.HANDICAP_2PIECES,
[InitialPositionType.HANDICAP_4PIECES]: InitialPositionSFEN.HANDICAP_4PIECES,
[InitialPositionType.HANDICAP_6PIECES]: InitialPositionSFEN.HANDICAP_6PIECES,
[InitialPositionType.HANDICAP_8PIECES]: InitialPositionSFEN.HANDICAP_8PIECES,
[InitialPositionType.HANDICAP_10PIECES]: InitialPositionSFEN.HANDICAP_10PIECES,
[InitialPositionType.TSUME_SHOGI]: InitialPositionSFEN.TSUME_SHOGI,
[InitialPositionType.TSUME_SHOGI_2KINGS]: InitialPositionSFEN.TSUME_SHOGI_2KINGS,
}[type];
}
const invalidRankMap = {
black: {
pawn: { 1: true },
lance: { 1: true },
knight: { 1: true, 2: true },
},
white: {
pawn: { 9: true },
lance: { 9: true },
knight: { 9: true, 8: true },
},
};
function isInvalidRank(color, type, rank) {
const rule = invalidRankMap[color][type];
return rule ? rule[rank] : false;
}
function isPromotableRank(color, rank) {
if (color === color_1.Color.BLACK) {
return rank <= 3;
}
return rank >= 7;
}
function pawnExists(color, board, file) {
for (let rank = 1; rank <= 9; rank += 1) {
const piece = board.at(new square_1.Square(file, rank));
if (piece && piece.type === piece_1.PieceType.PAWN && piece.color === color) {
return true;
}
}
return false;
}
/**
* 局面
*/
class Position {
_board = new board_1.Board();
_color = color_1.Color.BLACK;
_blackHand = new hand_1.Hand();
_whiteHand = new hand_1.Hand();
/**
* 盤面
*/
get board() {
return this._board;
}
/**
* 手番
*/
get color() {
return this._color;
}
/**
* 先手の持ち駒
*/
get blackHand() {
return this._blackHand;
}
/**
* 後手の持ち駒
*/
get whiteHand() {
return this._whiteHand;
}
/**
* 指定した手番の持ち駒を取得します。
* @param color
*/
hand(color) {
if (color === color_1.Color.BLACK) {
return this._blackHand;
}
return this._whiteHand;
}
/**
* 王手がかかっているかどうかを判定します。
*/
get checked() {
return this._board.isChecked(this.color);
}
/**
* 現在の局面における指し手を生成します。
* @param from
* @param to
*/
createMove(from, to) {
let pieceType;
if (from instanceof square_1.Square) {
const piece = this._board.at(from);
if (!piece) {
return null;
}
pieceType = piece.type;
}
else {
pieceType = from;
}
const capturedPiece = this._board.at(to);
return new move_1.Move(from, to, false, this.color, pieceType, capturedPiece ? capturedPiece.type : null);
}
/**
* USI形式の指し手から Move オブジェクトを生成します。
* @param usiMove
*/
createMoveByUSI(usiMove) {
const m = (0, move_1.parseUSIMove)(usiMove);
if (!m) {
return null;
}
let move = this.createMove(m.from, m.to);
if (!move) {
return null;
}
if (m.promote) {
move = move.withPromote();
}
return move;
}
/**
* 打ち歩詰めかどうかを判定します。
* @param move
*/
isPawnDropMate(move) {
if (move.from instanceof square_1.Square) {
return false;
}
if (move.pieceType !== piece_1.PieceType.PAWN) {
return false;
}
const kingSquare = move.to.neighbor(move.color === color_1.Color.BLACK ? direction_1.Direction.UP : direction_1.Direction.DOWN);
const king = this.board.at(kingSquare);
if (!king || king.type !== piece_1.PieceType.KING || king.color === move.color) {
return false;
}
const movable = (0, direction_1.movableDirections)(king).find((dir) => {
const to = kingSquare.neighbor(dir);
if (!to.valid) {
return false;
}
const piece = this.board.at(to);
if (piece && piece.color == king.color) {
return false;
}
return !this.board.hasPower(to, move.color, { filled: move.to });
});
if (movable) {
return false;
}
return !this.board.listSquaresByColor(king.color).find((from) => {
return (!from.equals(kingSquare) &&
this.isMovable(from, move.to) &&
!this.board.isChecked(king.color, {
filled: move.to,
ignore: from,
}));
});
}
/**
* 指定したマスに利いている駒のマス目を列挙します。
* @param to
* @param piece
*/
listAttackers(to) {
return this.board.listNonEmptySquares().filter((from) => {
return this.isMovable(from, to);
});
}
/**
* 指定したマスに利いている指定した駒のマス目を列挙します。
* @param to
* @param piece
*/
listAttackersByPiece(to, piece) {
return this.board.listSquaresByPiece(piece).filter((from) => {
return this.isMovable(from, to);
});
}
/**
* 合法手かどうかを判定します。
* @param move
*/
isValidMove(move) {
if (move.from instanceof square_1.Square) {
const target = this._board.at(move.from);
if (!target || target.color !== this.color) {
return false;
}
if (!this.isMovable(move.from, move.to)) {
return false;
}
const captured = this._board.at(move.to);
if (captured && captured.color === this.color) {
return false;
}
if (move.promote) {
if (!target.isPromotable()) {
return false;
}
if (!isPromotableRank(this.color, move.from.rank) &&
!isPromotableRank(this.color, move.to.rank)) {
return false;
}
}
else if (isInvalidRank(this.color, target.type, move.to.rank)) {
return false;
}
if (move.pieceType !== piece_1.PieceType.KING
? this._board.isChecked(this.color, {
filled: move.to,
ignore: move.from,
})
: this._board.hasPower(move.to, (0, color_1.reverseColor)(this.color), {
ignore: move.from,
})) {
return false;
}
}
else {
if (move.promote) {
return false;
}
if (move.color !== this.color) {
return false;
}
if (this.hand(this.color).count(move.from) === 0) {
return false;
}
if (this._board.at(move.to)) {
return false;
}
if (isInvalidRank(this.color, move.from, move.to.rank)) {
return false;
}
if (move.from === piece_1.PieceType.PAWN && pawnExists(this.color, this._board, move.to.file)) {
return false;
}
if (this._board.isChecked(this.color, { filled: move.to })) {
return false;
}
if (this.isPawnDropMate(move)) {
return false;
}
}
return true;
}
/**
* 指定した指し手で駒を動かします。
* @param move
* @param opt
*/
doMove(move, opt) {
if (!(opt && opt.ignoreValidation) && !this.isValidMove(move)) {
return false;
}
if (move.from instanceof square_1.Square) {
const target = this._board.at(move.from);
const captured = this._board.at(move.to);
this._board.remove(move.from);
this._board.set(move.to, move.promote ? target.promoted() : target);
if (captured && captured.type !== piece_1.PieceType.KING) {
this.hand(this.color).add(captured.unpromoted().type, 1);
}
}
else {
this.hand(this.color).reduce(move.from, 1);
this._board.set(move.to, new piece_1.Piece(this.color, move.from));
}
this._color = (0, color_1.reverseColor)(this.color);
return true;
}
/**
* 指定した指し手を元に戻します。
* @param move
* @param opt
*/
undoMove(move) {
this._color = (0, color_1.reverseColor)(this.color);
if (move.from instanceof square_1.Square) {
this._board.set(move.from, new piece_1.Piece(this.color, move.pieceType));
if (move.capturedPieceType) {
const capturedPiece = new piece_1.Piece((0, color_1.reverseColor)(this.color), move.capturedPieceType);
this._board.set(move.to, capturedPiece);
if (capturedPiece.type !== piece_1.PieceType.KING) {
this.hand(this.color).reduce(capturedPiece.unpromoted().type, 1);
}
}
else {
this._board.remove(move.to);
}
}
else {
this.hand(this.color).add(move.from, 1);
this._board.remove(move.to);
}
}
/**
* 有効な編集作業かどうかを判定します。
* @param from
* @param to
*/
isValidEditing(from, to) {
if (from instanceof square_1.Square) {
const piece = this._board.at(from);
if (!piece) {
return false;
}
if (to instanceof square_1.Square) {
if (from.equals(to)) {
return false;
}
}
else if (piece.type === piece_1.PieceType.KING) {
return false;
}
}
else {
if (!from.color) {
return false;
}
if (this.hand(from.color).count(from.type) === 0) {
return false;
}
if (to instanceof square_1.Square) {
if (this._board.at(to)) {
return false;
}
}
else if (from.color === to) {
return false;
}
}
return true;
}
/**
* 盤面を編集します。
* @param change
*/
edit(change) {
if (change.move) {
if (!this.isValidEditing(change.move.from, change.move.to)) {
return false;
}
if (!(change.move.from instanceof square_1.Square)) {
this.hand(change.move.from.color).reduce(change.move.from.type, 1);
if (change.move.to instanceof square_1.Square) {
this._board.set(change.move.to, change.move.from);
}
else {
this.hand(change.move.to).add(change.move.from.type, 1);
}
}
else if (!(change.move.to instanceof square_1.Square)) {
const piece = this._board.remove(change.move.from);
this.hand(change.move.to).add(piece.unpromoted().type, 1);
}
else {
this._board.swap(change.move.from, change.move.to);
}
}
if (change.rotate) {
const piece = this._board.at(change.rotate);
if (piece) {
this._board.set(change.rotate, piece.rotate());
}
}
return true;
}
// Deprecated: Use resetBySFEN() instead.
reset(type) {
this.resetBySFEN(initialPositionTypeToSFEN(type));
}
/**
* SFEN形式の文字列を返します。
*/
get sfen() {
return this.getSFEN(1);
}
/**
* 手数を指定してSFEN形式の文字列を取得します。
* @param nextPly
*/
getSFEN(nextPly) {
let ret = `${this._board.sfen} ${(0, color_1.colorToSFEN)(this.color)} `;
ret += hand_1.Hand.formatSFEN(this._blackHand, this._whiteHand);
ret += " " + Math.max(nextPly, 1);
return ret;
}
/**
* SFENで盤面を初期化します。
* @param sfen
*/
resetBySFEN(sfen) {
if (!Position.isValidSFEN(sfen)) {
return false;
}
const sections = sfen.split(" ");
if (sections[0] === "sfen") {
sections.shift();
}
this._board.resetBySFEN(sections[0]);
this._color = (0, color_1.parseSFENColor)(sections[1]);
const hands = hand_1.Hand.parseSFEN(sections[2]);
this._blackHand = hands.black;
this._whiteHand = hands.white;
return true;
}
/**
* 手番を設定します。
* @param color
*/
setColor(color) {
this._color = color;
}
/**
* 正しいSFEN形式の文字列かどうかを判定します。
* @param sfen
*/
static isValidSFEN(sfen) {
const sections = sfen.split(" ");
if ((sections.length === 5 || sections.length === 4) && sections[0] === "sfen") {
sections.shift();
}
if (sections.length !== 4 && sections.length !== 3) {
return false;
}
if (!board_1.Board.isValidSFEN(sections[0])) {
return false;
}
if (!(0, color_1.isValidSFENColor)(sections[1])) {
return false;
}
if (!hand_1.Hand.isValidSFEN(sections[2])) {
return false;
}
if (sections.length === 4 && !/[0-9]+/.test(sections[3])) {
return false;
}
return true;
}
/**
* SFEN形式の文字列から局面を生成します。
*/
static newBySFEN(sfen) {
const position = new Position();
return position.resetBySFEN(sfen) ? position : null;
}
isMovable(from, to) {
const dx = to.x - from.x;
const dy = to.y - from.y;
const { direction, distance, ok } = (0, direction_1.vectorToDirectionAndDistance)(dx, dy);
if (!ok) {
return false;
}
const piece = this._board.at(from);
if (!piece) {
return false;
}
switch ((0, direction_1.resolveMoveType)(piece, direction)) {
default:
return false;
case direction_1.MoveType.SHORT:
return distance === 1;
case direction_1.MoveType.LONG: {
const d = direction_1.directionToDeltaMap[direction];
for (let square = from.neighbor(d.x, d.y); square.valid; square = square.neighbor(d.x, d.y)) {
if (square.equals(to)) {
return true;
}
if (this._board.at(square)) {
return false;
}
}
return false;
}
}
}
/**
* 別のオブジェクトからコピーします。
* @param position
*/
copyFrom(position) {
this._board.copyFrom(position._board);
this._color = position.color;
this._blackHand.copyFrom(position._blackHand);
this._whiteHand.copyFrom(position._whiteHand);
}
/**
* クローンを生成します。
*/
clone() {
const position = new Position();
position.copyFrom(this);
return position;
}
}
exports.Position = Position;
function countExistingPieces(position) {
const result = {
pawn: 0,
lance: 0,
knight: 0,
silver: 0,
gold: 0,
bishop: 0,
rook: 0,
king: 0,
promPawn: 0,
promLance: 0,
promKnight: 0,
promSilver: 0,
horse: 0,
dragon: 0,
};
square_1.Square.all.forEach((square) => {
const piece = position.board.at(square);
if (piece) {
result[piece.type] += 1;
}
});
position.blackHand.forEach((pieceType, n) => {
result[pieceType] += n;
});
position.whiteHand.forEach((pieceType, n) => {
result[pieceType] += n;
});
return result;
}
function countNotExistingPieces(position) {
const existed = countExistingPieces(position);
return {
pawn: 18 - existed.pawn - existed.promPawn,
lance: 4 - existed.lance - existed.promLance,
knight: 4 - existed.knight - existed.promKnight,
silver: 4 - existed.silver - existed.promSilver,
gold: 4 - existed.gold,
bishop: 2 - existed.bishop - existed.horse,
rook: 2 - existed.rook - existed.dragon,
king: 2 - existed.king,
promPawn: 0,
promLance: 0,
promKnight: 0,
promSilver: 0,
horse: 0,
dragon: 0,
};
}
var JishogiDeclarationRule;
(function (JishogiDeclarationRule) {
JishogiDeclarationRule["GENERAL24"] = "general24";
JishogiDeclarationRule["GENERAL27"] = "general27";
})(JishogiDeclarationRule || (exports.JishogiDeclarationRule = JishogiDeclarationRule = {}));
var JishogiDeclarationResult;
(function (JishogiDeclarationResult) {
JishogiDeclarationResult["WIN"] = "win";
JishogiDeclarationResult["LOSE"] = "lose";
JishogiDeclarationResult["DRAW"] = "draw";
})(JishogiDeclarationResult || (exports.JishogiDeclarationResult = JishogiDeclarationResult = {}));
function invadingPieces(board, color) {
return board
.listNonEmptySquares()
.filter((square) => {
if (!isPromotableRank(color, square.rank)) {
return false;
}
const piece = board.at(square);
return piece?.color === color && piece?.type !== piece_1.PieceType.KING;
})
.map((square) => board.at(square));
}
/**
* 時将棋指し直し判定の点数を計算します。
* 入玉宣言法と異なり、敵陣に侵入していない駒も加点対象となります。
* 時将棋指し直しは原則として対局者の合意によって成立し、ここで求められる点数はあくまで参考値です。
* @param position
* @param color 計算対象のプレイヤー
* @returns
*/
function countJishogiPoint(position, color) {
let point = 0;
square_1.Square.all.forEach((square) => {
const piece = position.board.at(square);
if (piece?.color === color && piece.type !== piece_1.PieceType.KING) {
const type = piece.unpromoted().type;
point += type === piece_1.PieceType.BISHOP || type === piece_1.PieceType.ROOK ? 5 : 1;
}
});
const hand = position.hand(color);
point +=
hand.count(piece_1.PieceType.PAWN) +
hand.count(piece_1.PieceType.LANCE) +
hand.count(piece_1.PieceType.KNIGHT) +
hand.count(piece_1.PieceType.SILVER) +
hand.count(piece_1.PieceType.GOLD) +
hand.count(piece_1.PieceType.BISHOP) * 5 +
hand.count(piece_1.PieceType.ROOK) * 5;
if (color === color_1.Color.WHITE) {
// 駒落ちの場合は上手に落とした駒を加点する。
const notExisting = countNotExistingPieces(position);
point +=
notExisting.pawn +
notExisting.lance +
notExisting.knight +
notExisting.silver +
notExisting.gold +
notExisting.bishop * 5 +
notExisting.rook * 5;
}
return point;
}
/**
* 入玉宣言法に基づいて宣言する際の点数を計算します。
* 敵陣に侵入している駒と持ち駒だけが対象となり、それ以外の駒は加点対象になりません。
* @param position
* @param color 宣言するプレイヤー
*/
function countJishogiDeclarationPoint(position, color) {
let point = 0;
for (const piece of invadingPieces(position.board, color)) {
const type = piece.unpromoted().type;
point += type === piece_1.PieceType.BISHOP || type === piece_1.PieceType.ROOK ? 5 : 1;
}
const hand = position.hand(color);
point +=
hand.count(piece_1.PieceType.PAWN) +
hand.count(piece_1.PieceType.LANCE) +
hand.count(piece_1.PieceType.KNIGHT) +
hand.count(piece_1.PieceType.SILVER) +
hand.count(piece_1.PieceType.GOLD) +
hand.count(piece_1.PieceType.BISHOP) * 5 +
hand.count(piece_1.PieceType.ROOK) * 5;
if (color === color_1.Color.WHITE) {
// 駒落ちの場合は上手に落とした駒を加点する。
const notExisting = countNotExistingPieces(position);
point +=
notExisting.pawn +
notExisting.lance +
notExisting.knight +
notExisting.silver +
notExisting.gold +
notExisting.bishop * 5 +
notExisting.rook * 5;
}
return point;
}
/**
* 入玉宣言法に基づいて宣言した場合の結果を判定します。
* @param rule
* @param position
* @param color 宣言するプレイヤー
*/
function judgeJishogiDeclaration(rule, position, color) {
// 自分の手番か。
if (position.color !== color) {
return JishogiDeclarationResult.LOSE;
}
// 玉が敵陣に入っているか。
const king = position.board.findKing(color);
if (!king || !isPromotableRank(color, king.rank)) {
return JishogiDeclarationResult.LOSE;
}
// 王手されていないか。
if (position.board.isChecked(color)) {
return JishogiDeclarationResult.LOSE;
}
// 敵陣に 10 枚以上駒が侵入しているか。
if (invadingPieces(position.board, color).length < 10) {
return JishogiDeclarationResult.LOSE;
}
// 点数を計算する。
const point = countJishogiDeclarationPoint(position, color);
// 24 点法
if (rule === JishogiDeclarationRule.GENERAL24) {
return point >= 31
? JishogiDeclarationResult.WIN
: point >= 24
? JishogiDeclarationResult.DRAW
: JishogiDeclarationResult.LOSE;
}
// 27 点法
if (color === color_1.Color.BLACK) {
// 先手は 28 点以上で勝ち
return point >= 28 ? JishogiDeclarationResult.WIN : JishogiDeclarationResult.DRAW;
}
else {
// 後手は 27 点以上で勝ち
return point >= 27 ? JishogiDeclarationResult.WIN : JishogiDeclarationResult.DRAW;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdURBLDhEQWlCQztBQXNCRCw0Q0FLQztBQXVtQkQsa0RBOEJDO0FBRUQsd0RBa0JDO0FBa0NELDhDQStCQztBQVFELG9FQTRCQztBQVFELDBEQThDQztBQXY1QkQsbUNBQWdEO0FBQ2hELG1DQUE2RjtBQUM3RixpQ0FBNEM7QUFDNUMscUNBQWtDO0FBQ2xDLGlDQUE2QztBQUM3QyxtQ0FBMkM7QUFDM0MsMkNBT3FCO0FBRXJCLCtDQUErQztBQUMvQyx5REFBeUQ7QUFDekQsSUFBWSxtQkFlWDtBQWZELFdBQVksbUJBQW1CO0lBQzdCLDRDQUFxQixDQUFBO0lBQ3JCLHNDQUFlLENBQUE7SUFDZix1REFBZ0MsQ0FBQTtJQUNoQyxrRUFBMkMsQ0FBQTtJQUMzQyx5REFBa0MsQ0FBQTtJQUNsQyxxREFBOEIsQ0FBQTtJQUM5QixnRUFBeUMsQ0FBQTtJQUN6QywyREFBb0MsQ0FBQTtJQUNwQywyREFBb0MsQ0FBQTtJQUNwQywyREFBb0MsQ0FBQTtJQUNwQywyREFBb0MsQ0FBQTtJQUNwQyw2REFBc0MsQ0FBQTtJQUN0QyxpREFBMEIsQ0FBQTtJQUMxQiw4REFBdUMsQ0FBQTtBQUN6QyxDQUFDLEVBZlcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFlOUI7QUFFRCxJQUFZLG1CQWVYO0FBZkQsV0FBWSxtQkFBbUI7SUFDN0IsbUdBQTRFLENBQUE7SUFDNUUsd0RBQWlDLENBQUE7SUFDakMseUdBQWtGLENBQUE7SUFDbEYsK0dBQXdGLENBQUE7SUFDeEYsd0dBQWlGLENBQUE7SUFDakYsc0dBQStFLENBQUE7SUFDL0UsNEdBQXFGLENBQUE7SUFDckYsdUdBQWdGLENBQUE7SUFDaEYsdUdBQWdGLENBQUE7SUFDaEYscUdBQThFLENBQUE7SUFDOUUsbUdBQTRFLENBQUE7SUFDNUUsa0dBQTJFLENBQUE7SUFDM0Us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