Il di Biagio Rea l'Apatico Motore di gioco per scacchi Amatoriale

[download] [note] [programazione scacchistica]









Download
BRAMA_051204




Note. Iniziato l’1/11/04 con l’intento di effettuare un porting dal Borland Turbo Pascal al linguaggio C del mio vecchio motore allo scopo di interfacciarlo con Winboard ed per l'occasione imparare il C. Come spesso sucede quello che doveva essere un porting si e trasformato in una rieditazione totale.
Di sacro ci ha solo l'assonanza del nome con Brahma il dio Indù.

Caratteristiche: scritto in linguaggio C, Winboard compatibile, rappresentazione 0..63, esegue l’alphabeta(fiù..) aiutato da un minimo di ordinamento delle mosse in fase di generazione. Insomma ha una struttura essenziale
I pezzi sono caricati anche in un array pezzi cosi che in fase di generazione fa un ciclo for() sui pezzi e non sulla scacchiera.
BRAMA potrebbe chiedere la promozione sia a cavallo che a regina ma un tentativo da parte dell'avversario di promuoversi ad un pezzo diverso dai suddetti provocherà la chiusura di brama e la sua uscita dal match.

Prossimo obbiettivo di lunga durata: Mi piacerebbe realizzare un motore bitboard con interfaccia in Java. (seehhh)








Alcune indicazioni per chi desidera elaborare un programma di scacchi.


La quasi totalità dei motori di gioco scacchistici è costituito almeno dalle seguenti parti ideali o reali di codice:
  • A. Generatore di mosse. Quale è il suo compito? Date le informazioni sulla disposizione dei pezzi sulla scacchiera e sul colore cui spetta il turno di muovere redige l’ elenco delle mosse legali che il giocatore può eseguire.
    Solitamente il primo prodotto del generatore di mosse non è, come dire, un prodotto finito ma un elenco di mosse pseudolegali; significa che fra queste ve ne potrebbero essere alcune non legali come quelle che lasciano sotto scacco il proprio Re. Per motivi di efficienza si può preferire eliminare queste mosse illegali dall’elenco durante le fasi di elaborazione successive alla generazione stessa.
    Un metodo molto elegante perché consente di scrivere un generatore in pochissime istruzioni fa ricorso ad un array 10*12 più gli array per le direzioni dei pezzi. Il metodo è descritto dettagliatamente ne LaMoSca per cui non aggiungo altro se non che personalmente ho preferito non ricorrervi e scrivere qualche riga di codice in più, tuttavia poiché ancora non ho fatto un test non so dire se ne sia valsa la pena.

  • B. L’algoritmo di eplorazione dell’albero di gioco. E’ un algoritmo che potrebbe idealmente somigliare a quello ricorsivo per l’esplorazione di un file-sistem ed è il nucleo del motore di gioco.

  • C. Una porzione di codice che ha il compito di valutare i singoli pezzi piuttosto che la loro disposizione sulla scacchiera e quant’altro…

  • D. Una porzione di codice che gestisce l’input output, l’interfaccia. Winboard è ormai uno standard tra i programmatori che desiderano confrontare la forza di gioco dei propri motori.

Altra cosa e il modello di rappresentazione della scacchiera e dei pezzi. E' appunto modello di rappresentazione della scacchiera e di pezzi grazie al quale è possibile ad esempio verificare lo status di una casella: se è occupata, da che colore , da che pezzo. Nel mio primo programma per semplicita avevo usato un array bidimensionale 8*8 che è quanto di peggio vi possa essere per l’efficienza. Normalmente si usa un array unidimensionale di 64 elementi 0..63 che in fin dei conti è altrettanto semplice ma molto, moltissimo piu efficiente. Se osservate la rappresentazione binaria dei numeri 0..63 vedrete che dato un numero di casella il numero di colona è espresso dai primi 3 bit , il numero di riga dai 3 successivi.
Quindi se il linguaggio è il C per ricavare i numeri di riga e colonna dal numero della casella potete usare le macro:
#define DACASAACOL(CASA) (CASA & 7)
#define DACASAARIGA(CASA) (CASA >> 3)
Un’ altro modello di rappresentazione e la bitboard. Consiste nell’usare variabili di 64 bit dove ogni bit rappresenta una casa. In alcune fasi consente di risparmiare molti cicli macchina ma non deve essere molto immediato da gestire per un programmatore alle prime armi. Uno scopo fondamentale della programmazione per scacchi è quello di divertirsi però attenzione perche quando il programma inizia ad acquistare un certa consistenza potreste ritrovarvi a pagare delle scelte iniziali prese con troppa leggerezza come la rappresentazione 8*8 del mio vecchio programma. Conviene dare il meglio dell’efficienza fin dall’inizio per non essere costretti a ritornare piu volte sui propri passi.
Spero che queste poche righe servano a chi voglia farsi un'idea della programmazione per scacchi, se invece avete bisogno di un vero tutorial affidateva a LaMoSca .





Se volete un'interfaccia grafica.
Il modo più semplice ma non il più proprio per inetrfacciare BRAMA a Winboard (dopo avere scaricato ed installato winboard nel vs. pc ovviamente) è quello di copiare BRAMA direttamente nella cartella in cui si è installato Wimboard. Es: "C:/Programmi/Winboard". Quando avviate Winboard dovrete quindi scrivere al posto di GnuChess (il motore di default) il nome dell'eseguibile di Brama.