UNPKG

tsgammon-core

Version:

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

84 lines (83 loc) 2.64 kB
"use strict"; 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;