Files
leggenda-del-regolo/tools/calibrate_scopa.mjs
T
manzoloandClaude Opus 5.5 30e324d7e2 Scopa agli 11 all'oratorio, e il tressette rivisto dopo la revisione critica di Codex
Scopa: toscane o napoletane (mattoni o denari), presa obbligatoria, la carta uguale prima delle somme, scelta fra più prese toccando la tavola, coi pulsanti o con frecce e Invio; scope (non all'ultima carta), carte, mattoni, settebello, primiera; tre livelli tarati (92, 64, 52%); test e prova nel browser.
Tressette: fuori ai 21 presa per presa, vittoria subito definitiva (Esc non la cancella più), accuse dette al proprio turno e col seme che manca del tris, striscio e busso meno rigidi, il socio risponde al busso, tiene il 3 e il 2, non esce d'Asso scoperto, legge il volo; tastiera col fuoco sulla carta scelta, tavola descritta a parole, riepilogo che aspetta Andrea. Stesso Esc corretto anche nella scopa.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1dxvtsZx8NE9fwjXUNDBr
2026-10-26 15:59:10 +01:00

25 lines
1.3 KiB
JavaScript

// node tools/calibrate_scopa.mjs [partite per livello, predefinite 300]
// Stesse carte per i tre livelli; Andrea gioca come «A fassi male», l'avversario al livello scelto.
import { newScopa, observation, choose, play, update, advance, canPlay, LEVELS } from '../src/engine/scopa.js';
export function simulate(seed, level, me = 'male') {
const c = newScopa(seed, { level });
for (let steps = 0; steps < 5000 && c.step !== 'result'; steps++) {
if (canPlay(c)) { const m = choose(observation(c, 'player'), me, steps + 1); if (!play(c, m.index, 'player', m.option)) throw new Error('mossa rifiutata'); }
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));