UNPKG

baskin-lib

Version:
133 lines (132 loc) 4.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleAiTurns = exports.handlePlayerTurn = exports.handleAiTurnOnce = exports.makePlayLogEntry = exports.getCurrentNum = exports.gameIsEnd = exports.getLastPlayer = exports.getCurrentPlayer = void 0; const randUtil_1 = require("./randUtil"); const strategy_1 = require("./strategy"); /** * * @param playLog Current game play log. * @param numPlayer Number of players. * @returns Current player who need to call next number. */ function getCurrentPlayer(playLog, numPlayer) { if (playLog.length === 0) { return 0; } return (playLog[playLog.length - 1].player + 1) % numPlayer; } exports.getCurrentPlayer = getCurrentPlayer; /** * * @param playLog Current game play log. * @returns Last player who called number. Return `undefined` if playLog is empty. */ function getLastPlayer(playLog) { if (playLog.length === 0) { return undefined; } return (playLog[playLog.length - 1].player); } exports.getLastPlayer = getLastPlayer; /** * * @param playLog Current game play log. * @param numEnd Number of players. * @returns Return true if game is end. Else, return false. */ function gameIsEnd(playLog, numEnd) { if (getCurrentNum(playLog) === numEnd) { return true; } return false; } exports.gameIsEnd = gameIsEnd; /** * * @param playLog Current game play log * @returns Recently called number. */ function getCurrentNum(playLog) { if (playLog.length === 0) { return 0; } return playLog[playLog.length - 1].lastCall; } exports.getCurrentNum = getCurrentNum; /** * * @param newNum Called number without regarding ending number * @param numEnd The last number of the game * @param playerTurn Player number on this turn * @returns New PlayLogEntry after call */ function makePlayLogEntry(newNum, numEnd, playerTurn) { if (newNum >= numEnd) { return { player: playerTurn, lastCall: numEnd }; } else { return { player: playerTurn, lastCall: newNum }; } } exports.makePlayLogEntry = makePlayLogEntry; /** * * @param loseMat Lose matrix * @param playLog Current game play log * @param maxCall Maximum number of call in once * @param numEnd The last number of the game * @param aiTurn Player number of AI playing this turn * @returns Updated playLog after one AI turn */ function handleAiTurnOnce(loseMat, playLog, maxCall, numEnd, aiTurn) { const currentNum = getCurrentNum(playLog); const loseVec = (0, strategy_1.getLoseVec)(loseMat, maxCall, currentNum); const chooseProb = (0, strategy_1.getChooseProb)(loseVec); const numChoose = (0, randUtil_1.getRandomIntAsVec)(chooseProb); const newNum = numChoose + currentNum + 1; return makePlayLogEntry(newNum, numEnd, aiTurn); } exports.handleAiTurnOnce = handleAiTurnOnce; /** * * @param playLog Current game play log * @param numChoose Human chose to call numbers up to `numChoose` * @param numEnd The last number of the game * @param playerTurn Human player turn * @returns Updated playlog after human play. Doesn't mutate original playLog. */ function handlePlayerTurn(playLog, numChoose, numEnd, playerTurn) { const playLogCopy = playLog.slice(); const currentNum = getCurrentNum(playLog); const newNum = numChoose + currentNum; const newEntry = makePlayLogEntry(newNum, numEnd, playerTurn); playLogCopy.push(newEntry); return playLogCopy; } exports.handlePlayerTurn = handlePlayerTurn; /** * * @param loseMat Lose rate matrix for all game states * @param playLog Current game play log * @param maxCall Maximum number of call in once * @param numEnd The last number of the game * @param playerTurn Human player turn * @returns Updated playlog after ai play. Doesn't mutate original `playLog` */ function handleAiTurns(loseMat, playLog, maxCall, numEnd, playerTurn) { const playLogCopy = playLog.slice(); while (true) { const currentNum = getCurrentNum(playLogCopy); if (currentNum >= numEnd) { return playLogCopy; } const numPlayer = loseMat[0].length; const currentPlayer = getCurrentPlayer(playLogCopy, numPlayer); if (currentPlayer == playerTurn) { return playLogCopy; } const newEntry = handleAiTurnOnce(loseMat, playLogCopy, maxCall, numEnd, currentPlayer); playLogCopy.push(newEntry); } } exports.handleAiTurns = handleAiTurns;