Giochi di carte dopo la revisione di Codex sui tre insieme; player dei video «Come si gioca» e primo copione

Esito che vale e si salva appena deciso, per tutti i minigiochi (anche tornando al titolo dalla schermata del risultato); briscola: uscire durante il conteggio non perde più la vittoria; tressette: si esce ai 21 col primo evento che ci porta, accusa compresa (prima vinceva sempre Andrea se ci arrivavano tutte e due), il carico che fa vincere si dà anche se è il 2, accuse che non escono dal tavolo, convenzioni scritte nell'aiuto; scopa: primiera valutata per quel che migliora, finale esatto a mazzo finito, presa sulla tavola al rilascio con scelta e conferma, frecce e Invio sempre sulla presa scelta. Tastiera: Invio e Spazio giocano sempre la carta scelta. Tavola descritta a parole. Classi CSS comuni ai tre giochi.
Video: player nel gioco (pulsante «Guarda il video» nel «Come si gioca», compare quando il video esiste), video/narra.py per la voce del narratore, pezzi comuni dei copioni e il copione della briscola; scaletta in video/SCALETTA-CARTE.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1dxvtsZx8NE9fwjXUNDBr
This commit is contained in:
2026-10-26 16:39:22 +01:00
co-authored by Claude Opus 5.5
parent 30e324d7e2
commit 7e1e6f6144
24 changed files with 594 additions and 73 deletions
+15 -2
View File
@@ -91,8 +91,12 @@ test('si va ai 21: chi ci arriva per primo è fuori, anche a metà smazzata, e l
d.pending = [[], [{ who: 1, kind: 'napoletana', suit: 'fiori', points: 3, cards: [] }], [], []];
d.hands[1] = [card('fiori', '7'), ...d.hands[1].slice(1)];
assert.ok(play(d, 0, 1)); assert.equal(d.score[1], 22);
for (const seat of [2, 3, 0]) { d.current = seat; play(d, choose(observation(d, seat), 'seria').index, seat); }
assert.equal(d.step, 'trick'); collect(d); assert.equal(d.step, 'result'); assert.equal(d.result.winner, 'cpu');
assert.equal(d.step, 'result', 'l\'accusa fa uscire subito'); assert.equal(d.result.winner, 'cpu');
// Tutte e due a un passo, tutte e due con un'accusa: esce chi accusa per primo, chiunque sia (Codex, seme 28).
const e = newTressette(28); e.base = [18, 18]; e.score = [18, 18]; e.current = 1; e.table = []; e.tricks = [];
e.pending = [[{ who: 0, kind: 'buongioco', rank: '3', points: 3, cards: [] }], [{ who: 1, kind: 'buongioco', rank: '2', points: 3, cards: [] }], [], []];
assert.ok(play(e, 0, 1)); assert.equal(e.result.winner, 'cpu'); assert.deepEqual(e.score, [18, 21]);
assert.equal(play(e, 0, 2), false, 'a partita finita non si gioca più');
});
test('partite intere deterministiche col seme; i due mazzi danno le stesse carte', () => {
@@ -146,6 +150,15 @@ test('chi riceve il busso prende con la migliore; il socio non spreca il 3 su un
assert.equal(d.hands[3][choose(observation(d, 3), 'male').index].rank, '5');
});
test('se un carico al socio basta per i 21, si dà anche il 2', () => {
const c = newTressette(8); c.pending = [[], [], [], []]; c.current = 3;
c.base = [0, 20]; c.score = [0, 20]; c.thirds = [0, 1];
c.table = [{ who: 0, card: card('cuori', '4') }, { who: 1, card: card('cuori', '3') }, { who: 2, card: card('cuori', '5') }];
c.hands[3] = hand([['fiori', '2'], ['picche', '4']]);
assert.equal(c.hands[3][choose(observation(c, 3), 'seria').index].rank, '2');
assert.equal(c.hands[3][choose(observation(c, 3), 'male').index].rank, '2');
});
test('chi vola ha finito il seme: per «A fassi male» non può più avere il 3', () => {
const c = newTressette(8); c.pending = [[], [], [], []]; c.current = 1;
c.tricks = [{ leader: 2, winner: 0, cards: [{ who: 2, card: card('cuori', '4'), signal: 'volo' }, { who: 3, card: card('cuori', '5') }, { who: 0, card: card('cuori', '6') }, { who: 1, card: card('cuori', '7') }] }];