UNPKG

shogi.js

Version:
175 lines (174 loc) 5.07 kB
/** @license * Shogi.js * Copyright (c) 2014 na2hiro (https://github.com/na2hiro) * This software is released under the MIT License. * http://opensource.org/licenses/mit-license.php */ import Color, { colorToString } from "./Color"; import IMoveDefinition from "./IMoveDefinition"; import { Kind, kindToString } from "./Kind"; import Piece from "./Piece"; import "./polyfills"; /** * 将棋盤を管理するクラス */ export declare class Shogi { private static getIllegalUnpromotedRow; /** * 手番の相手側から数えた段数 */ private static getRowToOppositeEnd; /** * 盤面 */ board: Piece[][]; /** * 持ち駒 */ hands: Piece[][]; /** * 次の手番 */ turn: Color; /** * 編集モードかどうか */ flagEditMode: boolean; constructor(setting?: ISettingType); /** * 盤面を初期化する * @param {ISettingType} setting 初期局面(なければ平手) */ initialize(setting?: ISettingType): void; /** * SFENによる盤面表現の文字列で盤面を初期化する * @param {string} sfen */ initializeFromSFENString(sfen: string): void; /** * CSAによる盤面表現の文字列を返す * @returns {string} */ toCSAString(): string; /** * SFENによる盤面表現の文字列を返す * @param {number} moveCount * @returns {string} */ toSFENString(moveCount?: number): string; /** * 編集モード切り替え * * 通常モード:移動時に手番と移動可能かどうかチェックし,移動可能範囲は手番側のみ返す. * * 編集モード:移動時に手番や移動可能かはチェックせず,移動可能範囲は両者とも返す. */ editMode(flag: boolean): void; /** * (fromx, fromy)から(tox, toy)へ移動し,promoteなら成り,駒を取っていれば持ち駒に加える.. */ move(fromx: number, fromy: number, tox: number, toy: number, promote?: boolean): void; /** * moveの逆を行う.つまり(tox, toy)から(fromx, fromy)へ移動し,駒を取っていたら戻し,promoteなら成りを戻す. */ unmove(fromx: number, fromy: number, tox: number, toy: number, promote?: boolean, capture?: Kind): void; /** * (tox, toy)へcolorの持ち駒のkindを打つ. */ drop(tox: number, toy: number, kind: Kind, color?: Color): void; /** * dropの逆を行う,つまり(tox, toy)の駒を駒台に戻す. */ undrop(tox: number, toy: number): void; /** * (x, y)の駒の移動可能な動きをすべて得る * 盤外,自分の駒取りは除外.二歩,王手放置などはチェックせず. */ getMovesFrom(x: number, y: number): IMove[]; /** * colorが打てる動きを全て得る */ getDropsBy(color: Color): IMove[]; /** * (x, y)に行けるcolor側のkindの駒の動きを得る */ getMovesTo(x: number, y: number, kind: Kind, color?: Color): IMove[]; /** * (x, y)の駒を得る */ get(x: number, y: number): Piece; /** * keyを種類,valueを枚数とするオブジェクトとして持ち駒の枚数一覧を返す. */ getHandsSummary(color: Color): HandSummary; /** * 現在の局面でcolorの王に王手がかかっているか? */ isCheck(color: Color): boolean; /** * (x, y)の駒を取ってcolorの持ち駒に加える */ captureByColor(x: number, y: number, color: Color): void; /** * (x, y)の駒をフリップする(先手→先手成→後手→後手成→) * 成功したらtrueを返す */ flip(x: number, y: number): boolean; /** * 手番を設定する */ setTurn(color: Color): void; /** * (x, y)に駒を置く */ private set; /** * (x, y)の駒を取って反対側の持ち駒に加える */ private capture; /** * 駒pieceを持ち駒に加える */ private pushToHand; /** * color側のkindの駒を取って返す */ private popFromHand; /** * 次の手番に行く */ private nextTurn; /** * 前の手番に行く */ private prevTurn; /** * colorの手番で問題ないか確認する.編集モードならok. */ private checkTurn; } type HandSummary = { [K in Extract<Kind, "FU" | "KY" | "KE" | "GI" | "KI" | "KA" | "HI">]: number; }; export interface ISettingType { preset: string; data?: { color: Color; board: Array<Array<{ color?: Color; kind?: Kind; }>>; hands: HandSummary[]; }; } export interface IMove { from?: { x: number; y: number; }; to: { x: number; y: number; }; kind?: Kind; color?: Color; } export { Color, Piece, Kind, IMoveDefinition, kindToString, colorToString };