Solo un piccolo passo (2015/11/10) : in rete http://www.elegio.it/omnia/sc/altri-scacchi.html

Come progetto di fare per memorizzare varie partite includendo le alternative possibili dall'inizio dell'incontro

Cerco di fare in modo che ad ogni turno ci sia una sola mossa anche se la mossa implica altri spostamenti di pezzi come accade quando si fa l'arrocco.

Precedentemente prevedevo anche due mosse per consentire di indicare come si vuole promuovere un Pedone che ha raggiunto il traguardo. Ovviamente la promozione è a Regina dato che la Regina è il pezzo più potente nel gioco degli scacchi.... ma a volte, in rare situazioni, per vincere quasi subito, può essere conveniente promuovere il Pedone non a Regina ma a Torre o Alfiere o Cavallo... sopratutto a Cavallo che ha la facoltà di arrivare dove la Regina non riuscirebbe ad arrivare...

Allora una soluzione sarebbe questa... Quando il Pedone Bianco sta nella traversa 7 e se ha la possibilità di avanzare raggiungendo il suo traguardo, ha quattro opzioni: traversa 8 se viene promosso a Regina, traversa 1 se viene promosso a Torre, traversa 2 se viene promosso ad Alfiere e traversa 3 se viene promosso a Cavallo.
Ovviamente lui andrà sempre e solo alla traversa 8 ma se, per esempio, la traversa indicata fosse la 3 diventerà un Cavallo etc...
Analogamente si fa per il Pedone Nero che, arrivato alla traversa 2, potrebbe raggiungere il suo traguardo ossia la traversa 1. Se si indicherà veramente la traversa 1 verrà promosso a Regina ma se si indicherà la traversa 8 verrà promosso a Torre, se la 7 verrà promosso ad Alfiere e se la 6 verrà promosso a Cavallo.... ma ovviamente occupando comunque lo scacco che ha raggiunto rispettando le regole del suo movimento e come se fosse promosso a Regina, la scelta più probabile.

Questa impostazione però è troppo complicata se uso una cifra decimale per indicare il colore del pezzo. Nella cifra decimale posso quindi nascondere altre informazioni aggiuntive ossia, per esempio, un Pedone Bianco/Blu ha colore 0 se, al suo traguardo, viene promosso a Regina, 2 se promosso a Torre, 4 se promosso ad Alfiere e 6 se promosso a Cavallo. Analogamente, per il Pedone Nero/Rosso uso le stesse cifre ma aumentate di 1.

Ci sono due fasi di specifica della partita. La prima è il posizionamento dei pezzi sia Bianchi/Blu che Neri/Rossi e la seconda le mosse, una mossa per turno...
Nella prima fase l'intero positivo usato va interpretato in questo modo:

  1. Il tipo del pezzo è questo: 0==Scacco vuoto ( ma non ha senso usarlo nella prima fase di posizionamento dei pezzi sulla scacchiera ) 1==Re, 2==Regina, 3==Torre, 4==Alfiere, 5==Cavallo, 6==Pedone.
  2. Due cifre. Dove va messo il pezzo prima di iniziare la partita: la prima cifra è la traversa e la seconda riga è la colonna ( cifre da 1 ad 8 nel gioco classico ). Si indica come prima cifra la colonna perché tradizionalmente, nel gioco degli scacchi la colonna viene indicata per prima e da una lettera (a, b, c, d, e, f, g, h ) e non da una cifra.
  3. Una singola cifra. Colore del pezzo. Se pari il pezzo è Bianco/Blu e se dispari il pezzo è Nero/Rosso. Nel caso del Re questa cifra indica anche la facoltà di arroccare.
    Se 0 o 1 il Re Bianco o Nero non può arroccare. Se 2 o 3 il Re Bianco o Nero può fare l'arrocco lungo ossia verso la Torre a sinistra. Se 4 o 5 il Re Bianco o Nero può fare l'arrocco corto ossia verso la Torre a destra. Se 6 o 7 il Re Bianco o Nero può fare sia l'arrocco lungo che l'arrocco corto.

