tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
47 lines (46 loc) • 1.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makePoint = void 0;
const BoardStateNode_1 = require("../BoardStateNode");
const findMove_1 = require("./findMove");
/**
* 指定された局面について、指定のポイントにブロックを築けるかどうかを返す
*
* @param node 対象となる局面
* @param pos ブロックを作ろうとしているポイント
* @returns ポイントを作った後の局面、またはNOMOVE
*/
function makePoint(node, pos) {
const dices = node.dices.filter((d) => !d.used);
if (dices.length < 2) {
return BoardStateNode_1.NO_MOVE;
}
const { major, minor } = dices[0].pip > dices[1].pip
? { major: dices[0].pip, minor: dices[1].pip }
: { major: dices[1].pip, minor: dices[0].pip };
if (pos < major) {
return BoardStateNode_1.NO_MOVE;
}
// 未使用のダイス2つで指定されたポイントが作れるなら、それを返す
const nodeMakePoint = (0, BoardStateNode_1.wrap)(node)
.apply(moveFinder(pos - major))
.apply(moveFinder(pos - minor)).unwrap;
if (nodeMakePoint.hasValue) {
return nodeMakePoint;
}
// ゾロ目の場合は、中間地点に作ってからそれを動かせるかを調べる
if (dices.length === 4 && major === minor) {
return (0, BoardStateNode_1.wrap)(node)
.apply(pointMaker(pos - major))
.apply(pointMaker(pos)).unwrap;
}
return BoardStateNode_1.NO_MOVE;
}
exports.makePoint = makePoint;
// apply(func)の形で記述するためのユーティリティ
function moveFinder(pos) {
return (node) => (0, findMove_1.findMove)(node, pos, false);
}
function pointMaker(pos) {
return (node) => makePoint(node, pos);
}