UNPKG

tsgammon-core

Version:

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

83 lines (82 loc) 3.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.wrap = exports.nodeWithEmptyDice = exports.boardStateNodeFromArray = exports.boardStateNode = exports.NO_MOVE = void 0; const BoardState_1 = require("./BoardState"); const buildNodesForDoublet_1 = require("./internals/buildNodesForDoublet"); const buildNodesForHeteroDice_1 = require("./internals/buildNodesForHeteroDice"); /** * NoMove型のインスタンス */ exports.NO_MOVE = { hasValue: false }; /** * 与えられた盤面とダイス目のペアから、BoardStateNodeを生成する * * @param board 盤面 * @param dicePips ダイス目のペア * @param movesForDoublet ゾロ目の時に動かせる駒数 * @returns 局面 */ function boardStateNode(board, dicePips, movesForDoublet = 4) { const { dice1, dice2 } = dicePips; return dice1 !== dice2 ? (0, buildNodesForHeteroDice_1.buildNodesForHeteroDice)(board, dice1, dice2) : (0, buildNodesForDoublet_1.buildNodesForDoublet)(board, dice1, movesForDoublet); } exports.boardStateNode = boardStateNode; /** * 駒の配置を格納した配列からBoardStateNodeを生成する。 * * pieces[0]が自分のバーポイント、pieces[25]が相手のバーポイントとなり * pieces[1]-[24]は盤面の各ポイントに対応する。 * * @param pieces 駒の配置。正は自駒、負は相手の駒 * @param dice1 ダイス目 * @param dice2 ダイス目 * @param bornOffs すでにベアリングオフした駒の数の対(順に自分、相手:省略時は0) * @param movesForDoublet ゾロ目の時に動かせる駒数 * @returns 局面 */ function boardStateNodeFromArray(pieces, dice1, dice2, bornOffs = [0, 0], movesForDoublet = 4) { const board = (0, BoardState_1.boardState)(pieces, bornOffs); return boardStateNode(board, { dice1, dice2 }, movesForDoublet); } exports.boardStateNodeFromArray = boardStateNodeFromArray; // ダイスを無視して何も次の手がない状態のBoardStateNodeを生成する function emptyNode(board, dices) { return { hasValue: true, dices, board, majorFirst: () => exports.NO_MOVE, minorFirst: () => exports.NO_MOVE, lastMoves: () => [], isRedundant: false, isCommitable: true, }; } /** * 与えられた局面に対し、ダイスなし、可能な手なしのBoardStateNodeを生成する * @param board */ function nodeWithEmptyDice(board) { return emptyNode(board, []); } exports.nodeWithEmptyDice = nodeWithEmptyDice; /** * 指定されたノードをWrapperに変換する * @param t Wrapperにしたいノード * @returns */ function wrap(t) { return _wrap(t, { hasValue: false }); } exports.wrap = wrap; function _wrap(t, // 直前のor/applyで引数の関数で見つかったノード was // or/applyの関数に、引数として渡されたノード ) { return { apply: (f) => _wrap(t.hasValue ? f(t) : t, t), or: (f) => _wrap(t.hasValue ? t : was.hasValue ? f(was) : was, was), unwrap: t, }; }