Progetto:BridgeShape Motore e frontend: differenze tra le versioni

[versione verificata][versione verificata]
BridgeShape: allineamento docs DSL v2
Link a Editor e Laboratorio
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Documentazione BridgeShape: [[Progetto:BridgeShape API|API e sintassi DSL]] · [[Progetto:BridgeShape Ricette DSL|Ricette DSL]]
Documentazione BridgeShape: [[Progetto:BridgeShape API|API e sintassi DSL]] · [[Progetto:BridgeShape Ricette DSL|Ricette DSL]] · [[Progetto:BridgeShape Smazzate di gioco|Smazzate di gioco]] · [[Progetto:BridgeShape Editor e Laboratorio|Editor e Laboratorio]]


= BridgeShape — Specifica del motore di smazzate e del frontend (per Play) =
= BridgeShape — Specifica del motore di smazzate e del frontend (per Play) =
Riga 177: Riga 177:
* '''Punti totali <code><nowiki>tp</nowiki></code>''': PO + (per ogni seme, <code><nowiki>max(0, lunghezza − 4)</nowiki></code>).
* '''Punti totali <code><nowiki>tp</nowiki></code>''': PO + (per ogni seme, <code><nowiki>max(0, lunghezza − 4)</nowiki></code>).
* '''Punti distribuzione <code><nowiki>dp</nowiki></code>''': PO + 3 per ogni chicane + 2 per ogni singolo + 1 per ogni doubleton.
* '''Punti distribuzione <code><nowiki>dp</nowiki></code>''': PO + 3 per ogni chicane + 2 per ogni singolo + 1 per ogni doubleton.
* '''Perdenti <code><nowiki>ltc</nowiki></code>''' (Losing Trick Count): per ogni seme con <code><nowiki>n</nowiki></code> carte, considerare <code><nowiki>m = min(n,3)</nowiki></code>; perdenti del seme = <code><nowiki>m − (numero di A, K, Q posseduti nel seme)</nowiki></code>; somma sui 4 semi. (Seme vuoto = 0.)
* '''Perdenti <code><nowiki>ltc</nowiki></code>''' (Losing Trick Count classico): per ogni seme con <code><nowiki>n</nowiki></code> carte, <code><nowiki>m = min(n,3)</nowiki></code>; perdenti del seme = <code><nowiki>m − [A] − [K e n≥2] − [Q e n≥3]</nowiki></code>; somma sui 4 semi (seme vuoto = 0). Tabella di controllo: x=1, A=0, K=1, Q=1; xx=2, Ax=1, Kx=1, Qx=2, AK=0, AQ=1, KQ=1; AKQ=0, AKx=1, AQx=1, KQx=1, Axx=2, Kxx=2, Qxx=2, xxx=3. (Correzione: la formula precedente <code><nowiki>m − #A,K,Q</nowiki></code> contava anche K e Q secchi o Q doppia.)
* '''<code><nowiki>S=KJT</nowiki></code>''' (<code><nowiki>suit_cards</nowiki></code>): tra A K Q J 10 9 possiede ''esattamente'' quelle elencate; 8..2 liberi. Stringa vuota = nessuna carta alta. Gli onori elencati sono esclusi dalle altre mani solo per quel che riguarda la proprietà: ogni carta ha un unico proprietario.
* '''<code><nowiki>S=KJT</nowiki></code>''' (<code><nowiki>suit_cards</nowiki></code>): tra A K Q J 10 9 possiede ''esattamente'' quelle elencate; 8..2 liberi. Stringa vuota = nessuna carta alta. Gli onori elencati sono esclusi dalle altre mani solo per quel che riguarda la proprietà: ogni carta ha un unico proprietario.
* '''<code><nowiki>S~...</nowiki></code>''' (<code><nowiki>suit_patterns</nowiki></code>): una sola alternativa (scelta a caso, uniformemente tra quelle compatibili con gli altri vincoli) descrive tutta la mano in quel seme: <code><nowiki>cards</nowiki></code> + tra <code><nowiki>low_min</nowiki></code> e <code><nowiki>low_max</nowiki></code> carte basse (<code><nowiki>low_max: null</nowiki></code> = illimitato, ma ≤ 13 − len(cards)).
* '''<code><nowiki>S~...</nowiki></code>''' (<code><nowiki>suit_patterns</nowiki></code>): una sola alternativa (scelta a caso, uniformemente tra quelle compatibili con gli altri vincoli) descrive tutta la mano in quel seme: <code><nowiki>cards</nowiki></code> + tra <code><nowiki>low_min</nowiki></code> e <code><nowiki>low_max</nowiki></code> carte basse (<code><nowiki>low_max: null</nowiki></code> = illimitato, ma ≤ 13 − len(cards)).
* '''<code><nowiki>x:</nowiki></code>''' (jolly di posizione): un seme scelto a caso tra quelli ''non'' vincolati esplicitamente in quella posizione; <code><nowiki>xhcp:</nowiki></code> si riferisce allo stesso seme. Il jolly '''non''' è condiviso con altre posizioni.
* '''<code><nowiki>x:</nowiki></code>''' (jolly di posizione): un seme scelto a caso tra quelli ''non'' vincolati esplicitamente in quella posizione. Dentro una foglia di <code><nowiki>any()</nowiki></code>/<code><nowiki>not()</nowiki></code> il jolly vede '''solo i semi nominati nella foglia'''; un seme nominato soltanto in <code><nowiki>fit</nowiki></code>, confronti o <code><nowiki>longest:</nowiki></code> non è escluso da <code><nowiki>x</nowiki></code>; <code><nowiki>xhcp:</nowiki></code> si riferisce allo stesso seme. Il jolly '''non''' è condiviso con altre posizioni.
* '''Variabili <code><nowiki>$a..$d</nowiki></code>''': a inizio generazione ogni variabile usata riceve un seme dal proprio dominio (<code><nowiki>vars</nowiki></code>, default tutti e quattro). Variabili diverse hanno '''semi diversi'''; una variabile non dichiarata ha dominio completo. Una variabile può coincidere con un seme nominato esplicitamente (<code><nowiki>$a</nowiki></code> e <code><nowiki>H</nowiki></code>): se non è voluto, restringere il dominio (<code><nowiki>$a=SD</nowiki></code>). La scelta è uniforme tra le assegnazioni che rendono lo scenario soddisfacibile.
* '''Variabili <code><nowiki>$a..$d</nowiki></code>''': a inizio generazione ogni variabile usata riceve un seme dal proprio dominio (<code><nowiki>vars</nowiki></code>, default tutti e quattro). Variabili diverse hanno '''semi diversi'''; una variabile non dichiarata ha dominio completo. Una variabile può coincidere con un seme nominato esplicitamente (<code><nowiki>$a</nowiki></code> e <code><nowiki>H</nowiki></code>): se non è voluto, restringere il dominio (<code><nowiki>$a=SD</nowiki></code>). La scelta è uniforme tra le assegnazioni che rendono lo scenario soddisfacibile.
* '''<code><nowiki>fit</nowiki></code>''': somma delle lunghezze dei due compagni nel seme (o in qualunque seme del tipo <code><nowiki>major</nowiki></code>/ <code><nowiki>minor</nowiki></code>/<code><nowiki>any</nowiki></code>, a scelta del motore, uniformemente tra i semi che soddisfano il vincolo).
* '''<code><nowiki>fit</nowiki></code>''': somma delle lunghezze dei due compagni nel seme (o in qualunque seme del tipo <code><nowiki>major</nowiki></code>/ <code><nowiki>minor</nowiki></code>/<code><nowiki>any</nowiki></code>, a scelta del motore, uniformemente tra i semi che soddisfano il vincolo).
Riga 238: Riga 238:
* <code><nowiki>not()</nowiki></code> con <code><nowiki>S~</nowiki></code>: escludere dall'insieme di alternative, non solo filtrare a posteriori.
* <code><nowiki>not()</nowiki></code> con <code><nowiki>S~</nowiki></code>: escludere dall'insieme di alternative, non solo filtrare a posteriori.
* <code><nowiki>longest:</nowiki></code> e <code><nowiki>compare</nowiki></code> valgono sulle lunghezze finali (dopo il bind delle variabili).
* <code><nowiki>longest:</nowiki></code> e <code><nowiki>compare</nowiki></code> valgono sulle lunghezze finali (dopo il bind delle variabili).
* <code><nowiki>context.lead</nowiki></code> (<code><nowiki>SK</nowiki></code>): la carta deve stare nella mano dell'attaccante (§2) e quella mano deve soddisfare i suoi vincoli (es. se ha <code><nowiki>S=KJT</nowiki></code>, <code><nowiki>lead:SK</nowiki></code> è coerente, <code><nowiki>lead:SQ</nowiki></code> no).
* <code><nowiki>context.lead</nowiki></code> (<code><nowiki>SK</nowiki></code>): la carta deve stare nella mano dell'attaccante (§2) e quella mano deve soddisfare i suoi vincoli (es. se ha <code><nowiki>S=KJT</nowiki></code>, <code><nowiki>lead:SJ</nowiki></code> è coerente, <code><nowiki>lead:SQ</nowiki></code> no).
 
=== Chiarimenti (concordati con Play) ===
 
* '''<code><nowiki>context.auction</nowiki></code>''': la sequenza parte dal '''mazziere''' (<code><nowiki>dealer</nowiki></code>); il primo token è la sua chiamata. Se <code><nowiki>dealer</nowiki></code> manca, l'asta è solo descrittiva e non si verifica nulla. Nella v2 l'asta e <code><nowiki>contract</nowiki></code> sono '''informativi''': il motore non deve ricavarne vincoli sulle mani.
* '''<code><nowiki>declarer</nowiki></code>''': non deve discendere dall'asta (non verificata). Serve a stabilire chi attacca (vedi §2) e quindi a validare <code><nowiki>lead</nowiki></code>.
* '''<code><nowiki>errors</nowiki></code>''': array di '''stringhe''' <code><nowiki>"<etichetta scenario o 'scenario #N'>: <messaggio in inglese>"</nowiki></code>, senza codici né struttura. Il motore li riporta così come sono (codice proprio <code><nowiki>dsl_errors</nowiki></code>, §6). Un formato strutturato (<code><nowiki>code</nowiki></code>, <code><nowiki>scenario</nowiki></code>, <code><nowiki>position</nowiki></code>) è una possibile evoluzione: lo si introdurrebbe come campo nuovo <code><nowiki>errorDetails</nowiki></code>, senza toccare <code><nowiki>errors</nowiki></code>.
* '''<code><nowiki>descriptions</nowiki></code>''': oggi un elemento per scenario con <code><nowiki>positions</nowiki></code> (testo per posizione) e <code><nowiki>context</nowiki></code>; '''non esiste un id per singolo vincolo'''. Se il frontend lo richiede, si aggiungerà un campo additivo (da concordare, §11).
* '''«Uniforme»''' (variabili, jolly, <code><nowiki>fit</nowiki></code>): tra le assegnazioni di semi che rendono lo scenario soddisfacibile, ciascuna ha uguale probabilità (a meno di tolleranza statistica nei test: ±5 % su 1000 estrazioni per due valori, vedi caso 3). Non implica uniformità sulle carte o sulle mani.


----
----
Riga 359: Riga 367:
|-
|-
| 7
| 7
| <code><nowiki>opener aces:2 kc:H4</nowiki></code>
| <code><nowiki>opener aces:2 kc:H3</nowiki></code>
| 2 assi; assi + K♥ = 4
| 2 assi; assi + K♥ = 3 (<code><nowiki>kc:H4</nowiki></code> con <code><nowiki>aces:2</nowiki></code> è impossibile: max 2+1)
|-
|-
| 8
| 8
Riga 411: Riga 419:
|-
|-
| 20
| 20
| <code><nowiki>declarer:responder lead:SK opp2 S=KJT</nowiki></code>
| <code><nowiki>declarer:responder lead:SJ opp2 S=KJT</nowiki></code>
| K♠ in opp2; con <code><nowiki>lead:SQ</nowiki></code> → 422 <code><nowiki>lead_conflict</nowiki></code>
| J♠ in opp2; con <code><nowiki>lead:SQ</nowiki></code> → 422 <code><nowiki>lead_conflict</nowiki></code>
|-
|-
| 21
| 21