Nella seconda fase ossia quella delle mosse, l'intero positivo usato va interpretato in questo modo:

  1. Tutte le cifre prima della sesta: quante risposte sono previste o concesse all'avversario. Anche se la partita è terminata questa cifra deve essere 1 e senza che venga fatto un movimento ( in genere si fa finta di spostare senza spostarlo uno scacco vuoto ). Questa regola consente di fare evolvere TUTTI i rami fino al turno finale da cui deve partire l'analisi della partita descritta dal particolare ramo.
  2. Una cifra del pezzo catturato dalla mossa. Questo per potere ricostruire quel particolare ramo della partita andando sia avanti che indietro nel turno. Se, nella fase di creazione di un dato turno si cambia parere e si decide una mossa diversa ritenuta più vantaggiosa, bisogna potere ristabilire la scacchiera iniziale del turno e fare la mossa diversa con la diversa eventuale cattura del pezzo dell'avversario.
  3. Due cifre. La traversa e la colonna di arrivo del pezzo. Se il Pedone raggiunge il suo traguardo bisognerà includere nella cifra di precisazione del colore anche l'informazione dell tipo di promozione scelto.
  4. Una cifra. Tipo del pezzo prima che si muova: 0==Il vuoto va non usato, 1==Re, 2==Regina, 3==Torre, 4==Alfiere, 5==Cavallo, 6==Pedone. Ovviamente questo dato, analizzando la partita dall'inizio, è inutile ossia ridondante ma serve a controllare che non si siano commessi degli errori anche nella indicazione di come spostare il pezzo.
  5. Due cifre. La traversa e la colonna di partenza del pezzo. Ovviamente, nel ricostruire la partita è noto il tipo del pezzo che viene mosso e dunque si può accertare se la mossa è legale o errata. Se errata l'analisi si blocca con appropriata segnalazione dell'errore.
  6. Una cifra che specifica il colore del pezzo e serve per dare informazioni aggiuntive sulla facoltà di arrocco del Re e sulla modalità di promozione del Pedone arrivato alla traversa traguardo.Per il Pedone Bianco/Blu il tipo di promozione si indica in questo modo: 0==Regina, 2==Torre, 4==Alfiere, 6==Cavallo mentre per il Pedone Nero/Rosso, in questo modo: modo: 1==Regina, 3==Torre, 5==Alfiere, 7==Cavallo.

Dato che, quando si specifica una mossa si indica il numero delle mosse concesse all'avversario è automatico capire, quale mossa seguente risulta la successiva delle varie mosse specificate nel turno precedente.
In questo modo diventa possibile creare un albero di mosse. Quando inizia la partita, il colore che deve muovere, solitamente il Bianco, ha la possibilità di fare parecchie mosse alternative e per ciascuna di esse l'avversario ha la possibilità di fare parecchie mosse di risposta. Dunque per esempio supponiamo che si abbiano 20 mosse legali come prima mossa. Se le risposte sono 20 saranno da considerare 20*20=400 alternative e la sequenza più probabile è quella in cui, ad ogni mossa del Bianco, il Nero risponda in modo che la situazione di quando tocca ancora al Bianco sia la meno favorevole per lui. Nota quindi la probabile risposta del Nero il Bianco prediligerà la mossa che sia a lui più favorevole. Bisogna dunque avere a disposizione una funzione empirica che valuti e quantizzi il vantaggio di ogni disposizione degli scacchi confrontata alla disposizione iniziale. Il Bianco cercherà il valore più alto e positivo mentre il Nero il valore più negativo ossia più alto in valore assoluto ma negativo.

La memorizzazione dei dati viene fatta in modo molto diverso dalla specifica delle mosse. Ci sono infatto 10 dati distinti ossia :

