tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
83 lines (82 loc) • 3.09 kB
JavaScript
;
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,
};
}