Perché il burraco, e perché da zero

Il burraco è tra i giochi di carte più cercati online in Italia, ma l'offerta gratuita di qualità è scarsa: molti siti richiedono un account solo per iniziare, altri puntano dritti al multiplayer a pagamento, altri ancora sono pieni di banner che rendono la partita illeggibile su mobile. Volevo l'opposto — apri la pagina, il computer mischia le carte, giochi. Come per gli altri giochi di roversia.it, tutto scritto in JavaScript vanilla: nessuna libreria di carte, nessun engine, solo DOM, CSS e la logica di gioco.

La parte interessante non è l'interfaccia — carte, animazioni, layout sono lavoro meccanico — ma le regole stesse. Il burraco ha una combinazione di vincoli che sembrano semplici finché non li devi tradurre in codice che deve funzionare sempre, anche nei casi limite: quante scale si possono formare con due jolly agli estremi, quando si può aprire il pozzetto, cosa succede se nessuno chiude e il mazzo finisce.

Validare tris e scale, jolly compresi

Le due combinazioni valide sono il tris (3 o più carte dello stesso valore) e la scala (3 o più carte in sequenza dello stesso seme). I 2 e le pinelle sono jolly e sostituiscono qualsiasi carta in entrambe. Per il tris la regola è diretta: separo carte reali e jolly, verifico che le reali abbiano tutte lo stesso valore, e impongo che i jolly non superino il numero di carte reali — altrimenti il tris diventerebbe "quasi tutto jolly", cosa che le regole classiche non ammettono.

La scala è più delicata. Prendo le carte reali dello stesso seme, calcolo lo span tra il valore minimo e massimo, e i "buchi" interni che restano da riempire sono la differenza tra lo span e il numero di carte reali. Se i jolly disponibili non bastano a coprire quei buchi, la scala non è valida. Se invece avanzano jolly dopo aver riempito i buchi interni, quelli possono estendere la scala oltre gli estremi — ma solo se c'è "spazio" verso l'asso o verso il re, perché il mazzo non gira in tondo.

⚠️

Il caso che mi ha fatto perdere più tempo: una scala che parte da un 9 e arriva a un re, con un jolly avanzato. Quel jolly può solo estendersi verso il basso (9→8) perché sopra il re non c'è spazio. Se non gestisci esplicitamente l'asimmetria tra "spazio sotto" e "spazio sopra" lo span, il validatore accetta scale impossibili.

Il burraco vero e proprio — quello che dà il nome al gioco — è una scala di almeno 7 carte: pulito se fatto di sole carte reali, sporco se contiene uno o più jolly. È anche la condizione necessaria per chiudere la mano: senza almeno un burraco calato, calare tutte le carte non basta a vincere la partita.

Il pozzetto: una regola che dipende dalla storia, non dal presente

Il pozzetto è un mazzetto di 11 carte che si può prendere intero al posto di pescarne una sola dal mazzo. Per aprirlo, però, un giocatore deve aver calato almeno un tris o una scala pulita, cioè senza jolly. È la regola che mi ha costretto a ripensare lo stato di gioco: non basta guardare cosa c'è sul tavolo in questo momento, perché una volta aperto il pozzetto resta aperto anche se in seguito vengono calate solo combinazioni sporche. Serve tracciare un flag persistente per ciascun giocatore — "ha già aperto" — aggiornato una sola volta, al primo meld pulito, e mai più ricalcolato da zero.

Chi prende il pozzetto aggiunge tutte le 11 carte alla propria mano in un colpo solo: un vantaggio enorme in termini di combinazioni possibili, ma anche undici carte in più da smaltire prima di poter chiudere. Bilanciare quando conviene prenderlo è una delle decisioni più importanti anche per l'avversario umano, ed è per questo che diventa un buon indicatore per calibrare quanto "aggressiva" far giocare l'intelligenza artificiale.

Un'IA a tre livelli, senza reti neurali

Niente machine learning: l'avversario è governato da euristiche diverse per ogni difficoltà, applicate in tre momenti del turno — decisione se pescare dal pozzetto, ricerca delle calate possibili, scelta della carta da scartare.