//
//  Fase di inizializzazione :
//  [0,0,0,0,TipoPezzo,Colonna,Traversa,Colore,0,0]
//
//  Mossa standard:
//  [QuantiFigli,TipoPreso,ColFin,TravFin,TipoPezzo,
                           ColIni,TravIni,Colore,Padre,Primog]
//

Si tratta di un modo di memorizzare la mossa sprecando memoria ma, almeno in questi studi preliminari, il numero di mosse è relativamente piccolo, difficilmente superiore al milione di mosse e dunque alla decina di milioni di interi per cui, data la grande disponibilità di memoria degli attuali PC, va privilegiata la velocità di accesso ed utilizzo dell'albero anche se memorizzato in modo poco risparmioso.

               
               
               
               

Per fare prove dell'algoritmo progettato qui

Javascript non è attivato!


Accesso al file
Provando ad usare la versione attuale che sono, poco fa
riuscito a fare funzionare, noto una fatica per specificare 
la scacchiera di partenza.
Tutti quegli interi non consentono di avere una visione globale.

IL RIMEDIO CHE CERCHERÒ DI ATTUARE

Scrivere un programma che renda subito comprensibile la struttura della
scacchiera di ingresso e facile la gestione Javascript ed HTML.

TORNARE AL PASSATO E ALLE CONVENZIONI GIÀ REPERIBILI IN RETE....

  1. Le Maiuscole indicano pezzi Bianchi e le minuscole indicano pezzi Neri e altri caratteri senza distinzione tra Maiuscole e minuscole, come il punto o il più o il meno, indicano scacchi vuoti... ma potrei anche usare dei tipi particolari di pezzi, come lo Z o z, iniziale di zero, per indicare uno scacco vuoto.
  2. Fare convenzioni piacevoli non solo per italiani ma anche per inglesi ... o cinesi o russi... ossia usare nomi tradizionali in varie lingue.
  3. Definire tutto nella scacchiera ossia anche quello che è avvenuto in passato ossia se un Pedone è appena stato mosso facendo uno spostamento di due scacchi e dunque è catturabile al passo ossia al varco, se una Torre è alla posizione di inizio partita da sempre ossia è arroccabile naturalmente se esistono le condizioni per arroccare, se il Re non è mai stato mosso dalla posizione di inizio partita ossia se è arroccabile a patto, ovviamente, che anche la Torre sia arroccabile. Dunque non ci sono solo 6 tipi di pezzi ossia, in italiano, Re,Donna,Torre,Alfiere,Cavallo,Pedone ( in inglese King,Queen,Rook,Bishop,Knight,Pawn ) ma c'è anche Imperatore,Fortezza,Militare ossia, in pratica, Imperatore è il Re arroccabile, Fortezza è la Torre arroccabile, Militare è il Pedone spostato alla mossa prima di due scacchi e dunque catturabile al passo ossia al varco da un Pedone avversario.
  4. Dunque per specificare la scacchiera classica occorrono 9 stringhe di cui la prima specifica le convenzioni preferite dato che un inglese o un tradizionalista ne preferirà altre e le 8 stringhe seguenti sono le 8 righe a partire dalla traversa ottava a scendere fino alla prima traversa.
  5. Per esempio l'array Javascript che descrive la partita ha, all'inizio, 9 stringhe ossia, se consideriamo l'inizio partita classico è questa: [ ".RDTACPIFM","fcadiacf", "pppppppp", "........", "........", "........", "........", "PPPPPPPP", "FCADIACF" ];
  6. Per non creare vincoli inutili, la suddivisione della Array Javascript deve potere essere casuale ossia motivata solo da esigenze di scrittura mentre il programma che deve tradurre questo modo in scrivere in altre convenzioni eliminerà automaticamente la Array suddivisa in elementi vari e la trasformerà in una lunghissima stringa priva di spazi bianchi ed altri caratteri non significativi ed eventualmente suddividerà la stringa enorme così ottenuta, in spezzoni, memorizzati in appositi elementi di una Array interna, seguendo regole utili per la gestione Javascript dell'insieme dei dati. Per esempio si potrà anche usare due sole stringhe di definizione ossia: [".RDTACPIFM", "fcadiacf pppppppp ........ ........ ........ ........ PPPPPPPP FCADIACF"]; ed anche in questo caso si potrebbero eliminare gli spazi bianchi che però servono a fare capire, mentalmente a chi legge, il cambio di traversa.
  7. Vedere le pagine della notazione algebrica ufficiale ossia:
  8. Volendo c'è già tutto per specificare una partita ma forse mancano le convenzioni per specificare una scacchiera "eretica" ossia pezzi non classici come quelli che propongo io ossia le Amanti del Re che, per non confonderle con gli Alfieri, chiamerei Schiave o Serve o Sposefuture o Segretarie e per alludere ai Portaborse ma già la P va usata per Pedone o forse i Leccaculi ma il termine è troppo offensivo.... ( vedere http://www.elegio.it/omnia/sc/bozzascacchi.html )

