shogi.js
Version:
simple shogi library for JavaScript
175 lines (174 loc) • 5.07 kB
TypeScript
/** @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 };