UNPKG

tsgammon-core

Version:

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

62 lines (61 loc) 2.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeLeap = void 0; const BoardStateNode_1 = require("../BoardStateNode"); const findMove_1 = require("./findMove"); /** * 与えられたBoardStateNodeについて、指定された位置へ駒を動かすムーブがあれば、それを返す * @param node * @param pos * @param useMinorFirst * @returns */ function makeLeap(node, pos, useMinorFirst) { const dices = node.dices.filter((d) => !d.used); if (dices.length == 0) { return BoardStateNode_1.NO_MOVE; } // まず、一つだけですむケースを探す const { major, minor } = dices.length >= 2 ? dices[0].pip > dices[1].pip ? { major: dices[0].pip, minor: dices[1].pip } : { major: dices[1].pip, minor: dices[0].pip } : { major: dices[0].pip, minor: undefined }; const withMajor = pos - major >= 0 ? (0, findMove_1.findMove)(node, pos - major, false) : BoardStateNode_1.NO_MOVE; // 本来はここでもuseMinorFirstを意識しないといけないが、この関数はmakePointの後で // 使用する想定なので、major/minorの両方で駒が動かせる時は、そちらで拾われることになり // 意識する意味がない if (withMajor.hasValue && withMajor.lastMoves()[withMajor.lastMoves().length - 1].to === pos) { return withMajor; } if (minor === undefined) { return BoardStateNode_1.NO_MOVE; } const withMinor = pos - minor >= 0 ? (0, findMove_1.findMove)(node, pos - minor, true) : BoardStateNode_1.NO_MOVE; if (withMinor.hasValue && withMinor.lastMoves()[withMinor.lastMoves().length - 1].to === pos) { return withMinor; } // 二つ使う場合は、useMinorFirstを反映させる const from = pos - (major + minor); const leap = (0, BoardStateNode_1.wrap)(node) .apply((node) => (0, findMove_1.findMove)(node, from, useMinorFirst)) .apply((node) => makeLeap(node, pos, useMinorFirst)).unwrap; if (leap.hasValue) { return leap; } // ゾロ目でないなら、これ以上のサーチは不要 if (dices.length < 3) { return BoardStateNode_1.NO_MOVE; } // 残りのダイス(全て同じ目とする)が使えるかどうかは再帰して判定する return ((0, BoardStateNode_1.wrap)(node) // 一つ前のポイントをクリックした状態を生成 .apply((node) => pos - major >= 0 ? makeLeap(node, pos - major, useMinorFirst) : BoardStateNode_1.NO_MOVE) // 一つ前のポイントにきた駒をクリックして進めた状態を生成 .apply((node) => (0, findMove_1.findMove)(node, pos - major, useMinorFirst)).unwrap); } exports.makeLeap = makeLeap;