Scacchi
Autore : Moretto AlessioAnno Scolastico 2009/2010
Classe 5°CIstituto Vito Volterra, San Donà di Piave, via Milano, 9
Scacchi
8 luglio 2010
2
Autore : Alessio Moretto
Indice
1 Introduzione 9
2 Scacchi, matematica, e calcolo 11
2.1 Scacchi, matematica, calcolo ed economia . . . . . . . . . . . . 122.2 Matematica e scacchi, la leggenda . . . . . . . . . . . . . . . . 14
2.2.1 Dimostrazione serie geometrica . . . . . . . . . . . . . 162.3 Matematica e scacchi, il cavallo . . . . . . . . . . . . . . . . . 172.4 Matematica e scacchi, il quadrato magico . . . . . . . . . . . . 202.5 Calcolo e scacchi, le mosse possibili . . . . . . . . . . . . . . . 232.6 Calcolo e la generazione di numeri casuali . . . . . . . . . . . 28
3 Storia, scacchi e la guerra fredda 31
3.1 La conferenza di Jalta . . . . . . . . . . . . . . . . . . . . . . 323.2 La Germania dopo la guerra . . . . . . . . . . . . . . . . . . . 323.3 Il piano Marshall . . . . . . . . . . . . . . . . . . . . . . . . . 323.4 La guerra fredda . . . . . . . . . . . . . . . . . . . . . . . . . 323.5 URSS contro America . . . . . . . . . . . . . . . . . . . . . . 33
4 Informatica, intelligenza arti�ciale 35
4.1 Metodi di intelligenza arti�ciale . . . . . . . . . . . . . . . . . 374.1.1 Metodo MinMax . . . . . . . . . . . . . . . . . . . . . 374.1.2 Metodo Database . . . . . . . . . . . . . . . . . . . . . 384.1.3 Come pensa un computer . . . . . . . . . . . . . . . . 384.1.4 Implementazione dell'intelligenza arti�ciale . . . . . . . 39
5 Sistemi, socket 41
6 Programmare un gioco di scacchi da 0 43
6.1 Feature implementate . . . . . . . . . . . . . . . . . . . . . . . 45
4 INDICE
6.2 Come iniziare . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.3 Spostamenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.3.1 Mossa del cavallo . . . . . . . . . . . . . . . . . . . . . 486.3.2 Mossa della torre . . . . . . . . . . . . . . . . . . . . . 496.3.3 Mossa dell'al�ere . . . . . . . . . . . . . . . . . . . . . 506.3.4 Mossa della regina . . . . . . . . . . . . . . . . . . . . 516.3.5 Mossa del re . . . . . . . . . . . . . . . . . . . . . . . . 526.3.6 Mossa del pedone . . . . . . . . . . . . . . . . . . . . . 536.3.7 Arrocco . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.4 Scacco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.4.1 Sotto scacco . . . . . . . . . . . . . . . . . . . . . . . . 566.4.2 Scacco matto . . . . . . . . . . . . . . . . . . . . . . . 58
6.5 Patta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596.5.1 Patta per mosse . . . . . . . . . . . . . . . . . . . . . . 606.5.2 Patta per posizione morta . . . . . . . . . . . . . . . . 606.5.3 Patta per la regola delle 50 mosse . . . . . . . . . . . . 60
6.6 Salvataggio e caricamento di una partita . . . . . . . . . . . . 616.6.1 Salvataggio . . . . . . . . . . . . . . . . . . . . . . . . 616.6.2 Caricamento . . . . . . . . . . . . . . . . . . . . . . . . 61
6.7 Gioco online . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626.7.1 Socket, spiegazione . . . . . . . . . . . . . . . . . . . . 626.7.2 Funzionamento del socket nel programma . . . . . . . . 636.7.3 Connessione del server socket . . . . . . . . . . . . . . 636.7.4 Connessione del client socket . . . . . . . . . . . . . . . 636.7.5 Funzionamento . . . . . . . . . . . . . . . . . . . . . . 636.7.6 Implementazione . . . . . . . . . . . . . . . . . . . . . 646.7.7 Scelta automatica dell'avversario . . . . . . . . . . . . 64
6.8 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686.9 Realizzazzione della scacchiera . . . . . . . . . . . . . . . . . . 696.10 Suoni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706.11 Statistiche con Database . . . . . . . . . . . . . . . . . . . . . 71
6.11.1 Salvataggio dei dati . . . . . . . . . . . . . . . . . . . . 716.11.2 Recupero dei dati . . . . . . . . . . . . . . . . . . . . . 726.11.3 Statistiche . . . . . . . . . . . . . . . . . . . . . . . . . 72
7 Conclusione 73
INDICE 5
A Appendice 75
A.1 Comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75A.2 Allegati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77A.3 Approfondimenti odierni: la guerra fredda . . . . . . . . . . . 78A.4 Licenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6 INDICE
Elenco delle �gure
2.1 mossa del cavallo . . . . . . . . . . . . . . . . . . . . . . . . . 172.2 scacchiera 3*3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.3 Paolo Guerini scacchiera 3*3 . . . . . . . . . . . . . . . . . . . 182.4 Paolo Guerini scacchiera 3*3 soluzione . . . . . . . . . . . . . 182.5 percorso chiuso del cavallo . . . . . . . . . . . . . . . . . . . . 192.6 quadrato magico 3*3 . . . . . . . . . . . . . . . . . . . . . . . 202.7 quadrato magico 3*3 mossa del cavallo . . . . . . . . . . . . . 202.8 quadrato magico 3*3 collegamento fra i numeri . . . . . . . . . 212.9 quadrato magico 3*3 collegamento �nale . . . . . . . . . . . . 212.10 quadrato magico 3*3 percorso simmetrico . . . . . . . . . . . . 222.11 possibile posizione delle regine senza che si attacchino . . . . . 252.12 possibile posizione della regina per coprire tutte le caselle . . . 262.13 posizione cavallo senza che si attacchino a vicenda . . . . . . . 262.14 posizione cavallo per coprire tutta la scacchiera . . . . . . . . 27
4.1 come pensa un computer . . . . . . . . . . . . . . . . . . . . . 38
6.1 mossa del cavallo . . . . . . . . . . . . . . . . . . . . . . . . . 486.2 mossa della torre . . . . . . . . . . . . . . . . . . . . . . . . . 496.3 mossa dell'al�ere . . . . . . . . . . . . . . . . . . . . . . . . . 506.4 mossa della regina . . . . . . . . . . . . . . . . . . . . . . . . . 516.5 mossa del re . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.6 mossa del pedone . . . . . . . . . . . . . . . . . . . . . . . . . 536.7 arrocco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
8 ELENCO DELLE FIGURE
Capitolo 1
Introduzione
In questa tesina parleró del gioco degli scacchi, suddividendo il tutto indue argomenti principali:
• Nella prima parte a�ronteró una relazione teorica del gioco degli scac-chi, vista da diversi punti di vista, quello matematico, probabilistico,quello storico (inteso come il rapporto degli scacchi con la storia dell'u-manitá e non degli scacchi) e quello dell'intelligenza arti�ciale, quindiinformatico.
• Nella seconda parte descriveró il programma creato per giocare a scac-chi, che permette un gioco a 2 giocatori, contro il computer e online.Nel gioco c'entrano svariate materie, quali informatica (per tutta laprogrammazione) e sistemi, per la connessione fra 2 giocatori, quindilo scambio in internet.
Ho scelto questo argomento perché é sempre stato un mio sogno riuscire aprogrammare questo gioco e perché si legava bene con molte materie scola-stiche, quali storia, matematica, calcolo, ovviamente informatica e sistemi.Lo scopo é analizzare il gioco degli scacchi nelle sue forme piú tecniche edimplementarlo in un linguaggio di programmazione.
10 Introduzione
Capitolo 2
Scacchi, matematica, e calcolo
Introduzione
Gli scacchi sono da sempre stati molto legati alla matematica. In questocapitolo andremo a vedere alcune delle tante relazioni che li rendono a�ni;ad esempio, parleremo del cavallo e delle sue proprietá matematiche, dellepossibili mosse nel gioco e delle possibili partite.
12 Scacchi, matematica, e calcolo
2.1 Scacchi, matematica, calcolo ed economia
Scacchi, economia, matematica e calcolo. Cosa c'entrano fra di loro? Ap-parentemente niente, ma in realtá le relazioni sono molte. E non lo dicoio, bensí Robert Alexander Mundell. Ma vediamo chi é Robert AlexanderMundell: Robert Alexander Mundell C.C. (Kingston, 24 ottobre 1932) é uneconomista canadese, vincitore del premio Nobel per l'economia nel 1999.Io e i miei compagni l'abbiamo incontrato il 19/03/2009 durante la gita aRoma e abbiamo avuto l'opportunitá di ascoltare un suo intervent con il ti-tolo Lectio Magistralis: Matematica, economia e scacchi. Il suo discorso éiniziato con una presentazione degli scacchi e con una breve desrcizione degliincontri che ha avuto con vari giocatori di fama mondiale. Dopo ha comin-ciato a spiegare le relazioni fra Matematica, economia e scacchi. Vediamo dianalizzarle assieme.
Queste discipline sono scienza? Ma cos'é la scienza? Secondo una de�ni-zione antica é un corpo sistematico di conoscenza. Secondo questa de�nizioneallora la risposta é si, infatti la matematica é la scienza piú antica.
Ma passiamo ad un altro argomento. Cerchiamo di trovare un collegamen-to tra economia e scacchi. Cominciamo con dare la de�nizione di economiasecondo le idee iniziali.
Economia: branca della �loso�a morale. Quindi non é una scienza. Ve-diamo come viene de�nita in un periodo storicamente successivo. Economia:scienze sociali. E adesso é de�nita come matematica, dal 1968. Data nellaquale la banca della scienza l'ha de�nita tale. Ora passiamo all'analisi dellamatematica. La prima domanda da porsi é abbastanza ovvia. Perché nonesiste un premio Nobel per la matematica? Ricordiamo che i premi Nobelvengono dati a tutte le migliori scoperte scienti�che. La risposta é abbastan-za strana, pare che la moglie di Nobel avesse come amante un matematicofamoso, e Nobel non volesse che il premio fosse dato a lui (é solo una storia,senza fonti u�ciali). Ma ci sono altri premi per i matematici. Sia l'economiache la matematica sono scienze.
Ora che abbiamo scoperto che sono scienze pensiamo ai legami. Ritor-niamo all'economia, a pensarci bene é come un gioco di cooperazione. Unaguerra nel guadagnare di piú, delle scelte strategiche per vincere, e dare scac-co matto. Finalmente abbiamo scoperto il legame tra economia e scacchi.Ma manca ancora la matematica. Molti sono i matematici che hanno stu-diato il gioco degli scacchi, ma del legame tra scacchi e matematica potremo
2.1 Scacchi, matematica, calcolo ed economia 13
occuparci molto piú dettagliatamente in un capitolo successivo.Nel gioco degli scacchi si puo' prevedere chi vince una partita solo analiz-
zando le prime mosse. Infatti ci sono certe aperture considerate sfavorevoli epossiamo dire con molta probabilitá chi vincerá la partita. Quindi gli scacchisono scienza. Ed é proprio da questo ragionamento che concludiamo con laTeoria dei giochi, molto conosciuta in calcolo. Quindi se gli scacchi sonoscienza allora gli altri giochi sono scienza, ed indovinate chi sono stati i primiche hanno scritto un libro e pensato a questa teoria! Un matematico ed uneconomista.
14 Scacchi, matematica, e calcolo
2.2 Matematica e scacchi, la leggenda
La matematica e gli scacchi hanno molti collegamenti, il piú conosciuto équello che si basa sul cavallo, date le sue innumerevoli proprietá. Cominciamoparlando di un problema matematico, dato anche pochi anni fa come esamedi stato.
Questo problema é stato tratto dalla leggenda degli scacchi, ma é tuttointuibile dal testo.
Testo:
Si narra che l'inventore del gioco degli scacchi chiedesse diessere compensato con chicchi di grano; un chicco sulla primacasella, due sulla seconda, quattro sulla terza e cosí via, sempreraddoppiando il numero dei chicchi, �no alla sessantaquattresimacasella. Assumendo che mille chicchi di grano pesino circa tren-totto grammi, calcola il peso in tonnellate della quantitá di granopretesa dall'inventore.
Il re che aveva ricevuto questa strana richiesta credeva che si trattasse diuna quantitá esigua e si era quasi sbalordito. Il giorno dopo i suoi matematicigli portarono il risultato dicendo che neppure tutto il grano del mondo pro-dotto in un anno sarebbe bastato. Infatti il risultato é 18.446.744.073.709.551.615chicchi di grano.
Diamo la dimostrazione matematica del risultato ottenuto. I chicchi sullan-sima casella sono dati dai termini della progressione geometrica:
an+1
an= q
oppure
an+1 = qan con q = 2
con q quantitá costante diversa da 1, detta ragione o quoziente. La somma é
Sn = a1 + a2 + ....... + an
dei primi n termini consecutivi di una progressione geometrica di ragioneq e primo termine a1 vale: Sn = a1
qn−1q−1 per q 6= 1
Dimostrazione:
Sn = a1 + a2 + · · ·+ an
2.2 Matematica e scacchi, la leggenda 15
qSn = qa1 + qa2 + · · ·+ qan = a2 + a3 + · · ·+ an+1
sottraendo membro a membro
(q − 1)Sn = an+1 − a1
Sn =an+1 − a1q − 1
=qna1 − a1q − 1
= a1qn − 1
q − 1
essendo an+1 = qan = qqan−1 = · · · = qna1
Sn = a1qn−1q−1 per q 6= 1
oppure Sn = a11−qn1−q
Nel caso in esame la richiesta dell'ambasciatore costituisce la progressionegeometrica
1, 2, 22, ..., 263
la cui somma vale
S64 = 1 ∗ 264 − 1
2− 1= 264 − 1
Se voglio quindi risolvere il problema dato all'inizio, calcolo le tonnellatecorrispondenti, facendo il risultato appena venutomi per il peso di ogni sin-golo chicco di grano, ottenendo proprio il numero 18.446.744.073.709.551.615riportato sopra.
16 Scacchi, matematica, e calcolo
2.2.1 Dimostrazione serie geometrica
Si dice serie geometrica di ragione q la seguente:
+∞∑n=0
qn = 1 + q + q2 + q3 + · · ·+ qn + · · ·
Volendo studiarne il carattere, scriviamo:
Sn = 1 + q + q2 + q3 + · · ·+ qn = 1−qn+1
1−q per q 6= 1
dalla formula precedentemente dimostrata, osservando che Sn é la somma deiprimi n + 1 termini calcoliamo:
limn→+∞
Sn = limn→+∞
1− qn+1
1− q=
∞ se |q|>1 +∞ se|q|>1 cioé la serie diverge positivamente∞ se|q|<-1 cioé la serie diverge oscillando
11−q se |q|<1 cioé la serie converge a 1
1−qnon esiste se q=-1 cioé la serie é indeterminata
Inoltre Sn = n + 1 se q=1 da cui limn→+∞ Sn = +∞ per q=1
Riassumendo, la serie converge a a 11−q se e solo se |q|<1
2.3 Matematica e scacchi, il cavallo 17
2.3 Matematica e scacchi, il cavallo
Il cavallo é forse il pezzo piú interessante del gioco ed é anche il pezzopiú signi�cativo dal punto di vista della matematica. Ma vediamo come simuove: prendiamo come punto di partenza il cavallo posizionato al centro,tutte le altre ra�gurazioni sono le possibli mosse orizzontali e verticvali. Inpoche parole il cavallo si muove a L, cioé di 2 caselle in una direzione e di1 nell' altra(Figura 2.1), oppure possiamo dire che il suo spostamento é inmodulo di 3, escludendo peró i casi in cui uno o l'altro valore di coordinatesiano 0.
Figura 2.1: mossa del cavallo
Adesso analizziamo le proprietá del cavallo, prendiamo una scacchiera3*3, cioé composta da 9 quadrati. Questa scacchiera, ridotta rispetto al-la 8*8, che si usa solitamente per giocare a scacchi, ha molte proprietáinteressanti(Figura 2.2).
Figura 2.2: scacchiera 3*3
18 Scacchi, matematica, e calcolo
Vediamo di elencarne alcune. Di sicuro, quando si parla di questa scac-chiera, dobbiamo citare Paolo Guarini del 1512, che presentó il seguenteproblema:
Dato una scacchiera di dimensione 3*3 e 4 cavalli, 2 neri e 2bianchi, disposti negl'angoli, invertirne la posizione
Paolo Guarini
Ora risolviamo il problema, abbastanza intuitivamente(Figura 2.3, Figura2.4).
Figura 2.3: Paolo Guerini scacchiera 3*3
Figura 2.4: Paolo Guerini scacchiera 3*3 soluzione
2.3 Matematica e scacchi, il cavallo 19
Sempre riguardo al cavallo possiamo valutare le sue mosse in una normalescacchiera a 64 caselle. Esistono due tipi di percorsi che puó compiere uncavallo, passando una sola volta in tutte le caselle:
• chiuso
• aperto
Uno dei casi piú interessanti é quello di fargli compiere un percorso chiuso,vediamo come (�gura 2.5).
Figura 2.5: percorso chiuso del cavallo
Per compiere un percorso chiuso una delle tecniche migliori consiste neltenersi il piú possibile vicino ai bordi, ma non é ancora stato creato unalgoritmo per risolverlo.
20 Scacchi, matematica, e calcolo
2.4 Matematica e scacchi, il quadrato magico
Ma ancora piú sorprendente é il quadrato magico 3*3, giá conosciuto daicinesi. Ha come proprietá che la somma delle diagonali, delle colonne e dellerighe faccia sempre una costante, cioé 15(Figura 2.6).
Figura 2.6: quadrato magico 3*3
Provando a collegare fra di loro i primi tre numeri possiamo notare checorrispondono esattamente alla mossa del cavallo, in e�etti lo spostamentoavviene di due caselle in un senso e una nell'altro.
Lo stesso risultato si ottiene collegando fra di loro gli ultimi 3 numeri.E�ettivamente la mossa del cavallo é considerata distintiva per il gioco
degli scacchi, dato che puó saltare gli altri pezzi(Figura 2.7).
Figura 2.7: quadrato magico 3*3 mossa del cavallo
2.4 Matematica e scacchi, il quadrato magico 21
Ma la cosa ancora piú interessante avviene quando proviamo a collegarefra di loro i primi 3 numeri e gli ultimi 3, come fatto in precedenza, partendodal centro e usando entrambe le strade possibili(Figura 2.8, Figura 2.9).
Figura 2.8: quadrato magico 3*3 collegamento fra i numeri
Figura 2.9: quadrato magico 3*3 collegamento �nale
Possiamo notare che viene a formarsi una scacchiera del tipo 2*2, rac-chiusa dentro la principale.
22 Scacchi, matematica, e calcolo
Il quadrato magico ha molte altre proprietá, proviamo a collegare succes-sivamente i numeri(Figura 2.10).
Figura 2.10: quadrato magico 3*3 percorso simmetrico
Come é evidente dalla �gura possiamo notare una perfetta simmetria,infatti ruotandolo di 180o la �gura rimane identica.
2.5 Calcolo e scacchi, le mosse possibili 23
2.5 Calcolo e scacchi, le mosse possibili
La quantitá di mosse possibili negli scacchi é assai elevata, una piccoladimostrazione c'é l'ha data la storia, ma vediamo nel dettaglio perché questogioco é cosí complesso.
Analizziamo le possibili mosse e soprattutto perché esse non sono in�nite:
• Per ottenere il numero massimo di mosse, quando tutti i pezzi sonoancora sulla scacchiera, devo sommare il numero massimo di mosse perogni singolo pezzo (cioé 8 per il re, 27 per la regina, 14 per la torre, 13per l'al�ere, 8 per il cavallo, e 2 per il pedone) per il numero di pezzi:8 + 27 + (14 ∗ 2) + (13 ∗ 2) + (8 ∗ 2) + (2 ∗ 8) = 111.
• In maniera analoga per ottenere il numero medio di mosse, quando tut-ti i pezzi sono ancora sulla scacchiera, devo sommare il numero mediodi mosse di ciascun pezzo (cioé 6,5 per il re, 22,5 per la regina, 14 per latorre, 8,5 per l'al�ere, 5 per il cavallo, e 1 per il pedone) per il numerodi pezzi: 6.5 + 22, 5 + (14 ∗ 2) + (8, 5 ∗ 2) + (5 ∗ 2) + (1 ∗ 8) = 92, 5. Inpratica il numero sará peró inferiore, a causa della mancanza di alcunipezzi o della illegalitá di alcune mosse di alcuni pezzi, una valutazio-ne approssimata del numero medio di mosse disponibili durante unapartita standard é di circa 40.
• Il numero massimo allle possibili disposizioni che si possono otteneresulla scacchiera é dato dal numero di possibili disposizioni dei 32 pezzisulle 64 caselle della scacchiera, cioé 64321057.
• Grazie alla regola detta sopra otteniamo un limite alle partite, perchéquando due disposizioni si ripetono esattamente, ció che é successo nelfrattempo non ha piú importanza. Il numero delle possibili partite édunque limitato da 1111057101058.
• Anche considerando solo partite piú ragionevoli, di 100 mosse e conuna media di 40 mosse possibili ogni volta, si ottiene comunque ancoraun massimo di 10040 = 1080,
• Si calcolano oltre 300 miliardi di modi per giocare le prime quattromosse e 1030 per giocare le prime dieci mosse.
• Si stima che nell'universo ci sono 1080 atomi.
24 Scacchi, matematica, e calcolo
Da questo possiamo dedurre che é impensabile poter analizzare tutte lemosse degli scacchi.
Ma passiamo ad altro, cerchiamo di risolvere un noto problema: Quan-te Regine si possono porre sulla scacchiera in modo che non si attacchinovicendevolmente?
Prima di dare la risposta, facciamo un po di storia. Questo problema haorigine nel 1848, posto da una rivista tedesca, la Scachzeitung, quesito fattoda �lologo professor Nauck, che lo pose anche a Karl Friedrich Gauss (1777-1855). Questo matematico cominció a ragionarci con Heinrich Schumacher(1780-1850). Dopo solo due anni arrivarono alla risposta, senza riuscire adimostrarla. Solo nel 1874, ben 24 anni dopo, si riuscí a dimostrare, grazieall'inglese Gleisher, docente a Cambridge, e il tedesco Gunther dell'universita'di Lipsia. Riuscirono a dimostrarlo grazie alla teoria dei determinanti.
Finalmente ecco la soluzione: ci sono ben 92 modi diversi per disporrele regine nella scacchiera in modo che nessuna attacchi l'altra. Di cui solo12 uniche, infatti ogni soluzione base ne fornisce altre tre per rotazione dellascacchiera e quattro per ri�essione. Da notare che la soluzione presentatacon il numero 12, che é simmetrica dá origine a sole tre derivate. Ho decisodi dare i classici nomi alle caselle, come mostrato in questa tabella, in cui lacasella a1 é di colore nero (quindi vista dalla parte del bianco).
a8 b8 c8 d8 e8 f8 g8 h8a7 b7 c7 d7 e7 f7 g7 h7a6 b6 c6 d6 e6 f6 g6 h6a5 b5 c5 d5 e5 f5 g5 h5a4 b4 c4 d4 e4 f4 g4 h4a3 b3 c3 d3 e3 f3 g3 h3a2 b2 c2 d2 e2 f2 g2 h2a1 b1 c1 d1 e1 f1 g1 h1
2.5 Calcolo e scacchi, le mosse possibili 25
1. a4 b1 c5 d8 e2 f7 g3 h6
2. a4 b1 c5 d8 e6 f3 g7 h2
3. a4 b2 c5 d8 e6 f1 g3 h7
4. a4 b2 c7 d3 e6 f8 g1 h5
5. a4 b2 c7 d3 e6 f8 g5 h1
6. a4 b2 c7 d5 e1 f8 g6 h3
7. a4 b2 c8 d5 e7 f1 g3 h6
8. a4 b2 c8 d6 e1 f3 g5 h7
9. a4 b6 c1 d5 e2 f8 g3 h7
10. a4 b7 c5 d2 e6 f1 g3 h8
11. a4 b8 c1 d5 e7 f2 g6 h3
12. a4 b6 c8 d2 e7 f1 g3 h5
Un esempio qui sotto(Figura 2.11).
Figura 2.11: possibile posizione delle regine senza che si attacchino
Invece, bastano solo 5 regine per coprire tutte le caselle di una scacchie-ra(Figura 2.12).
26 Scacchi, matematica, e calcolo
Figura 2.12: possibile posizione della regina per coprire tutte le caselle
Passando al nostro cavallo, invece, potremmo utlizzarne 32 per disporlinella scacchiera senza che si attacchino a vicenda(�gura 2.13). Anche questadisposizione é interessante, perché si ha il numero massimo di pezzi dispostinella scacchiera
Figura 2.13: posizione cavallo senza che si attacchino a vicenda
2.5 Calcolo e scacchi, le mosse possibili 27
Mentre ne bastano solo 12 per coprire tutte le caselle di una normalescacchiera(�gura 2.14).
Figura 2.14: posizione cavallo per coprire tutta la scacchiera
28 Scacchi, matematica, e calcolo
2.6 Calcolo e la generazione di numeri casuali
Nel programma che ho creato ho dovuto generare dei numeri casuali per ladecisione di alcune scelte. Per fortuna in tutti i linguaggi di programmazioneesiste una funzione RANDOM, ma vediamo come potrebbero essere creatialtrimenti. Ovviamente un computer ha oslo un modo per generare numericasuali, cioé basarsi su delle formule matematiche. Per de�nire un numerocasuale dobbiamo valutare che si veri�chino le seguenti caratteristiche:
• i numeri generati devono avere la stessa probabilitá di presentarsi.
• i numeri non devono risultare dipendenti fra di loro, cioé non ci deveessere alcun legame.
• la sequenza generata deve poter essere riprodotta
• il computer deve eseguire la generazione rapidamente
Un computer non sará mai in grado di generare veramente dei numericasuali, in quanto i numeri sono dipendenti fra di loro sato che derivano dauna formula matematica, ma ci arriverá molto vicino, questa numeri cosígenerati prenderanno il nome di nuemri pseudo-casuali.
Uno dei metodi che si puó utilizzare ha il nome di metodo della congruenzalineare.
Dato un valore iniziale x0 é possibile ottenere una sequenza di numeripseudo-casuali applicando la seguente formula:
xi+1 = (a ∗ xi + c)(MODm)
in cui:
• a é un coe�ciente intero detto moltiplicatore, positivo
• c é un coe�ciente intero non negativo detto incremento
• m é un coe�ciente intero detto modulo, positivo
• xi é il numero di sequenza
• MOD indica il resto della divisione
2.6 Calcolo e la generazione di numeri casuali 29
Provando a cambiare i coe�cienti possiamo notare che assegnandogliparticolari valori possiamo ottenere delle sequenza migliori.
Da degli studi approfonditi é stato detto che
• c e m devono essere coprimi cioé MCD(c,m) = 1
• ogni divisore primo di m deve dividere (a-1)
• se m é multiplo di 4, anche (a-1) lo deve essere.
Con altri approfondimenti si sono ottenuti i seguenti valori:
m = 231, a = int(Π ∗ 108), c = 453806245
m = 231 − 1, a = 75, c = 0
m = 231, a = 513, c = 0
m = 231, a = 216 + 3, c = 0
30 Scacchi, matematica, e calcolo
Capitolo 3
Storia, scacchi e la guerra fredda
Introduzione
Anche fra gli scacchi e la guerra fredda esiste uno stretto rapporto, in-fatti la guerra fredda si giocava in ogni fronte, per dimostrare la potenzadi una nazione rispetto ad un altra, ed in un periodo in cui le innovazio-ni tecnologiche contavano molto (basti pensare alla bomba atomica, la piúgrande rivoluzione tecnologica o il radar che ha permesso agli americani divincere la guerra), dimostrare la potenza in un gioco tattico e di intelligenzaarti�ciale era assai importante. Per non parlare degli eventi mediatici cheseguivano ogni partita fra Americani e Unione Sovietica, su cui non ci sof-fermeremo molto. In questo capitolo andremo ad analizzare prima la guerrafredda, raccontandone i principali avvenimenti, successivamente il rapportoche hanno giocato gli scacchi in questa guerra. Vediamo subito in che cosadi�erisce la guerra fredda rispetto a una guerra normale. Prima di�erenzasostanziale é la non presenza di battaglie: infatti non si combattono scontridiretti fra eserciti, anche se avviene una corsa agli armamenti, in cui âvinceâla nazione che ha piú armi per combattere un'eventuale guerra. La guerrafredda é stata combattuta non solo attraverso la corsa agli armamenti, fraStati Uniti e Unione Sovietica, ma anche a livello informatico, come vedremosuccessivamente.
32 Storia, scacchi e la guerra fredda
3.1 La conferenza di Jalta
Uno dei primi passi verso la guerra fredda é stata la conferenza di Jalta,una piccola cittá sulla costa della Crimea, in cui, nel febbraio del 1945, po-co prima della �ne della seconda guerra mondiale. le grandi nazioni ormaivincitrici si sono messe d'accordo su come spartirsi il mondo. Grecia, Au-stria, Italia rimanevano sotto l'in�uenza degli Anglo-Americani, Romania eBulgaria sotto quella sovietica, mentre l' Ungheria, la Polonia e la Jugoslaviasarebbero state sotto l'in�uenza di entrambe le potenze. La Germania ven-ne divisa in quattro zone, di pertinenza sovietica, statunitense, britannica efrancese.
3.2 La Germania dopo la guerra
Come detto in precedenza, la Germania inizialmente fu suddivisa in quat-tro zone, successivamente in due, una occidentale e una orientale, grazie allafusione delle zone inglesi, francesi e americane. Tra l'aprile 1948 e il maggio1949 le truppe sovietiche chiusero le vie d'accesso alla cittá di Berlino percostringere gli Americani ad abbandonare la parte ad Ovest della cittá. Inquesta occasione la Guerra fredda rischió di trasformarsi in una guerra calda.Gli Americani crearono la NATO, che impegnava i paesi aderenti alla difesareciproca.
3.3 Il piano Marshall
Nel 1947 il presidente Truman decise di osteggiare l'avanzamento del co-munismo fornendo aiuti, dal cibo alla moneta, ai governi che fossero statimessi in di�coltá da movimenti che si ispiravano a quella ideologia. Questoper bloccare l'avanzamento dell'in�uenza Sovietica in un'Europa che dovevaricostruirsi.
3.4 La guerra fredda
La guerra fredda fra America e Unione Sovietica é stata combattuta sudiversi piani. Uno dei tanti é la concorrenza spaziale, che ha visto le due
3.5 URSS contro America 33
nazioni combattere per la conquista dello spazio. In un primo momento sem-brava vincesse l'Unione Sovietica, successivamente l'America riuscí a ottenereil primato con la conquista della luna. Altro aspetto é stata la concorren-za socio-economica con la lotta per la conquista delle terre del terzo mondo(Africa). Un' altra battaglia, indiretta, é stata la crisi cubana, in cui, tramiteun colpo di stato, andó al potere la dittatura di Fulgencio Batista. Successi-vamente Fidel Castro prese il potere grazie a una rivoluzione popolare. GliAmericani si sentirono minacciati dal fatto che gli altri stati coloniali avreb-bero potuto ribellarsi e cercó perció in tutti i modi di ostacolare Cuba. Perquesto Cuba inizió ad avere rapporti commerciali con l'Urss, che diventó ilprimo acquirente di zucchero prodottao dall'isola. Successivamente stabiliro-no una relazione di alleanza politica. L'America rispose bloccando i rapporticommerciali con Cuba. Questa tensione rischió di trasformarsi in con�ittoaperto durante la âcrisi dei missiliâ tra l'Urss e gli Usa. Altri fatti moltorilevanti furono quelli che riguardarono le due Coree, in cui le due superpo-tenze si collocavano in aiuto delle due parti in lotta, rispettivamente a Nordl'Unione sovietica e al Sud l'America. In�ne la guerra in Vietnam: comein Corea le due potenze si s�darono indirettamente, formando un governocomunista al Nord del Vietnam, mentre un governo piú �lo-occidentale alSud.
3.5 URSS contro America
Abbiamo appena visto la situazione generale del mondo dopo la secondaGuerra Mondiale, parlando della guerra fredda e dei rapporti tra Urss e Ame-rica. Ora vedremo, piú approfonditamente come gli scacchi siano stati unaforma di scontro e di incontro tra le due nazioni, raccontando le tappe sto-riche della s�da scacchistica. Fino al 1972 era l'Unione Sovietica a detenereil titolo del campione del mondo degli scacchi e le partite che si disputavanoerano un'occasione di incontro tra le due nazioni, oltre ad essere una sortadi s�da mondiale. A quel tempo era Spassky il campione del mondo, unRusso, �ncheé Fischer, un americano, lo batté conquistando il titolo. Unapesante scon�tta per i russi e per Spassky che non riuscí mai a tornare adaltissimi livelli. Per i tre anni successivi i russi cercarono un giocatore ingrado do spodestare Fischer. Nel 1978 Fischer fu chiamato a difendere iltitolo contro Karpov, anch'esso un russo, ma ri�utó consegnando al russo iltitolo a tavolino. Un altra s�da fra le due nazione a livello scacchistico fu
34 Storia, scacchi e la guerra fredda
disputata non dagli essere umani ma dai calcolatori. 1 In entrambe le na-zioni, i militari hanno �nanziato delle ricerche sulla teoria dei giochi e sullosviluppo di giocatori arti�ciali, quindi sull'intelligenza arti�ciale. Il primoprogramma funzionante é del 1956 (fatto da Los Alamos Labs), anche se inuna scacchiera 6 x 6 (mancavano gli al�eri). Al MIT, a CMU e a Stanfordsono sta creati i primi programmi completi (1958-64). Nel 1967, una mac-china sovietica (a Mosca) scon�sse 4-0 una macchina americana (a Stanford)giocando per corrispondenza, cioÃ� attraverso uno scambio di messaggi. Danotare l'anno, 1967, proprio nel periodo âcaldoâ della guerra fredda. Vienefacile la supposizione che non si tratti solo di semplici partite di scacchi frauna nazione e l'altra, solo per dimostrare la bravura degli stessi, ma che sitratti di una vera e propria dimostrazione di forza. Ai giorni d'oggi si parlamolto spesso di missili intelligenti, ma giá allora le ricerche dei militari sisono spostate su questo percorso. Possiamo quindi valutare questa semplicepartita come una vera e propria battaglia. Solo nel 1994, alcuni programmicommerciali (tra cui Fritz3 e Genius) hanno battuto in alcune partite brevi ilCampione del Mondo (Kasparov). Nel 1997, Deep Blue della IBM ha battutodi misura il Campione del Mondo (Kasparov) in un torneo-match regolare.
1fonti:http://www.chessbase.com/newsdetail.asp?newsid=5153,http://en.wikipedia.org/wiki/Kaissa
Capitolo 4
Informatica, intelligenza arti�ciale
Introduzione
In questa parte parleró dell'intelligenza arti�ciale. Prima di cominciare adiscuterne é meglio de�nirla. Perché ci sono diversi punti di vista.
Con il termine intelligenza arti�ciale (o IA, dalle iniziali delledue parole, in italiano) si intende generalmente l'abilitá di uncomputer di svolgere funzioni e ragionamenti tipici della menteumana.
Wikipedia
Questa é una citazione presa dalla nota enciclopedia online Wikipedia del-l'intelligenza arti�ciale, in cui viene de�nita come l'abilitá di un calcolatorenello svolgere funzioni e ragionamenti tipici della mente umana. Abbiamocapito che parlando della IA ci si riferisce ad un calcolatore, ma quali sono iragionamenti tipici della mente umana?
Un risposta a questa domanda la possiamo trovare grazie ad Alan Turinged ad un suo articolo pubblicato nella rivista Mind nel 1950 (quindi non moltianni fa). 1
Can machines think?
Alan Turing
1fonte: http://www.loebner.net/Prizef/TuringArticle.html
36 Informatica, intelligenza arti�ciale
Con questa semplice domanda Alan vuole de�nire cos'é l'intelligenza arti-�ciale. Cioé la capacitá di pensiero e di ragionamento delle macchine, quindisolo quando un uomo compiendo una qualsiasi azione con una macchina nonsi accorgerá che essa é una macchina si puó dire che questa é intelligenzaarti�ciale.
Appena pubblicato questo articolo Arthur Samuel presentó il suo pro-gramma per giocare a dama. La cosa eccezzionale di questo programmaera che il computer riusciva ad imparare giocando con altre persone, quindiriusciva a risolvere problemi legati all'intelligenza umana.
Si puó dire che l'intelligenza arti�ciale sia stata inventata? No, perché iltest di Touring, presentato sopra, é stato piú volte sistemato e corretto, e,forse, neppure ai nostri giorni l'intelligenza arti�ciale é stata scoperta.
A questo punto é meglio fare un po di chiarezza, facendo una suddivisionedell'intelligenza arti�ciale:
• intelligenza arti�ciale forte
• intelligenza arti�ciale debole
Cominciamo parlando della piú semplice, l'intelligenza arti�ciale debole.Cioé che un computer non riuscirá mai ad eguagliare la complesitá dellamente umana, ma potrá solo simularla, cosa assai diversa simulare, da essereuguali. Al giorno d'oggi, e credo ancora per molti e molti anni, é questal'intelligenza arti�ciale predominante. Infatti un computer é stato istruitoa comprendere e a risolvere certe cose, ma non é ancora in grado di capirerealmente cosa sta facendo.
L'intelligenza arti�ciale forte, forse é quella de�nita da Alan Touring,dove un computer é realmente in grado di pensare. Cioé le macchine sonorealmente in grado di prendere conoscenza della loro esistenza.
Quindi noi parleremo d'ora in poi dell'intelligenza arti�ciale, intesa comeintelligenza arti�ciale debole.
Ora che abbiamo ben de�nito cosé l'intelligenza arti�ciale, passiamo aivari metodi per crearla.
4.1 Metodi di intelligenza arti�ciale 37
4.1 Metodi di intelligenza arti�ciale
Introduzione
Per parlare dei vari metodi di intelligenza arti�ciale ci appoggiamo algioco preso in esame in questa relazione: il gioco degli scacchi. Primo passoé vedere se serve intelligenza per giocare a scacchi. Se un giocatore muovea caso possiamo dire di no, dato che basterá seguire quelle semplici regoledi limitazione delle mosse. Ma se cominciamo a mettere il sapersi difendere,l'attaccare o molto altro allora possiamo dire che giocare a scacchi equivalead essere intelligenti. Adesso andiamo ad analizzare alcuni metodi:
• MinMax
• Database
4.1.1 Metodo MinMax
Il metodo MinMax é forse il piú conosciuto ed utilizzato, esso valuta ilguadagno della mossa. Infatti, se facendo quella mossa il computer passain vantaggio o riduce il suo svantaggio vuol dire che quella mossa é buona.Se invece, facendo quella mossa il computer passa in svantaggio o comunqueperde punti, vuol dire che non deve fare quella mossa. Per valutare il vantag-gio o lo svantaggio basta applicare dei punteggi ai vari pezzi e ricalcolarli ognisingola mossa. Con una particolare attenzione: il punteggio del re vale +∞, come dare scacco matto. Oltre a questo dobbiamo espandere l'algoritmo,cioé fare una valutazione ad albero, non solo alla singola mossa, ma al ramo.Infatti se valutiamo la sola prima mossa esso risulterá ine�cace, dobbiamoinvece andare piú in profondita, valutando in modo ricorsivo la mossa del-l'avversario, poi da quella valutare la nostra possibile mossa, cosí facendo,se nel primo controllo avremmo dovuto vedere solo 40 mosse circa, nel se-condo controllo dobbiamo valutare sempre 40 mossa, ma per ogni mossa, ilche equivale a 40*40 che é uguale a 1600 possibili mosse. Un'ottimizzazionedi questo algoritmo potrebbe essere il salvataggio in memoria dei rami chepotrebbero ancora essere utilizzati.
38 Informatica, intelligenza arti�ciale
4.1.2 Metodo Database
Questo metodo non é proprio un metodo capace di reggersi da solo (almomento), data la quantitá delle possibili partite, ma potrebbe essere utiliz-zato assieme al metodo MinMax. Infatti basterebbe salvare in un databasetutte le partite o alcune situazioni strane, in cui, se il computer si trova inquel caso, sa di dover fare quella mossa. Questa scelta é tornata utile nellastoria2 (come nel match fra Kasparov, il campione mondiale e Deep Bluedell'IBM), infatti, sono stai molti i casi in cui un computer, giustamente, va-lutava migliore una mossa, non vedendo possibilitá di scacco matto, ma unaserie di mosse dell'avversario l'avrebbero portato inevitabilmente in quellasituazione in cui perdeva (da ipotizzare che la mossa non era prevedibile,perché troppo avanti o poco probabile per il computer). per cui, metendoun database che dice che in quel caso deve fare quella mossa, il problema sirisolve.
4.1.3 Come pensa un computer
Fino ad adesso abbiamo analizzato i metodi dell'intelligenza arti�ciale,ma cosa fa un computer e come pensa un computer durante la'pplicazionedi questi metodi? Come fase iniziale voglio mostrarvi la rappresentazionegra�ca della valutazione dell'algoritmo MinMax, lo faró grazie ad un ottimoprogramma, scritto in java, che si trova in internet e che mostra gra�camente,mediante delle linee le mosse che il computer pensa.3
Figura 4.1: come pensa un computer
Ma questo algoritmo risulta completamente ine�cace messo in pratica.Infatti, non é contemplato lo scacco matto e la difesa dallo scacco mat-to. Quindi devo implementare delle semplici modi�che a questo algoritmo.Inserendo prima dei controlli, nel seguente ordine:
2fonte: http://it.wikipedia.org/wiki/IBMDeepBlue3fonte: http://turbulence.org/spotlight/thinking/chess.html
4.1 Metodi di intelligenza arti�ciale 39
1. se posso dare scacco matto legalmente faccio la mossa.
2. se mi puó dare scacco matto mi devo difendere.
3. se no faccio l'algoritmo MinMax.
Per il primo punto non ho di�coltá particolari in quanto basta comunqueanalizzare tutte le possibili mosse e vedere se una é vincente.
Il secondo punto diventa un po' piú problematico, infatti posso facilmenterilevare la possibilitá di uno scacco matto, valutando tutte le mosse, ma devoanche valutare una mossa che mi possa difendere e�cacemente, quindi adogni mossa per la difesa devo riutilizzare l'algoritmo MinMAx per valutarnel'e�cacia.
Il terzo punto é giá stato spiegato e, anche se é la parte meno importantedel gioco, dato che non si perde e non si vince, é il piú utilizzato e quello dacui dipenderá tutta la partita.
4.1.4 Implementazione dell'intelligenza arti�ciale
L'algoritmo piú e�cace da me utilizzato é stato quello del minmax. Hoassegnato ad ogni pezzo un punteggio, 9 per la regina, 5 per la torre,3 perper cavallo ed al�ere e 1 per i pedoni. Il computer simula ogni singola mossa,se la mossa é consentita valuta se questa mossa gli conviene. Salva, quindi,in una varibile il punteggio, ottenuto dalla somma del valore di tutti i pezziancora presenti, se quella mossa gli porta a guadagnare punti allora la valutacome buona. Se dovesse trovare una mossa migliore di questa compie sem-pre la migliore. Ovviamente se puó dare scacco matto valuta quella mossala migliore, solo se le mosse da fare per farlo sono solamente una. Questoragionamento di valutazione della mossa puó essere idealmente valutato al-l'in�nito, ma per limiti tecnici, non é possibile farlo. Questo algoritmo puótrovare degli inceppi, in quanto non sempre si trova una mossa favorevole,per quanto si possa andare avanti. A questo punto si puó valutare la mossache potrebbe portarci meno perdite, ma nel caso non se ne venga a caposiamo costretti a fare una mossa casuale.
40 Informatica, intelligenza arti�ciale
Capitolo 5
Sistemi, socket
Introduzione
Il socket é una tecnica che ho utilizzato per implementare il gioco onlinefra due giocatori. Vediamo cos'e il socket. Il socket é una tecnica di comu-nicazione usata per creare una comunicazione fra due pc. La connessioneviene identi�cata dalla coppia dei socket, uno server e uno client, chiamatacoppia di socket. Dato che in un pc ci possono essere piú socket ho bisognodi identi�care l'applicazioni che ha e�ettuato la richiesta, per questo uso leporte, che sono numeri a 16bit, che hanno valori da 0 a 65.635, di cui i primi1.023 sono giá assegnati. Il protocollo TCP da me utilizzato é connesso ea�dabile, vediamo cosa accade al momento di stabilire una connessione. Idue pc contrattano la dimensione massima dei segmenti, decidendo di utiliz-zare la dimensione minore delle due. Se un dispositivo nel percorso fatto dalsegmento TCP scarta lo stesso allora questo dispositivo avvisa il mittentedell'accaduto che si occuperá di diminuire la dimensione. Il segmento TCPé cosí formato:2 byte Source Port, che contengono il numero di porta del mittente2 byte Destination Port, che contengono il numero di porta del destinatario4 byte Sequence number, che contengono il numero di sequenza del primobyte di dati contenuto nel segmento4 byte Acknowledgement number, che contengono il numero di sequenza delprossimo byte atteso4 bit Header length, che indicano da dove iniziano i veri dati nel segmento6 bit usati come �ag,URG, usato per indicare che il segmento contiene dati urgenti, quindi da
42 Sistemi, socket
consegnare imemdiatamenteACK, usato per confermare i dati ricevutiPSH, usato per indicare dati da consegnare subito, senza doverli mettere nelbu�erSYN, usato per l'apertura di una connessioneFIN, usato per chiudere una connessione2 byte Window size, usati per gestire il controllo i �usso2 byte Checksum, usati per la parola di controllo, per veri�care la correttezzadel messaggio ricevuto2 byte Urgent pointer, viene usato per indicare fra quanto iniziano i datiurgenti, se il bit URG é settato a 1Vedremo piú avanti come funziona un socket nella sua parte piú software.
Capitolo 6
Programmare un gioco di scacchi
da 0
Introduzione
Per questo programma ho deciso di utilizzare Gambas, che é un linguag-gio di programmazione per ambienti Unix. La scelta é caduta su questoprogramma perché permetteva una gestione gra�ca per la creazione del gio-co degli scacchi, in modo semplice, con il classico metodo o�erto dal famosoVisual Basic, permette anche di usare la shell linux con un semplice comandoed ha una vastitá di comandi per la programmazione, unico difetto é che é unlinguaggio interpretato, per cui risulta un pochino piú lento del normale. Lascelta é ricaduta su Gambas perché é un linguaggio di programmazione chefunziona su sistemi operativi linux, piú sicuri e stabili. Non ho scelto linguag-gi di programmazione tipo java perhcé esso risultava, olte che molto lento,inadatto per il lavoro che volevo svolgere, infatti la gestione dell'interfacciaera molto piú problematica per non parlare della di�coltá delle operazionidi input/output, inoltre java avrebbe dovuto essere preinstallato sul siste-ma operativo, per far funzionare il programma, mentre questo linguaggio diprogrammazione non necessita di alcun componente aggiuntivo.
Gambas, purché si paragoni molto spesso a Visual Basic non c'entra nulla,infatti vuole prendere la semplicitá del Basic unita alla facilitá dei metodi diutilizzo di Visual Basic.
Gambas é un acronimo ricorsivo che deriva da Gambas Almost MeansBASic che tradotto suona come Gambas piú o meno signi�ca Basic, con
44 Programmare un gioco di scacchi da 0
Gambas intendono sia il linguaggio che l'interprete.Gambas é capace di creare degli eseguibili contenenti le istruzioni in byte-
code, un codice che dovrá poi essere programmato.L'IDE di Gambas (che é scritto in Gambas) favorisce la creazione in ma-
niera facilissima di GUI per i nostri programmi, é possibile sfruttare GTK+o le Qt, cosí da poter essere eseguite sia in ambienti Gnome che KDE.
6.1 Feature implementate 45
6.1 Feature implementate
In questa parte descriveró molto brevemente tutte le feature implemen-tate nel gioco.Regolazione delle mosse di tutti i pezzi, secondo le regole internazionali.Controllo scacco, se sei sotto scacco e non ti salvi la partita é �nitaSe metti il tuo re sotto scacco non puoiControllo scacco mattoMostra caselle partenza e arrivoMostra pezzo selezionatoAnnulla mossa se si clicca nella stessa casellaArrocco, se non ho mosso i pezzi interessati e se il re non é sotto scaccoPartita patta se non ha mosse legaliPartita patta se i pezzi non sono su�cienti per concludere la partitaSalvataggio e caricamento partita con un �le di testoGioco online con chat.Salvataggio in un database dei dati relativi alle vittorie e scon�tte di un gio-catore, con relativa visualizzazione tramite un gra�co.Visualizzazione tesina dal programma.Visualizzazione video dal programma.Gioco contro il pc.
46 Programmare un gioco di scacchi da 0
6.2 Come iniziare
In questa sezione parleró di come procedere per fare un gioco di scacchi,con una guida passo passo.
Come primo passo devo creare l'ambiente di gioco. Ho utilizzato una seriedi caselle colorote diversamente a cui ho assegnato i rispettivi nomi.
Successivamente ho aggiunto alle caselle i vari pezzi.Ho usato una matrice 8*8 per salvare le posizioni dando come valore [1,1]
quello delle coordinate [1,1] cioé A1 cioé torre bianca.Il gioco comincia quando e�ettuo il click sulla cella. In sintesi ecco ció
che avviene.Valuto se devo spostare il pezzo o se lo devo posizionare giú, nel primo
caso, se ho cliccato su un pezzo mio, quindi non dell'avversario, ne una casellavuota, salvo il pezzo, modi�co il colore della cella di sfondo ed in�ne assegnol'immagine vuota alla cella, per non mostrare il pezzo che devo muovere.Nel secondo caso, controllo che non abbia cliccato nella stessa casella, sefosse cosí annullerei la mossa, controllo se quella cella contiene un pezzomio, se fosse cosí do mossa illegale, e riprenderei sempre dalla scelta di doveposizionare il pezzo, controllo se la mossa fatta é consentita, come spiegatoper ogni singolo pezzo successivamente, controllo se il re mio é sotto scacco,se é cosí la mossa é illegale, come spiegato meglio successivamente. Se lamossa é quindi legale, do valore vuoto alla matrice delle coordinate iniziali,nelle coordinate �nali metto il pezzo salvato prima e salvo nella posizione�nale il pezzo nella matrice nel pezzo in movimento metto vuoto, cambiogiocatore. Quindi ottengo la scacchiera con la matrice modi�cata e anchecon i pezzi spostati giusti.
6.3 Spostamenti 47
6.3 Spostamenti
Introduzione
La prima cosa da implementare sono gli spostamenti, quindi devo con-trollare ogni singola mossa e valutarne la correttezza o meno. Se la mossa écorretta posso farla, se é vietata non do il permesso.
48 Programmare un gioco di scacchi da 0
6.3.1 Mossa del cavallo
Il cavallo si muove a L cioé 2 celle in un senso e due in un altro, come sivede dal disegno (il cavallo al centro é quello di partenza) Il cavallo é, forse,il pezzo piú semplice, perché puó saltare gli ostacoli, quindi basta controllareche nella cella di destinazione non ci siano oggetti, se ce ne sono devono essereavversari, poi basta controllare che la mossa sia giusta, cioé a L. Analizzandole mosse si puó notare che la di�erenza fra le coordinate del primo asse,in valore assoluto, sommata alla di�erenza delle coordinate dell'altra asse,sempre in valore assoluto, é sempre 3. Questo funziona per tutte le possibilimosse. Ma, peró, se muovo di tre caselle nella stessa direzione, avró sempreil modulo della di�erenza = 3, per cui dovró controllare che la di�erenza, inmodulo, delle coordinate, dello stesso asse, sia diversa da 3.
Figura 6.1: mossa del cavallo
6.3 Spostamenti 49
6.3.2 Mossa della torre
La torre si muove in verticale o orizzontale, come si vede nel disegno.A di�erenza del cavallo non puó saltare pezzi, quindi dovró tener conto diquesta di�coltá in piú. Per risolvere il problema, controllo prima di tutto lacella di destinazione. Se c'é un pezzo mio la mossa non é valida, se il pez-zo é avversario, posso continuare a controllare. Controllo se lo spostamentoavviene nell'asse x o y. Controllando se la sottrazione delle due coordinate,in valore assoluto é 0. Se é zero per i valori dell'asse x allora si muove inverticale, se no in orizzontale. In entrambi i casi, controllo se nella succes-siva alla direzione scelta c'é un pezzo, se c'é un pezzo mi fermo, se non c'écontinuo, �nché non arrivo alla cella precedente alla destinazione. Perché ladestinazione l'ho giá controllata e so se posso andarci o no. Quindi se nontrovo pezzi lo muovo.
Figura 6.2: mossa della torre
50 Programmare un gioco di scacchi da 0
6.3.3 Mossa dell'al�ere
L'al�ere si muove in obliquo. Cioé fa tanti passi nell'asse x quanti nellay. Da notare, che se parte nella casella nera, non la cambierá mai (infatti cen'é uno nero e uno bianco). Come potete vedere dall'immagine. Il controlloé simile alla torre, con la sola di�erenza che devo controllare che il valoreassoluto dello spostamento sia uguale sia nell'asse x che nell'asse y, comenella torre devo controllare che non ci siano ostacoli, devo sempre primacontrollare il pezzo �nale .
Figura 6.3: mossa dell'al�ere
6.3 Spostamenti 51
6.3.4 Mossa della regina
La regina si muove sia in obliquo sia in verticale e in orizzontale. Os-servazioni: é come l'al�ere o come la torre. Essendo al�ere piú torre puócambiare colore. Come si vede dall'immagine. L'implementazione é statad'avvero semplice, é bastato richiamare il controllo della torre, se non anda-va bene, quello dell'al�ere e se non andava bene neppure quest'ultimo allorail movimento é errato.
Figura 6.4: mossa della regina
52 Programmare un gioco di scacchi da 0
6.3.5 Mossa del re
Il re si puó muovere in tutte le direzioni, ma solo di una casella. Comesi vede nell'immagine Il modo piú semplice per implementarlo, e per fare laricerca piú semplice, quindi occupare meno tempo, non é quello di fare comela regina, cioé controllare le celle limitandosi alla prima, ma, forse, é quelladi fare il controllo manualmente, cioé fare gli otto casi uno alla volta, condegli IF.
Figura 6.5: mossa del re
6.3 Spostamenti 53
6.3.6 Mossa del pedone
Il pedone si puó muovere solo in avanti, rispetto alla sua posizione e solodi una cella per volta, cioé se parte nella cella A rimana nella cella A per isuoi spostamenti. Se non é mai stato mosso si puó muovere di due, solo laprima volta. Se ha un pezzo davanti non puó mangiarlo, quindi deve starefermo. Puó mangiare solo un pezzo nella sua diagonale destra o sinistra,purché davanti a lui. Come mostra l'immagine. Se la mossa é del biancoallora la coordinata successiva deve essere piú 1, se é in b=2 cioé non é maistato mosso allora la coordinata successiva puó anche essere piú 2, se ha unpezzo avanti non si muove. Se ha un pezzo avversario a destra o a sinistra ein alto di uno allora puó mangiarlo. Inverso per il nero. Se arriva alla �ne(b= 1 o 8) allora si tramuta in regina.
Pedone diventa altro pezzo: quando il pedone arriva nell'ultima riga del-l'avversario si puó tramutare in regina, al�ere, torre o cavallo. Quindi quandoarriva li faccio la scelta con un form.
Figura 6.6: mossa del pedone
54 Programmare un gioco di scacchi da 0
6.3.7 Arrocco
Avviene se il re non é mai stato mossa e sa la torre con cui vuole farlonon é mai stata mossa. Come si vede nell'immagine. Per implementarloho usato una semplice variabile numerica. Ho messo a 0 l'inizio, a 1 se eramossa una torre a 2 se era mossa l'altra e a 3 se era mosso il re. Quandomuovo il re metto la variabile a 3, se muovo la torre la metto a 1 o 2. Ognivolta che muovo il re controllo. Se lo muovo a destra di due allora controllola variabile, se é diversa da 1 o 2 allora metto vuoto nella cella del re, siagra�ca che matrice, come nella torre, e metto sia gra�ca sia matrice il re e latorre come in �gura. Poi setto la variabile a 3, cosí non rischio.
Figura 6.7: arrocco
6.4 Scacco 55
6.4 Scacco
Introduzione
Sotto la parola scacco possiamo trovare due casi, il primo quando la scaccoé matto, cioé quando qualsiasi mossa sia faccia il re viene mangiato, in questocaso la partita é �nita, il secondo caso é il normale scacco, quando il re vieneminacciato di essere mangiato ma puó ancora salvarsi. Un' altra cosa daanalizzare é la mossa del re, infatti ad ogni mossa deve vedere se il re éstato messo sotto scacco per colpa sua, se é cosí la mossa non é valida, percontrollare questo basta solo che richiami la funzione che valuta se é scacco.
56 Programmare un gioco di scacchi da 0
6.4.1 Sotto scacco
Controllo scacco re: Il re si trova sotto scacco quando ha un pezzoavversario che lo puó mangiare.
Quando controllo la validitá della mossa, se é vera, dopo aver salvato ilmovimento , controllo se il re é sotto scacco o se si é messo sotto scacco dasolo. Nel caso sia falso, cioé il re non é sotto scacco lascio cosí. Nel caso siavero allora do mossa falsa e rimetto tutto a posto.
Di�erenzio mossa del re con una di un altro pezzo. Finché non sonoall'ultimo pezzo controllo, se sono alla �ne della scacchiera mi fermo. Se neipezzi della mia direzione ho un pezzo mio o avversario che mi salva allorami fermo e do mossa consentita, se no, invece, controllo se é un pezzo chemi da problemi (vuoto va bene, ma non mi salva), se mi da problemi allorametto il controllo a false e non faccio fare la mossa. Se non variano la mossaé consentita (i 2 controlli), dato che possono solo diventare opposti e nontornare, dato che se ho un pezzo che mi salva o uno che mi mangia, subito,non serve sapere cosa ho dopo. La di�erenza fra la mossa del re e non delre sta nel fatto che nella prima controllo le coordinate �nali, mentre nellaseconda, quelle del re, perché se non faccio cosí non posso avere i controlliche ho, dato che sarei costretto a controllare solo una. Cosí per le 8 posizioni(alto, basso, destra, sinistra, obliquo alto.....)
Casi speciali scacco: Pedone:non posso muovere il re se ho un pedonenemico in posizione re piú uno a destra o sinistra allora é lo stesso sottoscacco. Re: non posso muovere il re se nelle coordinate di movimento ho ilre avversario. Cavallo: non posso muovere il re se ho il cavallo che mi dascacco in quella posizione
Di�coltá re, pedone e cavallo: Devo controllare la posizione del re, percontrollare che non vada fori dalla scacchiera. Quindi se sono in cella A1non devo controllare, ad esempio, per il cavallo, se é a sinistra o in basso,quindi devo fare molti controlli sulle posizioni, perché altrimenti avrei comeerrore Out of bonds, dato che controllerei celle inesistenti. E' un po comeil controllo precedente, solo che li avevo meno possibilitá per il controllo diuscita.
Soluzione cavallo e re: mentre per il pedone ho solo 3 possibilitá (destraoccupata, il resto libero, sinistra occupata, il resto libero, tutto libero) peril re e il cavallo le cose si fanno molto piú complicate. Per questo uso il try.Infatti, quando ricevo l'errore Out of bonds setto il controllo a vero, dato che
6.4 Scacco 57
un posto fuori dalla scacchiera non da problemi. Questa tecnica mi permettedi risparmiare nel tempo di esecuzione (parzialmente e non sempre) sia nellalunghezza del codice. L'aspetto negativo é che non posso gestire il singoloerrore che mi interessa, ma gestisco tutti gli errori. Per questo, questa partedi codice é stata molto controllata per quanto riguarda gli errori
58 Programmare un gioco di scacchi da 0
6.4.2 Scacco matto
A di�erenza di quello che si puó pensare la di�coltá non sta nella lunghez-za del codice, ma nel lavoro per ottenerlo. Difatti, logicamente, la soluzioneé semplice e banale, perché non devo fare altro che fare ogni possibile mossae vedere se in almeno un caso mi salvo. Se mi salvo allora non sará scaccomatto. Le prime di�coltá si sono presentate per il re. Infatti il normalecontrollo non va bene, quindi controllo se ho é in quasi scacco matto (cioé sipuó salvare solo muovendosi lui) controllo ogni possibile mossa (alto, basso,destra...). In ognuna di queste vedo se posso muoverlo lí (ho dato i valoriregolari io, ma puó uscire dalla scacchiera e puó esserci un mio pezzo) in�necontrollo se c'é ancora scacco. Altra di�coltá é stato il pedone, solo nellaparte �nale. Infatti ho messo la scelta se si muove nell'ultima casella. Baste-rá quindi copiare il codice rimuovendo quella parte. Peró devo conteggiareche virtualmente i pezzi li muovo, ma usando le stesse procedure é come seli muovessi veramente, quindi, ad esempio, l'arrocco mi si annulla al primoscacco. Quindi, anche in questo caso, devo solamente copiare il movimentoeliminando quella parte. Riassumendo: controllo se il re si salva muovendo-si, se non é cosí allora faccio ogni possibile mossa, copiando la scacchiera emodi�candola e poi la ripristino, se la mossa é legale allora controllo se sonosotto scacco se é illegale non lo faccio. Preferisco fare i controlli perché farei 4 cicli analizzando sempre mossa e scacco occuperebbe un secondo, temponotevole in un gioco uomo contro uomo. Cosí facendo il tempo occupato éminimo, il giocatore non si accorge dell'elaborazione, notando il gioco sempre�uido senza pause.
6.5 Patta 59
6.5 Patta
Introduzione
Esistono molti tipi di patta nel gioco degli scacchi. La patta per mancanzadi mosse, la patta per posizione morta, la patta per accordo, la patta perripetizione di posizione e la patta per la regola delle 50 mosse. La patta peraccordo in motli tornei non vien piú contata, perché svuotava di bellezza ilgioco, quella per ripetizione di posizione é molto facile da fare, basta salvareogni posizione e controllare ogni volta se é uguale alla precedente, se lo éincremento il contatore di quella posizione se no ne creo una nuova, quandoarrivo a tre é patta, ma ho deciso di non implementarla dato che occupatroppo spazio in memoria (ricordo il 1080 possibili partite) e troppo tempoinutile per il controllo.
60 Programmare un gioco di scacchi da 0
6.5.1 Patta per mosse
Per il controllo della patta il ragionamento é simile allo scacco matto,controllo ogni possibile mossa per vedere se ne ho di legali, se le ho allorametto a true una variabile che rimmarrá tale.
6.5.2 Patta per posizione morta
La patta per posizione morta é semplice, conto i pezzi, se non ne hoabbastanza allora é patta.
6.5.3 Patta per la regola delle 50 mosse
La patta per la regola delle 50 mosse si compie quando per 50 mosse noné stato mosse un pedone o non é stata fatta alcuna cattura, basterá quindicontrollare le coordinate �nali, se cé un pezzo avversario allora se la mossaé legale riporto a zero il contatore, lo stesso per il pedone, se muovo lui e lamossa é legale riporto a zero il contatore, se no lo incremento, arrivato a 50mosse é patta.
6.6 Salvataggio e caricamento di una partita 61
6.6 Salvataggio e caricamento di una partita
Introduzione
Il poter riprendere una partita in un secondo momento puó essere motloutile, ecco perché ho implementato la funzione di salvataggio e caricamentodi una partita.
6.6.1 Salvataggio
Per il salvataggio della partita ho utilizzato un �le di testo, ho inserito ivalori dell'arrocco, per sapere se posso farlo oppure no, il turno e la dispo-sizione nella scacchiera, salvando per ogni riga un pezzo con il suo nome evuoto nel caso non ci siano pezzi.
6.6.2 Caricamento
Il caricamento é stato fatto aprendo il �le di testo, e leggendo i valori,infatti il valore dell'arrocco e della mossa sono identi�cati da delle lettereunivoque, allora li prendo e li salvo nella loro variabile. Una volta separatiquesti valori non consoni dal �le sono sicuro che tutto il resto sia della scac-chiera, quindi con un ciclo fatto a mano salvo nella scachciera tutti i pezzi.come é abbastanza intuibile ad ogni nuova riga metto un valore nella scac-chiera incrementando la riga, poi alla �ne delle righe incremento la colonna,�nché non arrivo alla �ne del �le. Dopodiché devo sistemare le immagini deipezzi nella scacchiera, in cui, per ogni singola posizione, controllo che pezzoc'é, e poi, lo visualizzo.
62 Programmare un gioco di scacchi da 0
6.7 Gioco online
Introduzione
Nell'era del web 2.0, in cui i social network la fanno da padrona é im-possibile non inserire un elemento di comunicazione fra i vari utenti. Eccoperché ho deciso di implementare una tecnologia capace di far interagire gliutenti nel gioco degli scacchi e comunicare con una chat.
Per implementare il gioco online ho deciso di utilizzare la tecnica socket,cioé di usare un clientsocket e un serversocket per ogni giocatore. Questascelta é stata quasi obbligata, in quanto le altre alternative risultavano dif-�cilmente e�caci. Infatti avevo pensato di utilizzare l'ftp, cioé attraversouno scambio di �le e il supporto di hosting esterno i due giocatori potevanoscambiarsi le informazioni del gioco. Purtroppo per caricare un �le solo testo,anche di esigue dimensioni, ci metteva parecchio tempo, circa 30 secondi, sen-za contare che avrei dovuto fare un loop per scaricare il �le che l'avversario mimandava. Ho anche implementato questa soluzione, il tempo per una mossaera di circa 2 minuti, oltre al fatto che potevano generarsi tantissimi errori,del tipo che se stavo caricando il �le e l'altro lo stava scaricando insieme ame, ottenevo un �le non corretto, con una parte mancante. Il secondo me-todo si basava sull'uso dei database, ma nessun hosting permetteva l'accessoai database da esterni. Infatti per poter accedere ad un database bisogna oavere il programma nello spazio che puó accedere al database oppure dareil permesso al programma di accesso. bastava modi�care un paramentro nel�le di con�gurazione, ma nessun hoating lo lascia fare. Pensarlo di fare inlocale é assurdo, data la poca banda a disposizione e il danno che causereialla sicurezza della mia rete. Quindi l'ultimo metodo rimasto era l'utilizzodel socket.
6.7.1 Socket, spiegazione
Prima di spiegarvi come ho implementato a livello logico il socket vogliospiegare cos'é il socket. Il socket é un'applicazione client/server, cioé un'ap-plicazione distribuita, con un'applicazione server che o�re dei servizi e unaclient che gestisce l'interfaccia con l'utente e richiede questi servizi. Il clientdeve conoscere l'indirizzo IP del server per richiedere il suo utilizzo.
Per ovviare a questo inconveniente ho deciso di appoggiarmi a dei �le ditesto e al php.
6.7 Gioco online 63
6.7.2 Funzionamento del socket nel programma
Per connettere due pc attraverso la tecnica del socket ho deciso di avviarein ogni pc un server e un client. Dato che il client non puó ricevere dati eil server non puó inviarli. Utilizzare un solo server sarebbe stato, quindi,impossibile.
6.7.3 Connessione del server socket
Come detto in precedenza, ogni macchina avvia un proprio serversocket,mediante la scelta del protocollo (TCP), del numero massimo di client edella porta usata. Primo passo del socket é la creazione del server, grazieai paramentri scelti precedentemente e descritti sopra. Una volta creato ilserver si mette in ascolto. Appena sente che un client fa la sua richiestal'accetta (in questo momento viene creata la connessione fra client e server).Quando il client, con cui ha stabilito la connessione, invia dei dati il server lilegge e poi li elabora. Il client puó decidere quando vuole disconenttersi dalserver. Il server puó decidere di chiudere la connessione quando vuole.
6.7.4 Connessione del client socket
Anche nel caso del client, ogni macchina avvia il proprio client, comenel server, bisogna impostare il tipo di connessione (TCP), l'indirizzo IP delserver e la porta utilizzata dal server. Una volta creata questa connessioneil client puó inviare i suoi dati. Puó decidere quando vuole chiudere la con-nessione. Ovviamente, nel caso in cui non esista l'host, dopo 10 secondi diricerca restituisce un errore, come nel caso ci siano errori di invio e altro.
6.7.5 Funzionamento
Ho giá ben spiegato come creare la connessione, ora spiegheró cosa succedefra la connessione e la disconnessione. Una volta avviato il server il client siconnette ad esso, ed invia i suoi dati. Alla connessione i giocatori scelgonose essere il bianco o il nero. Il tutto viene gestito direttamente dal gioco.Infatti l'utente che ha scelto il colore bianco, appena l'avversario si connette(ovviamente lui é giá conensso), puó muovere. Se la mossa é legale allorapasserá all'avversario la mossa, mandando una stringa che é composta comesegue:
64 Programmare un gioco di scacchi da 0
chiave che identi�ca la mossa coordinate partenza (coppia x e y) coordinatearrivo (coppia x e y) pezzomosso
il server, é sempre in ascolto, legge questa stringa, identi�ca che é una mossae sistema la scacchiera, nello stesso modo in cui avviene il caricamento dellapartita, descritto sopra. Davanti ai dati importanti c'é una chiave identi�-cativa, questo perché ogni giocatore puó anche chattare con l'avversario equindi bisogna di�erenziare le due cose. Inoltre, siccome ogni controllo vienefatto da chi e�ettua la mossa, l'avversario non controllerá mai se ha subitoscacco matto o la partita é in patta, per cui gli viene inviata una stringa, nellemodalitá prima descritte, che annuncia la �ne della partita. Un caso parti-colare é l'arrocco, in quanto i pezzi mossi sono due, quindi al controllo dellastringa, se ho uno dei quattro casi in cui c'é stato arrocco, devo aggiornaregra�camente e anche nella matrice la posizione della torre (dato che quelladel re é giá stata sistemata). Una volta completata la mossa, e quindi inviatii dati, metto una variabile in modo che il giocatore non possa piú cliccare,e quindi cambiare lo stato della scacchiera, �nché al server non arriva unamossa e�ettuata dall'avversario.
6.7.6 Implementazione
Tutti le informazioni, sopra descritte, per connettersi all'avversario sonotante per un utente che non conosce nulla. Ecco perché ho fatto una sempliceinterfaccia gra�ca, che non fa altro che richiamare le funzioni del client e delsocket, con la possibilitá di connettere il server e il client inserendo sempli-cemente la porta e l'ip dell'host. La porta di default é la 32340, solitamentenon serve modi�carla. Quindi all'utente non resta che inserire l'indirizzo del-l'host. Si ricorda che nel caso di un gioco in una rete lan basta l'indirizzodell'host vero e proprio, mentre nel caso si parli di un gioco attraverso inter-net, bisogna aprire la porta del router (se no non lascia passare i pacchetti)e inserire l'indirizzo ip del router.
6.7.7 Scelta automatica dell'avversario
Come detto in precedenza per comunicare i due computer devono co-noscere l'ip dell'avversario. Questa soluzione peró non si presentava comeottimale, in quanto i due giocatori avrebbero dovuto conoscersi in preceden-za o comunque mettersi in contatto. Quindi ho deciso di appoggiarmi al
6.7 Gioco online 65
php e ad un hosting esterno. Il funzionamento � abbastanza semplice, allarichiesta di connessione l'host accede a una pagina php che alla sua visitaaggiunge l'ip ad un �le di testo. Poi si mette in ascolto sul server. Appenaun altro host si connette accede a questo �le di testo, se � vuoto fa come ilprecedente se no si connette all'avversario inviando il suo ip. A questo puntoentrambi gli host eliminano il proprio ip dal �le di testo.
aggiunta di un ip con il php
(Il codice é in pseudocodi�ca)Ecco il codice utilizzato:
<?phpfp = fopen(�leip.txt, a); //apertura del �le per aggiunta
mioip = getenv(REMOTEADDR); //prendo l'ipfwrite(fp, mioip.n); //lo scrivo nel �le
fclose(fp);//chiuo il �leecho mioip;
?>Ecco cosa fanno tutte le istruzioni:
�le = fopen(�le.txt,a);
Apro il �le dandogli come nome �le e assegnandogli il �le �le.txt la a staper append cioé aggiungi in coda.
Al posto della a potrei mettere:
• r read, cioé leggi
• w write, cioé scrivi (sovrascrive il �le)
• x, riporta all'inizio il puntatore
oltre a questi posso mettere:
• r+, lettura e scrittura
66 Programmare un gioco di scacchi da 0
• w+, lettura e scrittura (sovrascrive il �le)
• x+, lettura e scrittura
• a+, aggiunge in cosa e lettura
al posto di �le.txt devo mettere il nome del mio �le ed eventualmente unpercorso.
ip = getenv(REMOTEADDR);
con questa istruzione assegno alla variabile ip lâip del navigatore, che loottengo con getenv(REMOTEADDR).
fwrite(�le, ip.n);
con questo comando scrivo nel �le �le, che nel mio caso sará �le.txt ip,che, se vi ricordate é una variabile a cui ho asseganto lâip del visitatore e nche signi�ca a capo. Il . serve per concatenare le due stringhe.
fclose(�le);//chiuo il �le
con questa istruzione chiudo il �le �le, necessaria per far terminare tuttocorrettamente, anche se la maggioranza delle volte omettendola non cambianulla, ma é sempre meglio metterla.
cancellazione di un ip con il php
Per cancellare un ip prendo il �le, salvo tutto il suo contenuto in un arraye scrivo nel �le tutti gli ip diversi dal mio. Ecco il codice:
6.7 Gioco online 67
<?phparray = array();//creo un array dove salvo gli ip
fp = fopen(�leip.txt, r+);//apro il �le per lettura e scritturawhile (!feof(fp)) //ciclo �nch� non legge tutto il �le
bu�er = fgets(fp, 4096);//legge la rigaarray[] = bu�er;//aggiungo la riga all'array
fclose(fp);//chiudo il �le�le = �leip.txt;
unlink(�le);//cancello il �leif (!�leexists(�le)) //ricreo il �le
�le = fopen(�le, w);fputs(�le, );fclose(�le);
echo �le creato <br>;fp = fopen(�leip.txt, w+);//lo riapro per aggiungerci i dati
conta = count(array);//leggo dimensioni arraymioip = getenv(REMOTEADDR);//prendo l'ipfor(i=0;i<conta;i++) //scorro tutto l'array
if (array[i]==mioip.n) //se e' il mio ip allora non lo scrivoecho (E' stato trovato il tuo ip ed é stato cancellato);
else//se non � il mio ip allora lo posso riscrivere
fputs(fp, array[i]);//lo scrivo nel �lefclose(fp);//chiudo il �le
?>
68 Programmare un gioco di scacchi da 0
6.8 Installazione
Il programma si presenta facilmente installabile. Basterá infatti fare unsemplice doppio click nel �le, inserire la password dell'amministratore (sem-pre necessaria per le installazioni) e automaticamente verrá installato il pro-gramma. Basterá poi andare in Applicazioni�>Giochi�> scacchi per avviareil programma. Dato ch il programma usa delle immagini in modo dinamico,per la rappresentazione dei pezzi sará necessario copiare una cartella nellapropria home. Nel caso l'utente se lo dimentichi o cancelli quella cartella,una semplice interfaccia gra�ca gli dirá di copiare quella cartella, oppuremediante un semplice click potrá scaricare direttamente da internet i �le, eimemdiatamente si avvierá il gioco.
Sará possibile installare il programma in tutti i sistemi operativi linux-like, mediante il pacchetto sorgenti, e nei piú comuni sistemi operativi gnu/linux,quali: fedora, ubuntu, mandriva, slackware, debian, opensuse, tramite il lo-ro semplice pacchetto d'installazione prede�nito (quindi facendo un semplicedoppio click per l'installazione). Il programma sará disponibile sia per la ver-sione a 32bit sia per quella a 64 bit, cioé ottimizzata per i multiprocessori, inmodo da utilizzare tutti i processori a disposizione del computer. Comunque,la versione a 32bit funziona anche in sistemi operativi a 64bit.
6.9 Realizzazzione della scacchiera 69
6.9 Realizzazzione della scacchiera
Ho giá descritto il ragionamento logico per implementare tutte le rego-le del gioco, ma devo ancora descrivere come ho realizzato la scacchiera ela visualizzazzione dei pezzi. Per realizzare la scacchiera ho utilizzato dellepicturebox, cioé della caselle di immagini. Ho disposto le 64 caselle a colorialterni, cosí come é fatta una scacchiera e assegnato ad ognuna di esse il loronome. Al caricamento del gioco ad ogni casella viene aggiunta un'immagine,mediante l'evento picture.load (ecco perché é necessario avere le immaginenella propria home, se no non sa da dove prenderle), caricando ogni singolaimmagine in ogni casella, dato unn'immagine vuota alle caselle vuote. Ov-viamente le immagini sono senza sfondo, cioé con lo stesso trasparente. Cos'ifacendo l'utente potrá anche personalizzare le immagini dei pezzi come vorrá.La necessitá di inserire l'immagine vuota é dovuta al fatto che quando spostoun pezzo, nella cella di destinazione vado a sostituire l'immagine con quelladel pezzo spostato, mentre, nella cella di partenza devo levare l'immagine, el'unico modo é sostituirla con una vuota.
70 Programmare un gioco di scacchi da 0
6.10 Suoni
Per rendere il gioco piú avvincente e realistico ho aggiunto dei suoni,quando un giocatore compie una mossa legale e quando arriva un messaggionella chat. Per implementare questa soluzione ho usato il componente Music.Potete vedere il pseudocodice qui sotto:
Music.load(User.home percorso sound4.mp3)Music.play
Molto semplicemente carico con l'evento load la musica, un semplice suo-no che simula il movimento del pezzo, mentre con l'evnto play riproduco ilsuono.
6.11 Statistiche con Database 71
6.11 Statistiche con Database
Introduzione
Utilizzare un �le di testo per salvare una grande massa di dati, qualile statistiche risulta controproducente e poco gestibile, per cui ho deciso diutilizzare un database.
6.11.1 Salvataggio dei dati
Per salvare i dati gestisco tutto da codice, vediamo come:
TRY hConn.ClosehConn = NEW Connection
sName = scacchiWITH hConn.Type = mysql
.Host = localhost.Login = textbox6.Text
.Password = textbox7.text.Name = �END WITHhConn.Open
IF NOT hConn.Databases.Exist(sName) THENhConn.Databases.Add(sName)
ENDIFhConn.Close
hConn.Name = sNamehConn.Open
Con questo codice creo il database, se non presente. Ecco come funziona:prima cosa tento di stabilire una connessione con il database, se mi riesceallora esiste giá un database e salto al passaggi osucessivo, se non riesce creoil database e poi vado alla procedura per creare le tabelle, come mostratoqui sotto:
72 Programmare un gioco di scacchi da 0
hTable = hConn.Tables.Add(dati)hTable.Fields.Add(id, db.Serial) 'identi�cativo univoco, autoincrementato
ogni voltahTable.Fields.Add(colore, db.String)
hTable.Fields.Add(nomeutente, gb.String)hTable.Fields.Add(commenti, gb.String)
hTable.PrimaryKey = [id]hTable.Update
Con il codice sopra mostrato creo la tabella, dichiarandono i campi, solose non giá presente. Per inserire i dati all'interno del database utilizzo lafunzione:
sql = insert into scacchi.dati (colore,nomeutente)values( ' colore ','nomeutente ') MyRS = hConn.Exec(sql)
Cioé dichiaro il codice sql da eseguire, dando un insert into, cioé uncomando di inserimento, successivamente lo vado ad eseguire grazie all'Exec.
6.11.2 Recupero dei dati
Per recuperare i dati utilizzo sempre un'istruzione sql, come segue:sql = select * from scacchi.dati order by id MyRS = hConn.Exec(sql) 'prendo
tutti i dati
Questo codice é un select, cioé estrae dalla tabella dati tutto il contenuto.
6.11.3 Statistiche
Ho deciso di visualizzare questi dati in forma gra�ca, piú facilmente con-sultabile. Per fare questo ho utilizzato la funzione Draw, disegnando, inbase ai dati prima raccolti e selezionati ed elaborati, dei rettangoli che rap-presentano le percentuali di vittoria e scon�tta di quel giocatore con uncolore.
Capitolo 7
Conclusione
Posso dire che gli obbiettivi (l'analisi tecnica e la realizzazzione del giocodegli scacchi) sono stati raggiunti, con buoni risultati. Il programma, almomento, non riscontra bug conosciuti per quanto riguarda il gioco sullostesso computer, il gioco online e tutte le altre feature. Per quanto riguardail gioco contro il computer il programma presenta ancora alcuni bug, perla maggior parte sono dovuti al sistema che non riesce a gestire la mole dilavoro, si puó notare questo avviando il programma da terminale, e vedendola restituzione di stringhe non generate dallo stesso.
74 Conclusione
Appendice A
Appendice
A.1 Comandi
In questa appendice ho inserito alcuni comandi interessanti, per le loroproprietá o per l'uso che ne é stato fatto.
76 Appendice
Com
andoCosa
fa?Utilizzo
picturebox.picture=picture.load(im
magine)
nellapicturebox
verrámostrata
un'immagine
perrealizzare
lascacchiera
nome�le=
OPENnom
e�le.estensioneFORCREATE
apreil�le
perla
scritturaper
ilsalvataggio
dellapartita
nome�le.save(nom
e�le.estensione,stringa)
salvail�le
perilsalvataggio
dellapartita
nomeconnessione
=NEW
HttpC
lientASnom
econnessionecrea
unanuova
connessionehttp
perilgioco
onlinecontro
unavversario
nomeconnessione.U
RL=
urlsetto
l'urldove
operoper
trovarel'avversario
inmaniera
automatica
nomeconnessione.G
etscarico
idati
dellaconnessione
pertrovare
l'avversarioin
maniera
automatica
IFLof(h)
THENREAD
h,bu�er,
Lof(h)
leggeemette
inun
bu�eridati
pertrovare
l'avversarioin
maniera
automatica
Server.Type
=Net.Internet
settoiltipo
diconnessione
perilgioco
ininternet
Server.Port
=porta
settola
portadi
connessioneper
ilgioco
ininternet
PUBLIC
SUBServerE
rror()in
casodi
erroreper
ilgioco
ininternet
PUBLIC
SUBServerC
onnection(sHost
ASString)
leggela
richiestadi
connessioneserver
socketper
ilgioco
ininternet
Client.A
dd(Server.Accept())
accettala
connessionedel
serverserver
socketper
ilgioco
ininternet
PUBLIC
SUBSocketR
ead()legge
idati
inarrivo
dalclient
serversocket
perilgioco
ininternet,
letturaREAD
LAST
,sB
uf,Lof(L
AST
)legge
idati
inarrivo
mettendoli
insB
ufper
ilgioco
ininternet,
letturaPUBLIC
SUBSocketC
losed()valuta
lachiusura
dellaconnessione
perilgioco
ininternet,
chiusuraClient.R
emove(C
lient.Find(L
AST
))elim
inailclient
dallalista
perilgioco
ininternet,
chiusuraMySock.H
ost=
ipsetta
l'ipdell'host
serverper
connettersinel
giocoin
internetMySock.P
ort=
portasetta
laporta
dell'hostserver
perconnettersi
nelgioco
ininternet
MySock.C
onnect()siconnette
all'hostserver
perconnettersi
nelgioco
ininternet
WRITEMySock,
dati,Len(dati)
inviaidati
settandola
lunghezzaper
inviareidati
nelgioco
ininternet
CLOSE
MySock
chiudela
connessionecon
ilserver
perchiudere
laconnessione
nelgioco
ininternet
PRIVATEhC
onnASConnection
dichiarala
connessioneper
laconnessione
aldatabase
hConn.T
ype=
mysql
dichiarailtipo
diconnessione
aldatabase
perla
connessioneal
databasehC
onn.Host
=localhost
dichiaral'host
diconnessione
aldatabase
perla
connessioneal
databasehC
onn.Login
=nom
eutentedichiara
ilnom
eutente
perconnessione
aldatabase
perla
connessioneal
databasehC
onn.Passw
ord=
pswdichiara
lapassw
ordper
connessioneal
databaseper
laconnessione
aldatabase
hConn.O
penapre
laconnessione
aldatabase
perla
connessioneal
databasehC
onn.Databases.A
dd(nome)
aggiungeun
databaseper
laconnessione
aldatabase
hConn.T
ables.Add(nom
etabella)crea
unanuova
tabellanel
databaseper
laconnessione
aldatabase
hTable.F
ields.Add(id,
db.Serial)crea
unnuovo
campo
nellatabella
perla
connessioneal
databasehT
able.Prim
aryKey
=[nom
echiave]de�nisce
lachiave
primaria
perla
connessioneal
databasehT
able.Update
aggiornaildatabase
conla
tabelladichiarata
perla
connessioneal
databaseMyR
S=
hConn.E
xec(sql)esegue
ilcodice
sqlper
laconnessione
aldatabase
MyR
S!nomecam
povisualizza
ilnom
edel
campo
dellatabella
pervisualizzare
idati
MyR
S.MoveN
extva
allatupla
successivaper
visualizzareidati
draw.Begin(D
rawingA
rea)seleziona
dovedisegnare
perildisegno
dellestatistiche
Draw
.rect(x1,y1,x2,y2)disegna
unrettangolo
coniquattro
verticiper
ildisegno
dellestatistiche
A.2 Allegati 77
A.2 Allegati
In allegato a questa tesina troverete un dvd. Questo dvd contiene il siste-ma operativo Ubuntu modi�cato, con l'aggiunta di alcuni programmi, qualiGambas, il linguaggio di programmazione che ho usato per programmare ilgioco, TexMaker, l'editor utilizzato per scrivere la tesina in LaTex, alcuniprogrammi per il video editing, utilizzati per creare i video di presentazione,come cinelerra e kdenlive, alcuni programmi per la gra�ca 2d (Gimp) e 3d(Blender), alcuni programmi utili per la gestione di internet e dei social net-work ed, ovviamente, il gioco giá installato, la tesina e la presentazione, oltrea molti �le utili per la spiegazione approfondita della stessa, quali i sorgentiiniziali. Oltre a tutti questi programmi ce ne sono molti altri, oltre a deiplug-in per �refox, per gestirlo al meglio.
Questo dvd é stato realizzato per permettere a tutti di provare il program-ma senza dover installare nulla. Basterá, infatti, inserire il dvd nel propriolettore ed avviare il computer (ovviamente il bios deve essere settato cor-rettamente, quindi deve prevedere la lettura da cd prima di altri dispositivibootabili). All'inizio ci sará il tasto invio da premere per far partire il boot,a questo punto basterá scegliere se provarlo (live) o installarlo (install), sce-gliendo di provarlo si avvierá normalmente, senza modi�care in alcun modo ilvostro computer, i dati per l'accesso sono: nome utente: ealmuno, password:ealmuno. Scegliendo di installarlo potrete poi salvare i vostri �le e modi�carloa vostro piacimento, ovviamente occuperá spazio nel vostro computer.
78 Appendice
A.3 Approfondimenti odierni: la guerra fredda
Usa, arrestati dieci russi: Sono spie.
L'Fbi: agivano sotto copertura usando nomi e identitá fasulleIn America coperti da Mosca
NEW YORK
Le relazioni tra Stati Uniti e Russia riprecipitano in pienoclima di Guerra Fredda: l'Fbi ha arrestato dieci persone con l'ac-cusa di essere spie russe mentre un'undicesima, identi�cata comeChristopher Metsos, é ancora ricercata. Otto di loro sono sta-te fermate domenica, con l'accusa di aver condotto azioni sottocopertura per conto della Federazione Russa, di aver fornito aMosca informazioni sensibili e di aver riciclato denaro sporco.
Gli altri due sono sospettati di far parte dello stesso program-ma, si legge in un comunicato di�uso dai federali. I presuntiagenti erano stati addestrati dai servizi di intelligence di Moscanell'uso di codici e cifre e in varie lingue straniere prima di es-sere spediti negli Stati Uniti nel corso dell'ultimo decennio. Orarischiano �no a cinque anni di carcere per la loro attivitá di 007-sono accusati di cospirazione per aver agito come agenti illegalidella Federazione Russa all'interno degli Stati Uniti e venti perle operazioni �nanziarie proibite. L'obiettivo della loro missione,spiega il Ministero della Giustizia, era la ricerca e lo sviluppo dicontatti in circoli politici americani.
L'Fbi é ancora sulle tracce di un undicesimo uomo, identi�catocome Christopher Metsos. Le manette sono scattate quasi con-temporaneamente in tutti gli Stati Uniti: da Montclair, in NewJersey, Yonkers, nello stato di New York ad Arlington, in Virgi-nia. Altri due agenti, conosciuti con i nomi di Donald Heath�elde Tracey Lee Ann Foley sono stati arrestati a Boston.
Dei fermati solo uno, Mikhail Semenko, ha un nome russo.Tutti gli altri hanno nomi inglesi, ispanici, italo-americani. Al-cuni nomi, secondo fonti del Dipartimento della Giustizia citatedalla Cnn, appartenevano ad americani morti, ed erano stati as-sunti all'inizio degli Anni Novanta per inserirsi nella societá astelle e strisce. L'operazione é il frutto di un'indagine durataanni, che ha coinvolto una rete di poliziotti disseminata su tut-
A.3 Approfondimenti odierni: la guerra fredda 79
to il territorio americano, scattata dopo l'intercettazione di unmessaggio partito dal quartier generale dell'intelligence moscovi-ta. Siete stati inviati negli Usa per una missione a lungo termine.La vostra istruzione, i vostri conti bancari, auto e casa, hannoun solo obiettivo: riempire appieno la vostra missione, ossia cer-care e sviluppare legami nei circoli politici americani ed inviarcimessaggi segreti.
Questo é un articolo tratto dal quotidiano presente anche online, lastam-pa, 1 in data 29 giugno 2010 (e richiamato da numerose testate nazionali etelegiornali), la guerra fredda si puó de�nire �nita il 9 novembre 1989 con ilcrollo del suo simbolo, il muro di Berlino, eretto il 13 agosto 1961. Si puóben notare, come a distanza di piú di trent'anni i rapporti siano ancora tesi.
Un'interpretazione alle possibili domande che potremo porci ce le da ilcorriere 2
L'inchiesta ha sollevato non pochi interrogativi. La primariguarda il danno fatto dalla rete: quali informazioni hanno car-pito? Il secondo quesito concerne i tempi del blitz dell'Fbi: seuno degli agenti, il principale, é �nito sotto inchiesta �n dal 2004perché la polizia federale ha deciso di muoversi proprio adesso? Enon potevano beccarne solo un paio visto che le coppie agivano inmodo indipendente e lasciare la briglia sciolta agli altri? Alcuniesperti sostengono che la retata é un chiaro messaggio politicolanciato dagli Stati Uniti ai russi: smettetela con queste opera-zioni. Un segnale che arriva a pochi giorni dal caloroso incontrotra Obama e il presidente Medvedev. Un colloquio seguito da unospuntino a base di hamburger e patatine in un locale di Arling-ton. A pochi chilometri dal ristorante l'Fbi ha arrestato propriodue delle spie.
L'accusa lanciata dagli esperti, che il corriere cita, é quella di voler dareun chiaro e forte messaggio politico alla Russia.
1http://www.lastampa.it/redazione/cmsSezioni/esteri/201006articoli/56266girata.asp2http://www.corriere.it/esteri/10giugno28/usa − spie − russe − arrestate3ccc0902 −
82f6− 11df − 9406− 00144f02aabe.shtml?fr = boxprimopiano
80 Appendice
A.4 Licenza
Questa opera é rilasciata sotto licenza creative commons
Attribuzione-Non commerciale-Non opere derivate 2.5 Italia
Tu sei libero:
• di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresen-
tare, eseguire e recitare quest'opera
Alle seguenti condizioni:
• Attribuzione - Devi attribuire la paternitá dell'opera nei modi indicati dall'autore o
da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi avallino
te o il modo in cui tu usi l'opera.
• Non commerciale - Non puoi usare quest'opera per �ni commerciali.
• Non opere derivate - Non puoi alterare o trasformare quest'opera, ne' usarla per
crearne un'altra.
Prendendo atto che:
• Rinuncia - E' possibile rinunciare a qualunque delle condizioni sopra descritte se
ottieni l'autorizzazione dal detentore dei diritti.
• Pubblico Dominio - Nel caso in cui l'opera o qualunque delle sue componenti siano
nel pubblico dominio secondo la legge vigente, tale condizione non é in alcun modo
modi�cata dalla licenza.
• Altri Diritti - La licenza non ha e�etto in nessun modo sui seguenti diritti:
� Le eccezioni, libere utilizzazioni e le altre utilizzazioni consentite dalla legge
sul diritto d'autore;
� I diritti morali dell'autore;
� Diritti che altre persone possono avere sia sull'opera stessa che su come l'opera
viene utilizzata, come il diritto all'immagine o alla tutela dei dati personali.
• Nota - Ogni volta che usi o distribuisci quest'opera, devi farlo secondo i termini di
questa licenza, che va comunicata con chiarezza.
sito web di riferimento: http://ealmuno.altervista.org
e-mail: [email protected]