Facile

Prende il pozzetto solo nel 12% dei casi in cui potrebbe, cerca esclusivamente tris di valore già in mano (nessuna ricerca di scale), tenta una sola calata a turno e poi si ferma, e scarta una carta a caso — anche un jolly, se capita, il che è oggettivamente una mossa debole ma realistica per un livello introduttivo.

Media

Sale al 30% di probabilità di prendere il pozzetto e passa a un ciclo greedy: cerca tris, poi scale, poi prova ad aggiungere carte alle calate già presenti sul tavolo, e ripete il ciclo finché trova qualcosa da calare o supera un tetto di iterazioni di sicurezza. Nello scarto, sceglie la carta di valore più alto tra quelle non-jolly, per liberarsi del rischio di restare con carte pesanti in mano a fine mano.

Difficile

Prende il pozzetto nel 65% dei casi utili, esegue lo stesso ciclo greedy della media ma in più riutilizza i jolly avanzati per allungare le proprie scale verso il burraco (7 carte), e soprattutto sceglie lo scarto guardando il tavolo: calcola quali semi e quali valori l'avversario umano sta effettivamente usando nelle sue calate, ed evita di scartare carte che gli servirebbero, preferendo jolly solo come ultima risorsa.

Il risultato è un avversario che, a parità di codice sorgente, si comporta in modo percepibilmente diverso solo cambiando poche soglie numeriche e aggiungendo un paio di euristiche mirate — senza la complessità di un vero motore di ricerca.

Chiusura mano, punteggio e cosa resta salvato

La mano finisce quando un giocatore cala l'ultima carta senza più scarti, avendo già realizzato almeno un burraco — oppure in stallo, se il mazzo si esaurisce senza che nessuno chiuda. Il punteggio somma i valori delle carte calate da ciascun giocatore e sottrae quelle rimaste in mano, con bonus dedicati per burraco pulito e sporco. Lo storico partite e il punteggio totale restano salvati in localStorage: nessun account, ma anche nessuna sincronizzazione tra dispositivi diversi — una scelta coerente con l'obiettivo di "apri e giochi", da rivedere solo se in futuro servisse un multiplayer reale con backend.

Lo stesso approccio di PWA installabile e zero dipendenze l'ho già usato per Neon Breakout: cambia la natura del problema — lì fisica e collisioni in tempo reale su canvas, qui validazione di regole discrete e IA a euristiche — ma la filosofia di fondo resta la stessa: un file HTML autosufficiente, installabile come app, senza build step.

Domande frequenti

Come si valida una scala di carte con i jolly in JavaScript?

Si separano le carte reali dai jolly, si calcola lo span tra la carta più bassa e quella più alta dello stesso seme, e si verifica che i buchi interni siano coperti dai jolly disponibili. I jolly avanzati possono poi estendere la scala oltre i due estremi, purché restino dentro il range asso-re.

Come si programma un'intelligenza artificiale per un gioco di carte come il burraco?

Senza reti neurali o ricerca esaustiva: bastano euristiche diverse per ogni livello di difficoltà, applicate su probabilità di pescare dal pozzetto, ricerca greedy delle calate possibili e scelta dello scarto in base a cosa sta usando l'avversario.

Si può giocare a burraco online gratis senza registrazione?

Sì: apri la pagina e giochi subito contro il computer, senza account. Storico partite e punteggio restano salvati in locale nel browser tramite localStorage.

Come funziona il pozzetto nel burraco e perché è la regola più delicata da programmare?

Si apre quando un giocatore cala il suo primo tris o la sua prima scala pulita, senza jolly. È delicato perché dipende dallo storico delle calate di quel giocatore, non dallo stato attuale del tavolo: serve un flag persistente aggiornato una sola volta.

Conviene scrivere un gioco di carte in JavaScript vanilla o usare un framework?

Per un gioco a carte con interfaccia HTML/CSS classica e logica di validazione, un framework aggiunge complessità senza benefici reali. Comincia a convenire solo con multiplayer in tempo reale o stato condiviso complesso.