Dunque ora devo realizzare il semplice TRADUTTORE che mi consenta di semplificare la specifica della partita a scacchi sia classica che eretica.

Sono incerto se usare questa convenzione:

https://it.wikipedia.org/wiki/Notazione_Forsyth-Edwards

La FEN si basa su un sistema sviluppato dal giornalista scozzese David Forsyth (1854-1909). Tale sistema acquistò popolarità nel XIX secolo; Steven Edwards lo ampliò per consentirne l'uso da parte degli elaboratori elettronici. La FEN è parte integrante della Notazione Portable Game, essendo utilizzata per definire la posizione iniziale ove essa non coincida con quella usuale.

In pratica soddisfa alle mie esigenze di specificare tutto ma non ho capito se va sempre bene per specificare l'albero delle mosse ossia ricostruire la scacchiera a cui si riferisce una data mossa di cui va valutata la convenienza per il giocatore che la attua. Devo studiarla in modo approfondito pensando ai possibili ampliamenti per includere le belle Segretarie.

Da fare

Dato che le mie convenzioni saranno MOLTO più ampie di quelle ufficiali della FIDE scriverò un TRADUTTORE dalle convenzioni mie a quelle della FIDE ( http://www.fide.com/ ).

Tra l'altro Milano ha l'onore di ospitare la sede della Federazione Scacchistica Italiana https://it.wikipedia.org/wiki/Federazione_Scacchistica_Italiana in viale Regina Giovanna 12 ( http://www.federscacchi.it/ )

Notazione_Portable_Game

  1. Le mosse vengono numerate e descritte in notazione algebrica tramite l'iniziale del pezzo e la casa di destinazione. Ad esempio 3. Ae5 (oppure 3. Be5, in inglese, o ancora 3. e5, in notazione simbolica) significa "terza mossa muove l'Alfiere in e5". 5. Cf3 (5. Nf3, in inglese, 5. f3) significa "quinta mossa muove il Cavallo in f3". Nel caso dei Pedoni si indica solo la casa di destinazione: 1. e5 significa "prima mossa muove il Pedone in e5".
  2. In caso di conflitto, se cioè due pezzi dello stesso tipo possono muovere nella stessa casa, l'iniziale del pezzo è seguita da:
    • se i due pezzi sono sulla stessa riga: la colonna del pezzo che effettua la mossa, ad esempio Cfd4 che significa "il Cavallo della riga f si muove in d4";
    • se i due pezzi sono sulla stessa colonna: la riga del pezzo che effettua la mossa, ad esempio T7a4 che significa "la Torre della colonna 7 muove in a4";

Mosse speciali vengono ulteriormente specificate:

La cattura di un pezzo viene indicata con una x. Ad esempio Dxe4 che significa "la Regina cattura e si porta in e4".
Lo Scacco viene indicato con un +. Ad esempio De4+ che significa "la Regina si porta in e4 e mette il Re sotto Scacco".
Lo Scacco matto viene indicato con # oppure con ++. Ad esempio De4# ossia e4# oppure De6++ ossia e6++ .
L'Arrocco corto viene indicato con O-O , mentre l'Arrocco lungo con O-O-O.
La Promozione viene indicata con = seguito dall'iniziale del nuovo pezzo. Ad esempio c1=D ossia c1= che significa il Pedone raggiunge la casella c1 e viene promosso Regina.

Critica mia: questa notazione ufficiale non è pensata per descrivere le diramazioni ( l'albero ) di una mossa ossia le varie possibili risposte legali dell'avversario. Se faccio una mossa apparentemente legale ma, per esempio, spostando un mio pezzo rendo possibile la cattura del mio Re da parte dell'avversario, faccio una mossa illegale che non risulta evidente usando la notazione ufficiale ( nel linguaggio tradizionale si dice che il pezzo è inchiodato ossia non lo posso spostare perché perderei il mio Re ) e se, per esempio, sposto la mia Regina e il mio avversario la può mangiare con un Pedone, faccio una mossa, con altissima probabilità, a meno che il sacrificio mi dia la possibilità di dare presto scacco matto, MOLTO STUPIDA ossia sarebbe una svista ma questo sarebbe evidente specificando le risposte dell'avversario più vantaggiose per l'avversario stesso e dunque le mosse che l'avversario farebbe con altissima probabilità.

Bozza delle mie convenzioni di scrittura ( che spero definitive )

La partita viene descritta da una alternanza di caratteri e di cifre e userò una tabella per indicare quali codici Unicode considero appunto caratteri MAIUSCOLI e caratteri minuscoli e quali codici Unicode considero cifre ossia, ovviamente quelle da 0 a 9 ma anche il segno -.

Ogni mossa è fatta da una stringa di due o tre caratteri e da un intero positivo o negativo che, di norma ha almeno 5 cifre decimali positive o di più ma può valere 0 o essere un numero negativo per indicare che la mossa è prevista ( e non preceduta da nessuna stringa ) ma non è ancora stata calcolata.

Se l'intero è zero vuol dire che quella partita, una delle diramazioni possibili in risposta alla mossa dell'altro giocatore, è ormai TERMINATA ( con la sconfitta di un giocatore o col pareggio ) ma comunque bisogna segnalare la mossa non calcolata o terminata per potere risalire all'antenato della mossa ( dato che la ricostruzione delle mosse di una delle possibili partite discendenti da una particolare disposizione iniziale dei pezzi viene fatta partendo dall'ultima generazione e risalendo al padre, al nonno, al bisnonno etc. ). Come nel caso dell'intero negativo anche lo 0 non viene preceduto dalla stringa che specifica la mossa dato che lo zero serve solo come promemoria ma quella partita è finita ( magari da varie generazioni ) e dunque, ovviamente, nessun pezzo si può muovere.

La stringa che precede l'intero deve essere fatta di almeno due caratteri o anche di tre se il pezzo che è stato mosso è stato anche promosso ( come avviene nel gioco classico quando un Pedone raggiunge il suo traguardo ) o ha perso qualche sua facoltà di movimento. Dunque anche i Pedoni vanno indicati per chiarire chi fa la mossa ossia il Bianco/Blu se il carattere è maiuscolo e il Nero/Rosso se il carattere è minuscolo. La non cattira va indicata con una zeta minuscola se ha mosso il Bianco/Blu e con una Zeta maiuscola se ha mosso il Nero/Rosso e questo serve a rendere chiaro quale giocatore ha fatto la mossa. Se poi il pezzo viene promosso bisogna indicare il tipo di pezzo a cui viene promosso ossia R,T,A,C se ha mosso il Bianco/Blu e r,t,a,c se ha mosso il Nero/Rosso.

Notare ( ribadisco ) che in base a queste regole si possono inserire caratteri bianchi a piacere o caratteri che non sono considerati simboli di pezzi e neppure cifre. Dunque per esempio la mossa di un Pedone Bianco/Blu che non fa catture si può indicare con una "Pz" oppure con una "P z" e se invece si è mosso, senza fare catture un pedone Nero/Rosso, la mossa si può indicare o con una "pZ" o con una "p Z" indifferentemente e se il pedone viene promosso a Regina ( Donna ) si scrive "p Z d" o "pZd" o "pZ d" etc....

Nel numero positivo che segue i caratteri non numerici sono inserite tre informazioni: quante risposte sono previste o consentite all'avversario ( risposte che verranno calcolate poi...), colonna e traversa iniziale del pezzo e colonna e traversa finale del pezzo. Dunque le cifre devono essere al minimo 5 ma ce ne possono essere anche 6, se all'avversario sono consentite dieci mosse e più fino a 99 e 7 se all'avversario sono consentite 100 mosse e più etc. Dunque, dato che le cifre vanno raggruppate in tre gruppi di cui il secondo e terzo gruppo è sempre fatto di una coppia di cifre ( la colonna e la traversa), è consentito interporre spazi bianchi anche tra le cifre. Per esempio, all'inizio della partita classica, se si muove di due traverse in avanti il pedone del Re Bianco/Blu si potrà scrivere "Pz995254" se si concedono all'avversario ben 99 mosse anche se, le mosse realmente fattibili in questo caso sono solo 20 ossia 16 avanzamenti degli 8 Pedoni e 4 modi di fare saltare i 2 cavalli... Ma indifferentemente si può scrivere in modo molto più comprensibile, "P z 99 52 54" evidenziando meglio i tre gruppi logici in cui va suddiviso l'intero.

Nel caso di arrocco, lungo, da parte del bianco si scriverà "IzR995131" e nel caso di arrocco corto "IzR995171" interponendo a piacere spazi bianchi e facendo rilevare che l' Imperatore, facendo l'arrocco, diventa un semplice Re ossia perde, da quel momento in poi la facoltà di arroccare. Ovviamente esistono condizioni imposte all'arrocco ossia deve esserci una Fortezza e non una Torre in 11 per l'arrocco lungo o una Fortezza e non una Torre in 81 per l'arrocco corto. E poi ci sono altri vincoli che non sto qui ad elencare.

Se si descrive una partita iniziale ma con a monte varie altre mosse ed un pedone bianco sta, per esempio in 54 e tocca al Nero/Rosso, bisogna precisare se lì ci è arrivato nel turno immediatamente prima ossia se è catturabile al passo o se sta lì già da vari precedenti turni del Bianco. Dunque scriverò "M 54" se è un Militare ossia è stato appena mosso o "P 54" se stà lì da vari altri turni...

Mi sembra di avere considerato, con queste regole tutte le possibili situazioni...

Per capire quale è il padre di una data mossa basta guardare la generazione precedente per distinguere i fratelli dai cugini. Tutti i figli di uno stesso padre sono elencati consecutivamente e dato che è noto il numero di figli di ogni padre, elencato tra i suoi cugini o fratelli ossia gli zii della mossa considerata, si calcola subito dove stanno i figli di ogni padre per cui non sono indispensabili eventuali separatori ma la discendenza ossia il padre di una data mossa è calcolabile senza ambiguità. Naturalmente, per chiarezza, potrebbe essere lecito usare un carattere speciale come separatore tra i vari gruppi di figli di uno stesso padre della generazione precedente ma... questo non è una regola inderogabile....

Conclusione momentanea

Proverà a codificare in Javascript queste regole che vanno tradotte anche nella notazione puramente numerica che ho definito in precedenza e speriamo che non saltino fuori errori ed omissioni...