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
25 lines
1.3 KiB
JavaScript
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));
|