// node tools/calibrate_tressette.mjs [partite per livello, predefinite 300] // Stesse carte per i tre livelli; Andrea gioca come il suo socio («A fassi male»), gli avversari al livello scelto. import { newTressette, observation, choose, play, update, advance, canPlay, LEVELS } from '../src/engine/tressette.js'; export function simulate(seed, level, me = 'male') { const c = newTressette(seed, { level }); for (let steps = 0; steps < 5000 && c.step !== 'result'; steps++) { if (canPlay(c)) { const m = choose(observation(c, 0), me, steps + 1); if (!play(c, m.index, 0, m.signal)) throw new Error('mossa rifiutata: ' + c.refused); } if (!advance(c)) update(c, 20); c.events.length = 0; } if (c.step !== 'result') throw new Error('Partita non conclusa'); return c; } export function calibrate(n = 300, me = 'male') { return LEVELS.map(level => { let wins = 0, rounds = 0; for (let i = 1; i <= n; i++) { const c = simulate(Math.imul(i, 2654435761) >>> 0, level, me); wins += c.result.winner === 'player'; rounds += c.round; } return { level, games: n, playerPercent: 100 * wins / n, rounds: rounds / n }; }); } if (process.argv[1] === new URL(import.meta.url).pathname) console.log(JSON.stringify(calibrate(Number(process.argv[2]) || 300), null, 2));