tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
84 lines (83 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.simpleEvalEngineWithEvaluator = exports.simpleEvalEngine = exports.randomEngine = void 0;
const collectNodes_1 = require("../utils/collectNodes");
/**
* 乱数エンジンを返す。キューブアクションは判断せず(ダブルはしない・常にテイク)、
* チェッカープレイは候補手からランダムに選ぶ。
*
* @returns 乱数エンジン
*/
function randomEngine() {
return {
initialized() {
//
},
cubeAction() {
return { isDouble: false };
},
cubeResponse() {
return { isTake: true };
},
checkerPlay(node) {
const nodes = (0, collectNodes_1.collectNodes)(node).filter((node) => !node.isRedundant);
if (nodes.length === 0) {
return node;
}
const n = Math.floor(Math.random() * nodes.length);
return nodes[n];
},
endOfGame() {
// do nothing.
},
};
}
exports.randomEngine = randomEngine;
/**
* 局面評価をする関数から、簡易なGammonEngineを生成する。
*
* キューブアクションは、期待値0.40(勝率70%)でダブル、-0.5(勝率25%)より上でテイク。
*
* @param evaluate 局面評価をする関数
* @returns GammonEngine
*/
function simpleEvalEngine(evaluate) {
const evaluator = {
initialize: () => {
//
},
endOfGame: () => {
//
},
evaluate,
};
return simpleEvalEngineWithEvaluator(evaluator);
}
exports.simpleEvalEngine = simpleEvalEngine;
function simpleEvalEngineWithEvaluator(ev) {
return {
initialized() {
ev.initialize();
},
cubeAction(board) {
return { isDouble: ev.evaluate(board) > 0.4 };
},
cubeResponse(board) {
return { isTake: ev.evaluate(board) > -0.5 };
},
checkerPlay(node) {
const candidates = (0, collectNodes_1.collectNodes)(node).filter((node) => !node.isRedundant);
const bestEv = candidates
.map((node) => ({ node, e: ev.evaluate(node.board) }))
.reduce((prev, cur) => (prev.e > cur.e ? prev : cur), {
node,
e: Number.NEGATIVE_INFINITY,
});
return bestEv.node;
},
endOfGame(boardStateNode) {
ev.endOfGame(boardStateNode);
},
};
}
exports.simpleEvalEngineWithEvaluator = simpleEvalEngineWithEvaluator;