Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A1dxvtsZx8NE9fwjXUNDBr
25 lines
1.3 KiB
JavaScript
25 lines
1.3 KiB
JavaScript
// 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, 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); }
|
|
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));
|