function playGames(turnNb, posP1, posP2, scoreP1, scoreP2, universes, maxTurn=turnsPlayedP2) {
if(turnNb === 1)
mutable univ = 1
if (turnNb > maxTurn) {
return {
wonByP1: 0,
wonByP2: 0,
ongoing: universes
}
}
mutable univ += 26*universes
let player = turnNb % 2 === 0 ? 2 : 1
let pos = player === 2 ? posP2 : posP1
let score = player === 2 ? scoreP2 : scoreP1
let newUniverses = generatePossibleUniverses(pos, score, universes)
let universesWithFinishedGames = newUniverses.filter(u => u.done)
let gamesWonThisTurn = _.sum(universesWithFinishedGames.map(u => u.count))
let universesWithOngoingGames = newUniverses.filter(u => !u.done)
let futureOutcomes = {
wonByP1: 0,
wonByP2: 0,
ongoing: 0
}
for (let universe of universesWithOngoingGames) {
let newPosP1 = (player === 2) ? posP1 : universe.pos
let newPosP2 = (player === 2) ? universe.pos : posP2
let newScoreP1 = (player === 2) ? scoreP1 : universe.score
let newScoreP2 = (player === 2) ? universe.score : scoreP2
let outcome = playGames(turnNb + 1, newPosP1, newPosP2, newScoreP1, newScoreP2, universe.count, maxTurn)
futureOutcomes.wonByP1 += outcome.wonByP1
futureOutcomes.wonByP2 += outcome.wonByP2
futureOutcomes.ongoing += outcome.ongoing
}
let result = {
wonByP1: futureOutcomes.wonByP1 + (player === 2 ? 0 : gamesWonThisTurn),
wonByP2: futureOutcomes.wonByP2 + (player === 2 ? gamesWonThisTurn : 0),
ongoing: futureOutcomes.ongoing
}
return result
}