UNPKG

tsgammon-core

Version:

A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui

86 lines (76 loc) 2.76 kB
import { AbsoluteMove } from '../AbsoluteMove' /** * 駒の移動の表記方法の指定 */ export enum MoveFormatDirection { /** Whiteは開始点を0とし、増加方向に駒を進める表記。Redは24から減少方向に進む */ ABSOLUTE = 1, /** ABSOLUTEを反転させ、Redの開始点を0とする表記 */ ABSOLUTE_INV, /** WhiteもRedも開始点を0とし、増加方向に駒を進める表記 */ RELATIVE_ASC, /** RELATIVE_ASCを反転させ、開始点を24とする表記 */ RELATIVE_DEC, } /** * ムーブ1つを文字列表現に変換する。 * * ※連続するムーブ(e.g. 1/3 3/4 を1/3/4または1/4とまとめる機能は未実装) * * @param move 対象ムーブ * @param direction 表記方法 * @returns 変換後の文字列 */ export function formatAbsMove( move: AbsoluteMove, direction: MoveFormatDirection = MoveFormatDirection.RELATIVE_DEC ): string { return moveFormatter(direction)(move) } /** * ムーブの配列を文字列表現、またはムーブなしの表記の配列に変換する * * ※連続するムーブ(e.g. 1/3 3/4 を1/3/4または1/4とまとめる機能は未実装) * * @param move 対象ムーブ * @param direction 表記方法 * @param labelNoMove ムーブがない(空配列が渡された場合)の表記 * @returns 各ムーブを変換した文字列の配列 */ export function formatAbsMoves( moves: AbsoluteMove[], direction: MoveFormatDirection = MoveFormatDirection.RELATIVE_DEC, labelNoMove = '' ): string[] { if (moves.length === 0) { return [labelNoMove] } return moves.map((move) => formatAbsMove(move, direction)) } function moveFormatter( direction: MoveFormatDirection ): (move: AbsoluteMove) => string { const getter: (move: AbsoluteMove) => number[] = (() => { switch (direction) { case MoveFormatDirection.ABSOLUTE: { return (move: AbsoluteMove) => [move.fromAbs, move.toAbs] } case MoveFormatDirection.ABSOLUTE_INV: { return (move: AbsoluteMove) => [move.fromAbsInv, move.toAbsInv] } case MoveFormatDirection.RELATIVE_ASC: { return (move: AbsoluteMove) => [move.fromAsc, move.toAsc] } case MoveFormatDirection.RELATIVE_DEC: { return (move: AbsoluteMove) => [move.fromDec, move.toDec] } } })() return (move: AbsoluteMove) => { const [mFrom, mTo] = getter(move) const from = move.isReenter ? 'Bar' : mFrom const to = move.isBearOff ? 'Off' : mTo const hit = move.isHit ? '*' : '' return `${from}/${to}${hit}` } }