baskin-lib
Version:
baskin robbins 31 web game library
133 lines (132 loc) • 4.47 kB
JavaScript
"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;