Scacchi
Autore : Moretto Alessio
Anno Scolastico 2009/2010
Classe 5°C
Istituto 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
2.1
2.2
2.3
2.4
2.5
2.6
Scacchi, matematica, calcolo ed economia .
Matematica e scacchi, la leggenda . . . . .
2.2.1 Dimostrazione serie geometrica . .
Matematica e scacchi, il cavallo . . . . . .
Matematica e scacchi, il quadrato magico .
Calcolo e scacchi, le mosse possibili . . . .
Calcolo e la generazione di numeri casuali
3 Storia, scacchi e la guerra fredda
3.1
3.2
3.3
3.4
3.5
La conferenza di Jalta . . .
La Germania dopo la guerra
Il piano Marshall . . . . . .
La guerra fredda . . . . . .
URSS contro America . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Informatica, intelligenza articiale
4.1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Metodi di intelligenza articiale . . . . . . . . . .
4.1.1 Metodo MinMax . . . . . . . . . . . . . .
4.1.2 Metodo Database . . . . . . . . . . . . . .
4.1.3 Come pensa un computer . . . . . . . . .
4.1.4 Implementazione dell'intelligenza articiale
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
12
14
16
17
20
23
28
31
32
32
32
32
33
35
37
37
38
38
39
5 Sistemi, socket
41
6 Programmare un gioco di scacchi da 0
43
6.1
Feature implementate . . . . . . . . . . . . . . . . . . . . . . . 45
4
INDICE
6.2
6.3
Come iniziare . . . . . . . . . . . . . . . . . . . .
Spostamenti . . . . . . . . . . . . . . . . . . . . .
6.3.1 Mossa del cavallo . . . . . . . . . . . . . .
6.3.2 Mossa della torre . . . . . . . . . . . . . .
6.3.3 Mossa dell'alere . . . . . . . . . . . . . .
6.3.4 Mossa della regina . . . . . . . . . . . . .
6.3.5 Mossa del re . . . . . . . . . . . . . . . . .
6.3.6 Mossa del pedone . . . . . . . . . . . . . .
6.3.7 Arrocco . . . . . . . . . . . . . . . . . . .
6.4 Scacco . . . . . . . . . . . . . . . . . . . . . . . .
6.4.1 Sotto scacco . . . . . . . . . . . . . . . . .
6.4.2 Scacco matto . . . . . . . . . . . . . . . .
6.5 Patta . . . . . . . . . . . . . . . . . . . . . . . . .
6.5.1 Patta per mosse . . . . . . . . . . . . . . .
6.5.2 Patta per posizione morta . . . . . . . . .
6.5.3 Patta per la regola delle 50 mosse . . . . .
6.6 Salvataggio e caricamento di una partita . . . . .
6.6.1 Salvataggio . . . . . . . . . . . . . . . . .
6.6.2 Caricamento . . . . . . . . . . . . . . . . .
6.7 Gioco online . . . . . . . . . . . . . . . . . . . . .
6.7.1 Socket, spiegazione . . . . . . . . . . . . .
6.7.2 Funzionamento del socket nel programma .
6.7.3 Connessione del server socket . . . . . . .
6.7.4 Connessione del client socket . . . . . . . .
6.7.5 Funzionamento . . . . . . . . . . . . . . .
6.7.6 Implementazione . . . . . . . . . . . . . .
6.7.7 Scelta automatica dell'avversario . . . . .
6.8 Installazione . . . . . . . . . . . . . . . . . . . . .
6.9 Realizzazzione della scacchiera . . . . . . . . . . .
6.10 Suoni . . . . . . . . . . . . . . . . . . . . . . . . .
6.11 Statistiche con Database . . . . . . . . . . . . . .
6.11.1 Salvataggio dei dati . . . . . . . . . . . . .
6.11.2 Recupero dei dati . . . . . . . . . . . . . .
6.11.3 Statistiche . . . . . . . . . . . . . . . . . .
7 Conclusione
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
46
47
48
49
50
51
52
53
54
55
56
58
59
60
60
60
61
61
61
62
62
63
63
63
63
64
64
68
69
70
71
71
72
72
73
INDICE
A Appendice
A.1
A.2
A.3
A.4
Comandi . . . . . . . . .
Allegati . . . . . . . . .
Approfondimenti odierni:
Licenza . . . . . . . . . .
5
. . . . . . . . . .
. . . . . . . . . .
la guerra fredda
. . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
75
75
77
78
80
6
INDICE
Elenco delle gure
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
mossa del cavallo . . . . . . . . . . . . . . . . . . . . . .
scacchiera 3*3 . . . . . . . . . . . . . . . . . . . . . . . .
Paolo Guerini scacchiera 3*3 . . . . . . . . . . . . . . . .
Paolo Guerini scacchiera 3*3 soluzione . . . . . . . . . .
percorso chiuso del cavallo . . . . . . . . . . . . . . . . .
quadrato magico 3*3 . . . . . . . . . . . . . . . . . . . .
quadrato magico 3*3 mossa del cavallo . . . . . . . . . .
quadrato magico 3*3 collegamento fra i numeri . . . . . .
quadrato magico 3*3 collegamento nale . . . . . . . . .
quadrato magico 3*3 percorso simmetrico . . . . . . . . .
possibile posizione delle regine senza che si attacchino . .
possibile posizione della regina per coprire tutte le caselle
posizione cavallo senza che si attacchino a vicenda . . . .
posizione cavallo per coprire tutta la scacchiera . . . . .
4.1
come pensa un computer . . . . . . . . . . . . . . . . . . . . . 38
6.1
6.2
6.3
6.4
6.5
6.6
6.7
mossa del cavallo .
mossa della torre .
mossa dell'alere .
mossa della regina .
mossa del re . . . .
mossa del pedone .
arrocco . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
17
18
18
19
20
20
21
21
22
25
26
26
27
48
49
50
51
52
53
54
8
ELENCO DELLE FIGURE
Capitolo 1
Introduzione
In questa tesina parleró del gioco degli scacchi, suddividendo il tutto in
due argomenti principali:
• Nella prima parte aronteró una relazione teorica del gioco degli scacchi, vista da diversi punti di vista, quello matematico, probabilistico,
quello storico (inteso come il rapporto degli scacchi con la storia dell'umanitá e non degli scacchi) e quello dell'intelligenza articiale, quindi
informatico.
• Nella seconda parte descriveró il programma creato per giocare a scacchi, che permette un gioco a 2 giocatori, contro il computer e online.
Nel gioco c'entrano svariate materie, quali informatica (per tutta la
programmazione) e sistemi, per la connessione fra 2 giocatori, quindi
lo scambio in internet.
Ho scelto questo argomento perché é sempre stato un mio sogno riuscire a
programmare questo gioco e perché si legava bene con molte materie scolastiche, quali storia, matematica, calcolo, ovviamente informatica e sistemi.
Lo scopo é analizzare il gioco degli scacchi nelle sue forme piú tecniche ed
implementarlo 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 questo
capitolo andremo a vedere alcune delle tante relazioni che li rendono ani;
ad esempio, parleremo del cavallo e delle sue proprietá matematiche, delle
possibili 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? Apparentemente niente, ma in realtá le relazioni sono molte. E non lo dico
io, bensí Robert Alexander Mundell. Ma vediamo chi é Robert Alexander
Mundell: Robert Alexander Mundell C.C. (Kingston, 24 ottobre 1932) é un
economista 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 a
Roma e abbiamo avuto l'opportunitá di ascoltare un suo intervent con il titolo Lectio Magistralis: Matematica, economia e scacchi. Il suo discorso é
iniziato con una presentazione degli scacchi e con una breve desrcizione degli
incontri che ha avuto con vari giocatori di fama mondiale. Dopo ha cominciato a spiegare le relazioni fra Matematica, economia e scacchi. Vediamo di
analizzarle assieme.
Queste discipline sono scienza? Ma cos'é la scienza? Secondo una denizione antica é un corpo sistematico di conoscenza. Secondo questa denizione
allora la risposta é si, infatti la matematica é la scienza piú antica.
Ma passiamo ad un altro argomento. Cerchiamo di trovare un collegamento tra economia e scacchi. Cominciamo con dare la denizione di economia
secondo le idee iniziali.
Economia: branca della losoa morale. Quindi non é una scienza. Vediamo come viene denita in un periodo storicamente successivo. Economia:
scienze sociali. E adesso é denita come matematica, dal 1968. Data nella
quale la banca della scienza l'ha denita tale. Ora passiamo all'analisi della
matematica. La prima domanda da porsi é abbastanza ovvia. Perché non
esiste un premio Nobel per la matematica? Ricordiamo che i premi Nobel
vengono dati a tutte le migliori scoperte scientiche. La risposta é abbastanza strana, pare che la moglie di Nobel avesse come amante un matematico
famoso, e Nobel non volesse che il premio fosse dato a lui (é solo una storia,
senza fonti uciali). Ma ci sono altri premi per i matematici. Sia l'economia
che la matematica sono scienze.
Ora che abbiamo scoperto che sono scienze pensiamo ai legami. Ritorniamo all'economia, a pensarci bene é come un gioco di cooperazione. Una
guerra nel guadagnare di piú, delle scelte strategiche per vincere, e dare scacco matto. Finalmente abbiamo scoperto il legame tra economia e scacchi.
Ma manca ancora la matematica. Molti sono i matematici che hanno studiato il gioco degli scacchi, ma del legame tra scacchi e matematica potremo
2.1 Scacchi, matematica, calcolo ed economia
occuparci molto piú dettagliatamente in un capitolo successivo.
Nel gioco degli scacchi si puo' prevedere chi vince una partita solo analizzando le prime mosse. Infatti ci sono certe aperture considerate sfavorevoli e
possiamo dire con molta probabilitá chi vincerá la partita. Quindi gli scacchi
sono scienza. Ed é proprio da questo ragionamento che concludiamo con la
Teoria dei giochi, molto conosciuta in calcolo. Quindi se gli scacchi sono
scienza allora gli altri giochi sono scienza, ed indovinate chi sono stati i primi
che hanno scritto un libro e pensato a questa teoria! Un matematico ed un
economista.
13
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á. Cominciamo
parlando di un problema matematico, dato anche pochi anni fa come esame
di stato.
Questo problema é stato tratto dalla leggenda degli scacchi, ma é tutto
intuibile dal testo.
Testo:
Si narra che l'inventore del gioco degli scacchi chiedesse di
essere compensato con chicchi di grano; un chicco sulla prima
casella, due sulla seconda, quattro sulla terza e cosí via, sempre
raddoppiando il numero dei chicchi, no alla sessantaquattresima
casella. Assumendo che mille chicchi di grano pesino circa trentotto grammi, calcola il peso in tonnellate della quantitá di grano
pretesa dall'inventore.
Il re che aveva ricevuto questa strana richiesta credeva che si trattasse di
una quantitá esigua e si era quasi sbalordito. Il giorno dopo i suoi matematici
gli portarono il risultato dicendo che neppure tutto il grano del mondo prodotto in un anno sarebbe bastato. Infatti il risultato é 18.446.744.073.709.551.615
chicchi di grano.
Diamo la dimostrazione matematica del risultato ottenuto. I chicchi sulla
n-sima casella sono dati dai termini della progressione geometrica:
an+1
=q
an
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 ragione
n −1
q e primo termine a1 vale: Sn = a1 qq−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 − a1
q n a1 − a1
qn − 1
=
= a1
q−1
q−1
q−1
essendo an+1 = qan = qqan−1 = · · · = q n a1
n
−1
per q 6= 1
Sn = a1 qq−1
n
oppure Sn = a1 1−q
1−q
Nel caso in esame la richiesta dell'ambasciatore costituisce la progressione
geometrica
1, 2, 22 , ..., 263
la cui somma vale
S64
264 − 1
= 264 − 1
=1∗
2−1
Se voglio quindi risolvere il problema dato all'inizio, calcolo le tonnellate
corrispondenti, facendo il risultato appena venutomi per il peso di ogni singolo chicco di grano, ottenendo proprio il numero 18.446.744.073.709.551.615
riportato sopra.
16
Scacchi, matematica, e calcolo
2.2.1 Dimostrazione serie geometrica
Si dice serie geometrica di ragione q la seguente:
+∞
X
qn = 1 + q + q2 + q3 + · · · + qn + · · ·
n=0
Volendo studiarne il carattere, scriviamo:
Sn = 1 + q + q 2 + q 3 + · · · + q n =
1−q n+1
1−q
per q 6= 1
dalla formula precedentemente dimostrata, osservando che Sn é la somma dei
primi n + 1 termini calcoliamo:
1 − q n+1
=
n→+∞ 1 − q
lim Sn = lim
n→+∞
∞
se |q|>1
1
1−q
se |q|<1
se q=-1
non esiste
+∞ se|q|>1
∞ se|q|<-1
cioé la serie diverge positivamente
cioé la serie diverge oscillando
1
cioé la serie converge a 1−q
cioé la serie é indeterminata
Inoltre Sn = n + 1 se q=1 da cui limn→+∞ Sn = +∞ per q=1
1
Riassumendo, la serie converge a a 1−q
se e solo se |q|<1
2.3 Matematica e scacchi, il cavallo
2.3 Matematica e scacchi, il cavallo
Il cavallo é forse il pezzo piú interessante del gioco ed é anche il pezzo
piú signicativo dal punto di vista della matematica. Ma vediamo come si
muove: prendiamo come punto di partenza il cavallo posizionato al centro,
tutte le altre ragurazioni sono le possibli mosse orizzontali e verticvali. In
poche parole il cavallo si muove a L, cioé di 2 caselle in una direzione e di
1 nell' altra(Figura 2.1), oppure possiamo dire che il suo spostamento é in
modulo di 3, escludendo peró i casi in cui uno o l'altro valore di coordinate
siano 0.
Figura 2.1: mossa del cavallo
Adesso analizziamo le proprietá del cavallo, prendiamo una scacchiera
3*3, cioé composta da 9 quadrati. Questa scacchiera, ridotta rispetto alla 8*8, che si usa solitamente per giocare a scacchi, ha molte proprietá
interessanti(Figura 2.2).
Figura 2.2: scacchiera 3*3
17
18
Scacchi, matematica, e calcolo
Vediamo di elencarne alcune. Di sicuro, quando si parla di questa scacchiera, dobbiamo citare Paolo Guarini del 1512, che presentó il seguente
problema:
Dato una scacchiera di dimensione 3*3 e 4 cavalli, 2 neri e 2
bianchi, disposti negl'angoli, invertirne la posizione
Paolo Guarini
Ora risolviamo il problema, abbastanza intuitivamente(Figura 2.3, Figura
2.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
Sempre riguardo al cavallo possiamo valutare le sue mosse in una normale
scacchiera a 64 caselle. Esistono due tipi di percorsi che puó compiere un
cavallo, 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 nel
tenersi il piú possibile vicino ai bordi, ma non é ancora stato creato un
algoritmo per risolverlo.
19
20
Scacchi, matematica, e calcolo
2.4 Matematica e scacchi, il quadrato magico
Ma ancora piú sorprendente é il quadrato magico 3*3, giá conosciuto dai
cinesi. Ha come proprietá che la somma delle diagonali, delle colonne e delle
righe 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 che
corrispondono esattamente alla mossa del cavallo, in eetti lo spostamento
avviene di due caselle in un senso e una nell'altro.
Lo stesso risultato si ottiene collegando fra di loro gli ultimi 3 numeri.
Eettivamente 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
Ma la cosa ancora piú interessante avviene quando proviamo a collegare
fra di loro i primi 3 numeri e gli ultimi 3, come fatto in precedenza, partendo
dal 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, racchiusa dentro la principale.
21
22
Scacchi, matematica, e calcolo
Il quadrato magico ha molte altre proprietá, proviamo a collegare successivamente 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
2.5 Calcolo e scacchi, le mosse possibili
La quantitá di mosse possibili negli scacchi é assai elevata, una piccola
dimostrazione c'é l'ha data la storia, ma vediamo nel dettaglio perché questo
gioco é cosí complesso.
Analizziamo le possibili mosse e soprattutto perché esse non sono innite:
• Per ottenere il numero massimo di mosse, quando tutti i pezzi sono
ancora sulla scacchiera, devo sommare il numero massimo di mosse per
ogni singolo pezzo (cioé 8 per il re, 27 per la regina, 14 per la torre, 13
per l'alere, 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 tutti i pezzi sono ancora sulla scacchiera, devo sommare il numero medio
di mosse di ciascun pezzo (cioé 6,5 per il re, 22,5 per la regina, 14 per la
torre, 8,5 per l'alere, 5 per il cavallo, e 1 per il pedone) per il numero
di pezzi: 6.5 + 22, 5 + (14 ∗ 2) + (8, 5 ∗ 2) + (5 ∗ 2) + (1 ∗ 8) = 92, 5. In
pratica il numero sará peró inferiore, a causa della mancanza di alcuni
pezzi o della illegalitá di alcune mosse di alcuni pezzi, una valutazione approssimata del numero medio di mosse disponibili durante una
partita standard é di circa 40.
• Il numero massimo allle possibili disposizioni che si possono ottenere
sulla scacchiera é dato dal numero di possibili disposizioni dei 32 pezzi
sulle 64 caselle della scacchiera, cioé 6432 1057 .
• Grazie alla regola detta sopra otteniamo un limite alle partite, perché
quando due disposizioni si ripetono esattamente, ció che é successo nel
frattempo non ha piú importanza. Il numero delle possibili partite é
dunque limitato da 1111057 101058 .
• Anche considerando solo partite piú ragionevoli, di 100 mosse e con
una media di 40 mosse possibili ogni volta, si ottiene comunque ancora
un massimo di 10040 = 1080 ,
• Si calcolano oltre 300 miliardi di modi per giocare le prime quattro
mosse e 1030 per giocare le prime dieci mosse.
• Si stima che nell'universo ci sono 1080 atomi.
23
24
Scacchi, matematica, e calcolo
Da questo possiamo dedurre che é impensabile poter analizzare tutte le
mosse degli scacchi.
Ma passiamo ad altro, cerchiamo di risolvere un noto problema: Quante Regine si possono porre sulla scacchiera in modo che non si attacchino
vicendevolmente?
Prima di dare la risposta, facciamo un po di storia. Questo problema ha
origine nel 1848, posto da una rivista tedesca, la Scachzeitung, quesito fatto
da lologo professor Nauck, che lo pose anche a Karl Friedrich Gauss (17771855). Questo matematico cominció a ragionarci con Heinrich Schumacher
(1780-1850). Dopo solo due anni arrivarono alla risposta, senza riuscire a
dimostrarla. Solo nel 1874, ben 24 anni dopo, si riuscí a dimostrare, grazie
all'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 disporre
le regine nella scacchiera in modo che nessuna attacchi l'altra. Di cui solo
12 uniche, infatti ogni soluzione base ne fornisce altre tre per rotazione della
scacchiera e quattro per riessione. Da notare che la soluzione presentata
con il numero 12, che é simmetrica dá origine a sole tre derivate. Ho deciso
di dare i classici nomi alle caselle, come mostrato in questa tabella, in cui la
casella a1 é di colore nero (quindi vista dalla parte del bianco).
a8
a7
a6
a5
a4
a3
a2
a1
b8
b7
b6
b5
b4
b3
b2
b1
c8
c7
c6
c5
c4
c3
c2
c1
d8
d7
d6
d5
d4
d3
d2
d1
e8
e7
e6
e5
e4
e3
e2
e1
f8
f7
f6
f5
f4
f3
f2
f1
g8
g7
g6
g5
g4
g3
g2
g1
h8
h7
h6
h5
h4
h3
h2
h1
2.5 Calcolo e scacchi, le mosse possibili
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 scacchiera(Figura 2.12).
25
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 disporli
nella scacchiera senza che si attacchino a vicenda(gura 2.13). Anche questa
disposizione é interessante, perché si ha il numero massimo di pezzi disposti
nella scacchiera
Figura 2.13: posizione cavallo senza che si attacchino a vicenda
2.5 Calcolo e scacchi, le mosse possibili
Mentre ne bastano solo 12 per coprire tutte le caselle di una normale
scacchiera(gura 2.14).
Figura 2.14: posizione cavallo per coprire tutta la scacchiera
27
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 la
decisione di alcune scelte. Per fortuna in tutti i linguaggi di programmazione
esiste una funzione RANDOM, ma vediamo come potrebbero essere creati
altrimenti. Ovviamente un computer ha oslo un modo per generare numeri
casuali, cioé basarsi su delle formule matematiche. Per denire un numero
casuale dobbiamo valutare che si verichino 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 deve
essere 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 numeri
casuali, in quanto i numeri sono dipendenti fra di loro sato che derivano da
una 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 congruenza
lineare.
Dato un valore iniziale x0 é possibile ottenere una sequenza di numeri
pseudo-casuali applicando la seguente formula:
xi+1 = (a ∗ xi + c)(M ODm)
in cui:
• a é un coeciente intero detto moltiplicatore, positivo
• c é un coeciente intero non negativo detto incremento
• m é un coeciente intero detto modulo, positivo
• xi é il numero di sequenza
• MOD indica il resto della divisione
2.6 Calcolo e la generazione di numeri casuali
Provando a cambiare i coecienti possiamo notare che assegnandogli
particolari 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
29
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, infatti la guerra fredda si giocava in ogni fronte, per dimostrare la potenza
di una nazione rispetto ad un altra, ed in un periodo in cui le innovazioni tecnologiche contavano molto (basti pensare alla bomba atomica, la piú
grande rivoluzione tecnologica o il radar che ha permesso agli americani di
vincere la guerra), dimostrare la potenza in un gioco tattico e di intelligenza
articiale era assai importante. Per non parlare degli eventi mediatici che
seguivano ogni partita fra Americani e Unione Sovietica, su cui non ci soffermeremo molto. In questo capitolo andremo ad analizzare prima la guerra
fredda, raccontandone i principali avvenimenti, successivamente il rapporto
che hanno giocato gli scacchi in questa guerra. Vediamo subito in che cosa
dierisce la guerra fredda rispetto a una guerra normale. Prima dierenza
sostanziale é la non presenza di battaglie: infatti non si combattono scontri
diretti fra eserciti, anche se avviene una corsa agli armamenti, in cui âvinceâ
la nazione che ha piú armi per combattere un'eventuale guerra. La guerra
fredda é stata combattuta non solo attraverso la corsa agli armamenti, fra
Stati Uniti e Unione Sovietica, ma anche a livello informatico, come vedremo
successivamente.
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, poco prima della ne della seconda guerra mondiale. le grandi nazioni ormai
vincitrici si sono messe d'accordo su come spartirsi il mondo. Grecia, Austria, Italia rimanevano sotto l'inuenza degli Anglo-Americani, Romania e
Bulgaria sotto quella sovietica, mentre l' Ungheria, la Polonia e la Jugoslavia
sarebbero state sotto l'inuenza di entrambe le potenze. La Germania venne divisa in quattro zone, di pertinenza sovietica, statunitense, britannica e
francese.
3.2 La Germania dopo la guerra
Come detto in precedenza, la Germania inizialmente fu suddivisa in quattro zone, successivamente in due, una occidentale e una orientale, grazie alla
fusione delle zone inglesi, francesi e americane. Tra l'aprile 1948 e il maggio
1949 le truppe sovietiche chiusero le vie d'accesso alla cittá di Berlino per
costringere gli Americani ad abbandonare la parte ad Ovest della cittá. In
questa occasione la Guerra fredda rischió di trasformarsi in una guerra calda.
Gli Americani crearono la NATO, che impegnava i paesi aderenti alla difesa
reciproca.
3.3 Il piano Marshall
Nel 1947 il presidente Truman decise di osteggiare l'avanzamento del comunismo fornendo aiuti, dal cibo alla moneta, ai governi che fossero stati
messi in dicoltá da movimenti che si ispiravano a quella ideologia. Questo
per bloccare l'avanzamento dell'inuenza Sovietica in un'Europa che doveva
ricostruirsi.
3.4 La guerra fredda
La guerra fredda fra America e Unione Sovietica é stata combattuta su
diversi piani. Uno dei tanti é la concorrenza spaziale, che ha visto le due
3.5 URSS contro America
nazioni combattere per la conquista dello spazio. In un primo momento sembrava vincesse l'Unione Sovietica, successivamente l'America riuscí a ottenere
il primato con la conquista della luna. Altro aspetto é stata la concorrenza socio-economica con la lotta per la conquista delle terre del terzo mondo
(Africa). Un' altra battaglia, indiretta, é stata la crisi cubana, in cui, tramite
un colpo di stato, andó al potere la dittatura di Fulgencio Batista. Successivamente Fidel Castro prese il potere grazie a una rivoluzione popolare. Gli
Americani si sentirono minacciati dal fatto che gli altri stati coloniali avrebbero potuto ribellarsi e cercó perció in tutti i modi di ostacolare Cuba. Per
questo Cuba inizió ad avere rapporti commerciali con l'Urss, che diventó il
primo acquirente di zucchero prodottao dall'isola. Successivamente stabilirono una relazione di alleanza politica. L'America rispose bloccando i rapporti
commerciali con Cuba. Questa tensione rischió di trasformarsi in conitto
aperto durante la âcrisi dei missiliâ tra l'Urss e gli Usa. Altri fatti molto
rilevanti furono quelli che riguardarono le due Coree, in cui le due superpotenze si collocavano in aiuto delle due parti in lotta, rispettivamente a Nord
l'Unione sovietica e al Sud l'America. Inne la guerra in Vietnam: come
in Corea le due potenze si sdarono indirettamente, formando un governo
comunista al Nord del Vietnam, mentre un governo piú lo-occidentale al
Sud.
3.5 URSS contro America
Abbiamo appena visto la situazione generale del mondo dopo la seconda
Guerra Mondiale, parlando della guerra fredda e dei rapporti tra Urss e America. Ora vedremo, piú approfonditamente come gli scacchi siano stati una
forma di scontro e di incontro tra le due nazioni, raccontando le tappe storiche della sda scacchistica. Fino al 1972 era l'Unione Sovietica a detenere
il titolo del campione del mondo degli scacchi e le partite che si disputavano
erano un'occasione di incontro tra le due nazioni, oltre ad essere una sorta
di sda mondiale. A quel tempo era Spassky il campione del mondo, un
Russo, ncheé Fischer, un americano, lo batté conquistando il titolo. Una
pesante scontta per i russi e per Spassky che non riuscí mai a tornare ad
altissimi livelli. Per i tre anni successivi i russi cercarono un giocatore in
grado do spodestare Fischer. Nel 1978 Fischer fu chiamato a difendere il
titolo contro Karpov, anch'esso un russo, ma riutó consegnando al russo il
titolo a tavolino. Un altra sda fra le due nazione a livello scacchistico fu
33
34
Storia, scacchi e la guerra fredda
disputata non dagli essere umani ma dai calcolatori. 1 In entrambe le nazioni, i militari hanno nanziato delle ricerche sulla teoria dei giochi e sullo
sviluppo di giocatori articiali, quindi sull'intelligenza articiale. Il primo
programma funzionante é del 1956 (fatto da Los Alamos Labs), anche se in
una scacchiera 6 x 6 (mancavano gli aleri). Al MIT, a CMU e a Stanford
sono sta creati i primi programmi completi (1958-64). Nel 1967, una macchina sovietica (a Mosca) sconsse 4-0 una macchina americana (a Stanford)
giocando per corrispondenza, cioà attraverso uno scambio di messaggi. Da
notare l'anno, 1967, proprio nel periodo âcaldoâ della guerra fredda. Viene
facile la supposizione che non si tratti solo di semplici partite di scacchi fra
una nazione e l'altra, solo per dimostrare la bravura degli stessi, ma che si
tratti di una vera e propria dimostrazione di forza. Ai giorni d'oggi si parla
molto spesso di missili intelligenti, ma giá allora le ricerche dei militari si
sono spostate su questo percorso. Possiamo quindi valutare questa semplice
partita come una vera e propria battaglia. Solo nel 1994, alcuni programmi
commerciali (tra cui Fritz3 e Genius) hanno battuto in alcune partite brevi il
Campione del Mondo (Kasparov). Nel 1997, Deep Blue della IBM ha battuto
di misura il Campione del Mondo (Kasparov) in un torneo-match regolare.
1 fonti:http://www.chessbase.com/newsdetail.asp?newsid=5153,http://en.wikipedia.org/wiki/Kaissa
Capitolo 4
Informatica, intelligenza articiale
Introduzione
In questa parte parleró dell'intelligenza articiale. Prima di cominciare a
discuterne é meglio denirla. Perché ci sono diversi punti di vista.
Con il termine intelligenza articiale (o IA, dalle iniziali delle
due parole, in italiano) si intende generalmente l'abilitá di un
computer di svolgere funzioni e ragionamenti tipici della mente
umana.
Wikipedia
Questa é una citazione presa dalla nota enciclopedia online Wikipedia dell'intelligenza articiale, in cui viene denita come l'abilitá di un calcolatore
nello svolgere funzioni e ragionamenti tipici della mente umana. Abbiamo
capito che parlando della IA ci si riferisce ad un calcolatore, ma quali sono i
ragionamenti tipici della mente umana?
Un risposta a questa domanda la possiamo trovare grazie ad Alan Turing
ed ad un suo articolo pubblicato nella rivista Mind nel 1950 (quindi non molti
anni fa). 1
Can machines think?
Alan Turing
1 fonte:
http://www.loebner.net/Prizef/TuringArticle.html
36
Informatica, intelligenza articiale
Con questa semplice domanda Alan vuole denire cos'é l'intelligenza articiale. Cioé la capacitá di pensiero e di ragionamento delle macchine, quindi
solo quando un uomo compiendo una qualsiasi azione con una macchina non
si accorgerá che essa é una macchina si puó dire che questa é intelligenza
articiale.
Appena pubblicato questo articolo Arthur Samuel presentó il suo programma per giocare a dama. La cosa eccezzionale di questo programma
era che il computer riusciva ad imparare giocando con altre persone, quindi
riusciva a risolvere problemi legati all'intelligenza umana.
Si puó dire che l'intelligenza articiale sia stata inventata? No, perché il
test di Touring, presentato sopra, é stato piú volte sistemato e corretto, e,
forse, neppure ai nostri giorni l'intelligenza articiale é stata scoperta.
A questo punto é meglio fare un po di chiarezza, facendo una suddivisione
dell'intelligenza articiale:
• intelligenza articiale forte
• intelligenza articiale debole
Cominciamo parlando della piú semplice, l'intelligenza articiale debole.
Cioé che un computer non riuscirá mai ad eguagliare la complesitá della
mente umana, ma potrá solo simularla, cosa assai diversa simulare, da essere
uguali. Al giorno d'oggi, e credo ancora per molti e molti anni, é questa
l'intelligenza articiale predominante. Infatti un computer é stato istruito
a comprendere e a risolvere certe cose, ma non é ancora in grado di capire
realmente cosa sta facendo.
L'intelligenza articiale forte, forse é quella denita da Alan Touring,
dove un computer é realmente in grado di pensare. Cioé le macchine sono
realmente in grado di prendere conoscenza della loro esistenza.
Quindi noi parleremo d'ora in poi dell'intelligenza articiale, intesa come
intelligenza articiale debole.
Ora che abbiamo ben denito cosé l'intelligenza articiale, passiamo ai
vari metodi per crearla.
4.1 Metodi di intelligenza articiale
4.1 Metodi di intelligenza articiale
Introduzione
Per parlare dei vari metodi di intelligenza articiale ci appoggiamo al
gioco preso in esame in questa relazione: il gioco degli scacchi. Primo passo
é vedere se serve intelligenza per giocare a scacchi. Se un giocatore muove
a caso possiamo dire di no, dato che basterá seguire quelle semplici regole
di limitazione delle mosse. Ma se cominciamo a mettere il sapersi difendere,
l'attaccare o molto altro allora possiamo dire che giocare a scacchi equivale
ad 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 il
guadagno della mossa. Infatti, se facendo quella mossa il computer passa
in vantaggio o riduce il suo svantaggio vuol dire che quella mossa é buona.
Se invece, facendo quella mossa il computer passa in svantaggio o comunque
perde punti, vuol dire che non deve fare quella mossa. Per valutare il vantaggio o lo svantaggio basta applicare dei punteggi ai vari pezzi e ricalcolarli ogni
singola 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á inecace, dobbiamo
invece andare piú in profondita, valutando in modo ricorsivo la mossa dell'avversario, poi da quella valutare la nostra possibile mossa, cosí facendo,
se nel primo controllo avremmo dovuto vedere solo 40 mosse circa, nel secondo controllo dobbiamo valutare sempre 40 mossa, ma per ogni mossa, il
che equivale a 40*40 che é uguale a 1600 possibili mosse. Un'ottimizzazione
di questo algoritmo potrebbe essere il salvataggio in memoria dei rami che
potrebbero ancora essere utilizzati.
37
38
Informatica, intelligenza articiale
4.1.2 Metodo Database
Questo metodo non é proprio un metodo capace di reggersi da solo (al
momento), data la quantitá delle possibili partite, ma potrebbe essere utilizzato assieme al metodo MinMax. Infatti basterebbe salvare in un database
tutte le partite o alcune situazioni strane, in cui, se il computer si trova in
quel caso, sa di dover fare quella mossa. Questa scelta é tornata utile nella
storia2 (come nel match fra Kasparov, il campione mondiale e Deep Blue
dell'IBM), infatti, sono stai molti i casi in cui un computer, giustamente, valutava migliore una mossa, non vedendo possibilitá di scacco matto, ma una
serie di mosse dell'avversario l'avrebbero portato inevitabilmente in quella
situazione in cui perdeva (da ipotizzare che la mossa non era prevedibile,
perché troppo avanti o poco probabile per il computer). per cui, metendo
un database che dice che in quel caso deve fare quella mossa, il problema si
risolve.
4.1.3 Come pensa un computer
Fino ad adesso abbiamo analizzato i metodi dell'intelligenza articiale,
ma cosa fa un computer e come pensa un computer durante la'pplicazione
di questi metodi? Come fase iniziale voglio mostrarvi la rappresentazione
graca della valutazione dell'algoritmo MinMax, lo faró grazie ad un ottimo
programma, scritto in java, che si trova in internet e che mostra gracamente,
mediante delle linee le mosse che il computer pensa.3
Figura 4.1: come pensa un computer
Ma questo algoritmo risulta completamente inecace messo in pratica.
Infatti, non é contemplato lo scacco matto e la difesa dallo scacco matto. Quindi devo implementare delle semplici modiche a questo algoritmo.
Inserendo prima dei controlli, nel seguente ordine:
2 fonte:
3 fonte:
http://it.wikipedia.org/wiki/IBMD eepB lue
http://turbulence.org/spotlight/thinking/chess.html
4.1 Metodi di intelligenza articiale
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 dicoltá particolari in quanto basta comunque
analizzare tutte le possibili mosse e vedere se una é vincente.
Il secondo punto diventa un po' piú problematico, infatti posso facilmente
rilevare la possibilitá di uno scacco matto, valutando tutte le mosse, ma devo
anche valutare una mossa che mi possa difendere ecacemente, quindi ad
ogni mossa per la difesa devo riutilizzare l'algoritmo MinMAx per valutarne
l'ecacia.
Il terzo punto é giá stato spiegato e, anche se é la parte meno importante
del gioco, dato che non si perde e non si vince, é il piú utilizzato e quello da
cui dipenderá tutta la partita.
4.1.4 Implementazione dell'intelligenza articiale
L'algoritmo piú ecace da me utilizzato é stato quello del minmax. Ho
assegnato ad ogni pezzo un punteggio, 9 per la regina, 5 per la torre,3 per
per cavallo ed alere 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 pezzi
ancora presenti, se quella mossa gli porta a guadagnare punti allora la valuta
come buona. Se dovesse trovare una mossa migliore di questa compie sempre la migliore. Ovviamente se puó dare scacco matto valuta quella mossa
la migliore, solo se le mosse da fare per farlo sono solamente una. Questo
ragionamento di valutazione della mossa puó essere idealmente valutato all'innito, 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 mossa
che potrebbe portarci meno perdite, ma nel caso non se ne venga a capo
siamo costretti a fare una mossa casuale.
39
40
Informatica, intelligenza articiale
Capitolo 5
Sistemi, socket
Introduzione
Il socket é una tecnica che ho utilizzato per implementare il gioco online
fra due giocatori. Vediamo cos'e il socket. Il socket é una tecnica di comunicazione usata per creare una comunicazione fra due pc. La connessione
viene identicata dalla coppia dei socket, uno server e uno client, chiamata
coppia di socket. Dato che in un pc ci possono essere piú socket ho bisogno
di identicare l'applicazioni che ha eettuato la richiesta, per questo uso le
porte, che sono numeri a 16bit, che hanno valori da 0 a 65.635, di cui i primi
1.023 sono giá assegnati. Il protocollo TCP da me utilizzato é connesso e
adabile, vediamo cosa accade al momento di stabilire una connessione. I
due pc contrattano la dimensione massima dei segmenti, decidendo di utilizzare la dimensione minore delle due. Se un dispositivo nel percorso fatto dal
segmento TCP scarta lo stesso allora questo dispositivo avvisa il mittente
dell'accaduto che si occuperá di diminuire la dimensione. Il segmento TCP
é cosí formato:
2 byte Source Port, che contengono il numero di porta del mittente
2 byte Destination Port, che contengono il numero di porta del destinatario
4 byte Sequence number, che contengono il numero di sequenza del primo
byte di dati contenuto nel segmento
4 byte Acknowledgement number, che contengono il numero di sequenza del
prossimo byte atteso
4 bit Header length, che indicano da dove iniziano i veri dati nel segmento
6 bit usati come ag,
URG, usato per indicare che il segmento contiene dati urgenti, quindi da
42
Sistemi, socket
consegnare imemdiatamente
ACK, usato per confermare i dati ricevuti
PSH, usato per indicare dati da consegnare subito, senza doverli mettere nel
buer
SYN, usato per l'apertura di una connessione
FIN, usato per chiudere una connessione
2 byte Window size, usati per gestire il controllo i usso
2 byte Checksum, usati per la parola di controllo, per vericare la correttezza
del messaggio ricevuto
2 byte Urgent pointer, viene usato per indicare fra quanto iniziano i dati
urgenti, se il bit URG é settato a 1
Vedremo 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 linguaggio di programmazione per ambienti Unix. La scelta é caduta su questo
programma perché permetteva una gestione graca per la creazione del gioco degli scacchi, in modo semplice, con il classico metodo oerto dal famoso
Visual Basic, permette anche di usare la shell linux con un semplice comando
ed ha una vastitá di comandi per la programmazione, unico difetto é che é un
linguaggio interpretato, per cui risulta un pochino piú lento del normale. La
scelta é ricaduta su Gambas perché é un linguaggio di programmazione che
funziona su sistemi operativi linux, piú sicuri e stabili. Non ho scelto linguaggi di programmazione tipo java perhcé esso risultava, olte che molto lento,
inadatto per il lavoro che volevo svolgere, infatti la gestione dell'interfaccia
era molto piú problematica per non parlare della dicoltá delle operazioni
di input/output, inoltre java avrebbe dovuto essere preinstallato sul sistema operativo, per far funzionare il programma, mentre questo linguaggio di
programmazione 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 di
utilizzo di Visual Basic.
Gambas é un acronimo ricorsivo che deriva da Gambas Almost Means
BASic che tradotto suona come Gambas piú o meno signica 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 bytecode, un codice che dovrá poi essere programmato.
L'IDE di Gambas (che é scritto in Gambas) favorisce la creazione in maniera 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
6.1 Feature implementate
In questa parte descriveró molto brevemente tutte le feature implementate 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 é nita
Se metti il tuo re sotto scacco non puoi
Controllo scacco matto
Mostra caselle partenza e arrivo
Mostra pezzo selezionato
Annulla mossa se si clicca nella stessa casella
Arrocco, se non ho mosso i pezzi interessati e se il re non é sotto scacco
Partita patta se non ha mosse legali
Partita patta se i pezzi non sono sucienti per concludere la partita
Salvataggio e caricamento partita con un le di testo
Gioco online con chat.
Salvataggio in un database dei dati relativi alle vittorie e scontte di un giocatore, con relativa visualizzazione tramite un graco.
Visualizzazione tesina dal programma.
Visualizzazione video dal programma.
Gioco contro il pc.
45
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 serie
di 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 eettuo 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 casella
vuota, salvo il pezzo, modico il colore della cella di sfondo ed inne assegno
l'immagine vuota alla cella, per non mostrare il pezzo che devo muovere.
Nel secondo caso, controllo che non abbia cliccato nella stessa casella, se
fosse cosí annullerei la mossa, controllo se quella cella contiene un pezzo
mio, se fosse cosí do mossa illegale, e riprenderei sempre dalla scelta di dove
posizionare il pezzo, controllo se la mossa fatta é consentita, come spiegato
per ogni singolo pezzo successivamente, controllo se il re mio é sotto scacco,
se é cosí la mossa é illegale, come spiegato meglio successivamente. Se la
mossa é 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, cambio
giocatore. Quindi ottengo la scacchiera con la matrice modicata e anche
con i pezzi spostati giusti.
6.3 Spostamenti
6.3 Spostamenti
Introduzione
La prima cosa da implementare sono gli spostamenti, quindi devo controllare ogni singola mossa e valutarne la correttezza o meno. Se la mossa é
corretta posso farla, se é vietata non do il permesso.
47
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 si
vede dal disegno (il cavallo al centro é quello di partenza) Il cavallo é, forse,
il pezzo piú semplice, perché puó saltare gli ostacoli, quindi basta controllare
che nella cella di destinazione non ci siano oggetti, se ce ne sono devono essere
avversari, poi basta controllare che la mossa sia giusta, cioé a L. Analizzando
le mosse si puó notare che la dierenza fra le coordinate del primo asse,
in valore assoluto, sommata alla dierenza delle coordinate dell'altra asse,
sempre in valore assoluto, é sempre 3. Questo funziona per tutte le possibili
mosse. Ma, peró, se muovo di tre caselle nella stessa direzione, avró sempre
il modulo della dierenza = 3, per cui dovró controllare che la dierenza, in
modulo, 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 dierenza del cavallo non puó saltare pezzi, quindi dovró tener conto di
questa dicoltá in piú. Per risolvere il problema, controllo prima di tutto la
cella di destinazione. Se c'é un pezzo mio la mossa non é valida, se il pezzo é avversario, posso continuare a controllare. Controllo se lo spostamento
avviene 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 in
verticale, se no in orizzontale. In entrambi i casi, controllo se nella successiva 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é la
destinazione l'ho giá controllata e so se posso andarci o no. Quindi se non
trovo pezzi lo muovo.
Figura 6.2: mossa della torre
50
Programmare un gioco di scacchi da 0
6.3.3 Mossa dell'alere
L'alere si muove in obliquo. Cioé fa tanti passi nell'asse x quanti nella
y. Da notare, che se parte nella casella nera, non la cambierá mai (infatti ce
n'é uno nero e uno bianco). Come potete vedere dall'immagine. Il controllo
é simile alla torre, con la sola dierenza che devo controllare che il valore
assoluto dello spostamento sia uguale sia nell'asse x che nell'asse y, come
nella torre devo controllare che non ci siano ostacoli, devo sempre prima
controllare il pezzo nale .
Figura 6.3: mossa dell'alere
6.3 Spostamenti
51
6.3.4 Mossa della regina
La regina si muove sia in obliquo sia in verticale e in orizzontale. Osservazioni: é come l'alere o come la torre. Essendo alere piú torre puó
cambiare colore. Come si vede dall'immagine. L'implementazione é stata
d'avvero semplice, é bastato richiamare il controllo della torre, se non andava bene, quello dell'alere e se non andava bene neppure quest'ultimo allora
il 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. Come
si vede nell'immagine Il modo piú semplice per implementarlo, e per fare la
ricerca piú semplice, quindi occupare meno tempo, non é quello di fare come
la regina, cioé controllare le celle limitandosi alla prima, ma, forse, é quella
di fare il controllo manualmente, cioé fare gli otto casi uno alla volta, con
degli 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 solo
di una cella per volta, cioé se parte nella cella A rimana nella cella A per i
suoi spostamenti. Se non é mai stato mosso si puó muovere di due, solo la
prima volta. Se ha un pezzo davanti non puó mangiarlo, quindi deve stare
fermo. Puó mangiare solo un pezzo nella sua diagonale destra o sinistra,
purché davanti a lui. Come mostra l'immagine. Se la mossa é del bianco
allora la coordinata successiva deve essere piú 1, se é in b=2 cioé non é mai
stato mosso allora la coordinata successiva puó anche essere piú 2, se ha un
pezzo avanti non si muove. Se ha un pezzo avversario a destra o a sinistra e
in 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 dell'avversario si puó tramutare in regina, alere, torre o cavallo. Quindi quando
arriva 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 farlo
non é mai stata mossa. Come si vede nell'immagine. Per implementarlo
ho usato una semplice variabile numerica. Ho messo a 0 l'inizio, a 1 se era
mossa una torre a 2 se era mossa l'altra e a 3 se era mosso il re. Quando
muovo il re metto la variabile a 3, se muovo la torre la metto a 1 o 2. Ogni
volta che muovo il re controllo. Se lo muovo a destra di due allora controllo
la variabile, se é diversa da 1 o 2 allora metto vuoto nella cella del re, sia
graca che matrice, come nella torre, e metto sia graca sia matrice il re e la
torre come in gura. Poi setto la variabile a 3, cosí non rischio.
Figura 6.7: arrocco
6.4 Scacco
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 questo
caso la partita é nita, il secondo caso é il normale scacco, quando il re viene
minacciato di essere mangiato ma puó ancora salvarsi. Un' altra cosa da
analizzare é 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, per
controllare questo basta solo che richiami la funzione che valuta se é scacco.
55
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 pezzo
avversario che lo puó mangiare.
Quando controllo la validitá della mossa, se é vera, dopo aver salvato il
movimento , controllo se il re é sotto scacco o se si é messo sotto scacco da
solo. Nel caso sia falso, cioé il re non é sotto scacco lascio cosí. Nel caso sia
vero allora do mossa falsa e rimetto tutto a posto.
Dierenzio mossa del re con una di un altro pezzo. Finché non sono
all'ultimo pezzo controllo, se sono alla ne della scacchiera mi fermo. Se nei
pezzi della mia direzione ho un pezzo mio o avversario che mi salva allora
mi fermo e do mossa consentita, se no, invece, controllo se é un pezzo che
mi da problemi (vuoto va bene, ma non mi salva), se mi da problemi allora
metto 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 non
tornare, dato che se ho un pezzo che mi salva o uno che mi mangia, subito,
non serve sapere cosa ho dopo. La dierenza fra la mossa del re e non del
re sta nel fatto che nella prima controllo le coordinate nali, mentre nella
seconda, quelle del re, perché se non faccio cosí non posso avere i controlli
che 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 pedone
nemico in posizione re piú uno a destra o sinistra allora é lo stesso sotto
scacco. Re: non posso muovere il re se nelle coordinate di movimento ho il
re avversario. Cavallo: non posso muovere il re se ho il cavallo che mi da
scacco in quella posizione
Dicoltá re, pedone e cavallo: Devo controllare la posizione del re, per
controllare che non vada fori dalla scacchiera. Quindi se sono in cella A1
non devo controllare, ad esempio, per il cavallo, se é a sinistra o in basso,
quindi devo fare molti controlli sulle posizioni, perché altrimenti avrei come
errore Out of bonds, dato che controllerei celle inesistenti. E' un po come
il controllo precedente, solo che li avevo meno possibilitá per il controllo di
uscita.
Soluzione cavallo e re: mentre per il pedone ho solo 3 possibilitá (destra
occupata, il resto libero, sinistra occupata, il resto libero, tutto libero) per
il 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
un posto fuori dalla scacchiera non da problemi. Questa tecnica mi permette
di risparmiare nel tempo di esecuzione (parzialmente e non sempre) sia nella
lunghezza del codice. L'aspetto negativo é che non posso gestire il singolo
errore che mi interessa, ma gestisco tutti gli errori. Per questo, questa parte
di codice é stata molto controllata per quanto riguarda gli errori
57
58
Programmare un gioco di scacchi da 0
6.4.2 Scacco matto
A dierenza di quello che si puó pensare la dicoltá non sta nella lunghezza del codice, ma nel lavoro per ottenerlo. Difatti, logicamente, la soluzione
é semplice e banale, perché non devo fare altro che fare ogni possibile mossa
e vedere se in almeno un caso mi salvo. Se mi salvo allora non sará scacco
matto. Le prime dicoltá si sono presentate per il re. Infatti il normale
controllo non va bene, quindi controllo se ho é in quasi scacco matto (cioé si
puó salvare solo muovendosi lui) controllo ogni possibile mossa (alto, basso,
destra...). In ognuna di queste vedo se posso muoverlo lí (ho dato i valori
regolari io, ma puó uscire dalla scacchiera e puó esserci un mio pezzo) inne
controllo se c'é ancora scacco. Altra dicoltá é stato il pedone, solo nella
parte nale. Infatti ho messo la scelta se si muove nell'ultima casella. Basterá quindi copiare il codice rimuovendo quella parte. Peró devo conteggiare
che virtualmente i pezzi li muovo, ma usando le stesse procedure é come se
li muovessi veramente, quindi, ad esempio, l'arrocco mi si annulla al primo
scacco. Quindi, anche in questo caso, devo solamente copiare il movimento
eliminando quella parte. Riassumendo: controllo se il re si salva muovendosi, se non é cosí allora faccio ogni possibile mossa, copiando la scacchiera e
modicandola e poi la ripristino, se la mossa é legale allora controllo se sono
sotto scacco se é illegale non lo faccio. Preferisco fare i controlli perché fare
i 4 cicli analizzando sempre mossa e scacco occuperebbe un secondo, tempo
notevole 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
6.5 Patta
Introduzione
Esistono molti tipi di patta nel gioco degli scacchi. La patta per mancanza
di mosse, la patta per posizione morta, la patta per accordo, la patta per
ripetizione di posizione e la patta per la regola delle 50 mosse. La patta per
accordo in motli tornei non vien piú contata, perché svuotava di bellezza il
gioco, quella per ripetizione di posizione é molto facile da fare, basta salvare
ogni posizione e controllare ogni volta se é uguale alla precedente, se lo é
incremento il contatore di quella posizione se no ne creo una nuova, quando
arrivo a tre é patta, ma ho deciso di non implementarla dato che occupa
troppo spazio in memoria (ricordo il 1080 possibili partite) e troppo tempo
inutile per il controllo.
59
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 allora
metto 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 ho
abbastanza 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á quindi
controllare 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 la
mossa é legale riporto a zero il contatore, se no lo incremento, arrivato a 50
mosse é patta.
6.6 Salvataggio e caricamento di una partita
6.6 Salvataggio e caricamento di una partita
Introduzione
Il poter riprendere una partita in un secondo momento puó essere motlo
utile, ecco perché ho implementato la funzione di salvataggio e caricamento
di una partita.
6.6.1 Salvataggio
Per il salvataggio della partita ho utilizzato un le di testo, ho inserito i
valori dell'arrocco, per sapere se posso farlo oppure no, il turno e la disposizione nella scacchiera, salvando per ogni riga un pezzo con il suo nome e
vuoto 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 identicati da delle lettere
univoque, allora li prendo e li salvo nella loro variabile. Una volta separati
questi valori non consoni dal le sono sicuro che tutto il resto sia della scacchiera, quindi con un ciclo fatto a mano salvo nella scachciera tutti i pezzi.
come é abbastanza intuibile ad ogni nuova riga metto un valore nella scacchiera incrementando la riga, poi alla ne delle righe incremento la colonna,
nché non arrivo alla ne del le. Dopodiché devo sistemare le immagini dei
pezzi nella scacchiera, in cui, per ogni singola posizione, controllo che pezzo
c'é, e poi, lo visualizzo.
61
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 é impossibile non inserire un elemento di comunicazione fra i vari utenti. Ecco
perché ho deciso di implementare una tecnologia capace di far interagire gli
utenti 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. Questa
scelta é stata quasi obbligata, in quanto le altre alternative risultavano difcilmente ecaci. Infatti avevo pensato di utilizzare l'ftp, cioé attraverso
uno scambio di le e il supporto di hosting esterno i due giocatori potevano
scambiarsi le informazioni del gioco. Purtroppo per caricare un le solo testo,
anche di esigue dimensioni, ci metteva parecchio tempo, circa 30 secondi, senza contare che avrei dovuto fare un loop per scaricare il le che l'avversario mi
mandava. Ho anche implementato questa soluzione, il tempo per una mossa
era 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 a
me, ottenevo un le non corretto, con una parte mancante. Il secondo metodo si basava sull'uso dei database, ma nessun hosting permetteva l'accesso
ai database da esterni. Infatti per poter accedere ad un database bisogna o
avere il programma nello spazio che puó accedere al database oppure dare
il permesso al programma di accesso. bastava modicare un paramentro nel
le di congurazione, ma nessun hoating lo lascia fare. Pensarlo di fare in
locale é assurdo, data la poca banda a disposizione e il danno che causerei
alla sicurezza della mia rete. Quindi l'ultimo metodo rimasto era l'utilizzo
del socket.
6.7.1 Socket, spiegazione
Prima di spiegarvi come ho implementato a livello logico il socket voglio
spiegare cos'é il socket. Il socket é un'applicazione client/server, cioé un'applicazione distribuita, con un'applicazione server che ore dei servizi e una
client che gestisce l'interfaccia con l'utente e richiede questi servizi. Il client
deve conoscere l'indirizzo IP del server per richiedere il suo utilizzo.
Per ovviare a questo inconveniente ho deciso di appoggiarmi a dei le di
testo e al php.
6.7 Gioco online
6.7.2 Funzionamento del socket nel programma
Per connettere due pc attraverso la tecnica del socket ho deciso di avviare
in ogni pc un server e un client. Dato che il client non puó ricevere dati e
il 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 e
della porta usata. Primo passo del socket é la creazione del server, grazie
ai paramentri scelti precedentemente e descritti sopra. Una volta creato il
server si mette in ascolto. Appena sente che un client fa la sua richiesta
l'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 li
legge e poi li elabora. Il client puó decidere quando vuole disconenttersi dal
server. 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, come
nel server, bisogna impostare il tipo di connessione (TCP), l'indirizzo IP del
server e la porta utilizzata dal server. Una volta creata questa connessione
il client puó inviare i suoi dati. Puó decidere quando vuole chiudere la connessione. Ovviamente, nel caso in cui non esista l'host, dopo 10 secondi di
ricerca 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 succede
fra la connessione e la disconnessione. Una volta avviato il server il client si
connette ad esso, ed invia i suoi dati. Alla connessione i giocatori scelgono
se 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 allora
passerá all'avversario la mossa, mandando una stringa che é composta come
segue:
63
64
Programmare un gioco di scacchi da 0
chiave che identica la mossa coordinate partenza (coppia x e y) coordinate
arrivo (coppia x e y) pezzomosso
il server, é sempre in ascolto, legge questa stringa, identica che é una mossa
e sistema la scacchiera, nello stesso modo in cui avviene il caricamento della
partita, descritto sopra. Davanti ai dati importanti c'é una chiave identicativa, questo perché ogni giocatore puó anche chattare con l'avversario e
quindi bisogna dierenziare le due cose. Inoltre, siccome ogni controllo viene
fatto da chi eettua la mossa, l'avversario non controllerá mai se ha subito
scacco matto o la partita é in patta, per cui gli viene inviata una stringa, nelle
modalitá prima descritte, che annuncia la ne della partita. Un caso particolare é l'arrocco, in quanto i pezzi mossi sono due, quindi al controllo della
stringa, se ho uno dei quattro casi in cui c'é stato arrocco, devo aggiornare
gracamente e anche nella matrice la posizione della torre (dato che quella
del re é giá stata sistemata). Una volta completata la mossa, e quindi inviati
i 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 una
mossa eettuata dall'avversario.
6.7.6 Implementazione
Tutti le informazioni, sopra descritte, per connettersi all'avversario sono
tante per un utente che non conosce nulla. Ecco perché ho fatto una semplice
interfaccia graca, che non fa altro che richiamare le funzioni del client e del
socket, con la possibilitá di connettere il server e il client inserendo semplicemente la porta e l'ip dell'host. La porta di default é la 32340, solitamente
non serve modicarla. Quindi all'utente non resta che inserire l'indirizzo dell'host. Si ricorda che nel caso di un gioco in una rete lan basta l'indirizzo
dell'host vero e proprio, mentre nel caso si parli di un gioco attraverso internet, 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 conoscere l'ip dell'avversario. Questa soluzione peró non si presentava come
ottimale, in quanto i due giocatori avrebbero dovuto conoscersi in precedenza 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, alla
richiesta di connessione l'host accede a una pagina php che alla sua visita
aggiunge l'ip ad un le di testo. Poi si mette in ascolto sul server. Appena
un altro host si connette accede a questo le di testo, se à vuoto fa come il
precedente se no si connette all'avversario inviando il suo ip. A questo punto
entrambi gli host eliminano il proprio ip dal le di testo.
aggiunta di un ip con il php
(Il codice é in pseudocodica)
Ecco il codice utilizzato:
<?php
fp = fopen(leip.txt, a); //apertura del le per aggiunta
mioip = getenv(REMOTEADDR); //prendo l'ip
fwrite(fp, mioip.n); //lo scrivo nel le
fclose(fp);//chiuo il le
echo 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 sta
per 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 un
percorso.
ip = getenv(REMOTEADDR);
con questa istruzione assegno alla variabile ip lâip del navigatore, che lo
ottengo 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 n
che signica 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 tutto
correttamente, anche se la maggioranza delle volte omettendola non cambia
nulla, 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 array
e scrivo nel le tutti gli ip diversi dal mio. Ecco il codice:
6.7 Gioco online
<?php
array = array();//creo un array dove salvo gli ip
fp = fopen(leip.txt, r+);//apro il le per lettura e scrittura
while (!feof(fp)) //ciclo nchà non legge tutto il le
buer = fgets(fp, 4096);//legge la riga
array[] = buer;//aggiungo la riga all'array
fclose(fp);//chiudo il le
le = leip.txt;
unlink(le);//cancello il le
if (!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 array
mioip = getenv(REMOTEADDR);//prendo l'ip
for(i=0;i<conta;i++) //scorro tutto l'array
if (array[i]==mioip.n) //se e' il mio ip allora non lo scrivo
echo (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 le
fclose(fp);//chiudo il le
?>
67
68
Programmare un gioco di scacchi da 0
6.8 Installazione
Il programma si presenta facilmente installabile. Basterá infatti fare un
semplice doppio click nel le, inserire la password dell'amministratore (sempre necessaria per le installazioni) e automaticamente verrá installato il programma. Basterá poi andare in Applicazioni>Giochi> scacchi per avviare
il programma. Dato ch il programma usa delle immagini in modo dinamico,
per la rappresentazione dei pezzi sará necessario copiare una cartella nella
propria home. Nel caso l'utente se lo dimentichi o cancelli quella cartella,
una semplice interfaccia graca gli dirá di copiare quella cartella, oppure
mediante un semplice click potrá scaricare direttamente da internet i le, e
imemdiatamente si avvierá il gioco.
Sará possibile installare il programma in tutti i sistemi operativi linuxlike, mediante il pacchetto sorgenti, e nei piú comuni sistemi operativi gnu/linux,
quali: fedora, ubuntu, mandriva, slackware, debian, opensuse, tramite il loro semplice pacchetto d'installazione predenito (quindi facendo un semplice
doppio click per l'installazione). Il programma sará disponibile sia per la versione a 32bit sia per quella a 64 bit, cioé ottimizzata per i multiprocessori, in
modo 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
6.9 Realizzazzione della scacchiera
Ho giá descritto il ragionamento logico per implementare tutte le regole del gioco, ma devo ancora descrivere come ho realizzato la scacchiera e
la visualizzazzione dei pezzi. Per realizzare la scacchiera ho utilizzato delle
picturebox, cioé della caselle di immagini. Ho disposto le 64 caselle a colori
alterni, cosí come é fatta una scacchiera e assegnato ad ognuna di esse il loro
nome. Al caricamento del gioco ad ogni casella viene aggiunta un'immagine,
mediante l'evento picture.load (ecco perché é necessario avere le immagine
nella propria home, se no non sa da dove prenderle), caricando ogni singola
immagine in ogni casella, dato unn'immagine vuota alle caselle vuote. Ovviamente le immagini sono senza sfondo, cioé con lo stesso trasparente. Cos'i
facendo l'utente potrá anche personalizzare le immagini dei pezzi come vorrá.
La necessitá di inserire l'immagine vuota é dovuta al fatto che quando sposto
un pezzo, nella cella di destinazione vado a sostituire l'immagine con quella
del pezzo spostato, mentre, nella cella di partenza devo levare l'immagine, e
l'unico modo é sostituirla con una vuota.
69
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 messaggio
nella 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 suono che simula il movimento del pezzo, mentre con l'evnto play riproduco il
suono.
6.11 Statistiche con Database
6.11 Statistiche con Database
Introduzione
Utilizzare un le di testo per salvare una grande massa di dati, quali
le statistiche risulta controproducente e poco gestibile, per cui ho deciso di
utilizzare un database.
6.11.1 Salvataggio dei dati
Per salvare i dati gestisco tutto da codice, vediamo come:
TRY hConn.Close
hConn = NEW Connection
sName = scacchi
WITH hConn
.Type = mysql
.Host = localhost
.Login = textbox6.Text
.Password = textbox7.text
.Name = END WITH
hConn.Open
IF NOT hConn.Databases.Exist(sName) THEN
hConn.Databases.Add(sName)
ENDIF
hConn.Close
hConn.Name = sName
hConn.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 riesce
allora esiste giá un database e salto al passaggi osucessivo, se non riesce creo
il database e poi vado alla procedura per creare le tabelle, come mostrato
qui sotto:
71
72
Programmare un gioco di scacchi da 0
hTable = hConn.Tables.Add(dati)
hTable.Fields.Add(id, db.Serial) 'identicativo univoco, autoincrementato
ogni volta
hTable.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, solo
se non giá presente. Per inserire i dati all'interno del database utilizzo la
funzione:
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é un
comando 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 graca, piú facilmente consultabile. Per fare questo ho utilizzato la funzione Draw, disegnando, in
base ai dati prima raccolti e selezionati ed elaborati, dei rettangoli che rappresentano le percentuali di vittoria e scontta di quel giocatore con un
colore.
Capitolo 7
Conclusione
Posso dire che gli obbiettivi (l'analisi tecnica e la realizzazzione del gioco
degli scacchi) sono stati raggiunti, con buoni risultati. Il programma, al
momento, non riscontra bug conosciuti per quanto riguarda il gioco sullo
stesso computer, il gioco online e tutte le altre feature. Per quanto riguarda
il gioco contro il computer il programma presenta ancora alcuni bug, per
la maggior parte sono dovuti al sistema che non riesce a gestire la mole di
lavoro, si puó notare questo avviando il programma da terminale, e vedendo
la 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 loro
proprietá o per l'uso che ne é stato fatto.
Appendice
76
Comando
picturebox.picture=picture.load(immagine)
nomele= OPEN nomele.estensione FOR CREATE
nomele.save(nomele.estensione, stringa)
nomeconnessione = NEW HttpClient AS nomeconnessione
nomeconnessione.URL = url
nomeconnessione.Get
IF Lof(h) THEN READ h, buer, Lof(h)
Server.Type = Net.Internet
Server.Port = porta
PUBLIC SUB ServerError()
PUBLIC SUB ServerConnection(sHost AS String)
Client.Add(Server.Accept())
PUBLIC SUB SocketRead()
READ LAST, sBuf, Lof(LAST)
PUBLIC SUB SocketClosed()
Client.Remove(Client.Find(LAST))
MySock.Host = ip
MySock.Port = porta
MySock.Connect()
WRITE MySock, dati, Len(dati)
CLOSE MySock
PRIVATE hConn AS Connection
hConn.Type = mysql
hConn.Host = localhost
hConn.Login = nomeutente
hConn.Password = psw
hConn.Open
hConn.Databases.Add(nome)
hConn.Tables.Add(nometabella)
hTable.Fields.Add(id, db.Serial)
hTable.PrimaryKey = [nomechiave]
hTable.Update
MyRS = hConn.Exec(sql)
MyRS!nomecampo
MyRS.MoveNext
draw.Begin(DrawingArea)
Draw.rect(x1,y1,x2,y2)
Cosa fa?
nella picturebox verrá mostrata un'immagine
apre il le per la scrittura
salva il le
crea una nuova connessione http
setto l'url dove opero
scarico i dati della connessione
legge e mette in un buer i dati
setto il tipo di connessione
setto la porta di connessione
in caso di errore
legge la richiesta di connessione
accetta la connessione del server
legge i dati in arrivo dal client
legge i dati in arrivo mettendoli in sBuf
valuta la chiusura della connessione
elimina il client dalla lista
setta l'ip dell'host server
setta la porta dell'host server
si connette all'host server
invia i dati settando la lunghezza
chiude la connessione con il server
dichiara la connessione
dichiara il tipo di connessione al database
dichiara l'host di connessione al database
dichiara il nome utente per connessione al database
dichiara la password per connessione al database
apre la connessione al database
aggiunge un database
crea una nuova tabella nel database
crea un nuovo campo nella tabella
denisce la chiave primaria
aggiorna il database con la tabella dichiarata
esegue il codice sql
visualizza il nome del campo della tabella
va alla tupla successiva
seleziona dove disegnare
disegna un rettangolo con i quattro vertici
Utilizzo
per realizzare la scacchiera
per il salvataggio della partita
per il salvataggio della partita
per il gioco online contro un avversario
per trovare l'avversario in maniera automatica
per trovare l'avversario in maniera automatica
per trovare l'avversario in maniera automatica
per il gioco in internet
per il gioco in internet
per il gioco in internet
server socket per il gioco in internet
server socket per il gioco in internet
server socket per il gioco in internet, lettura
per il gioco in internet, lettura
per il gioco in internet, chiusura
per il gioco in internet, chiusura
per connettersi nel gioco in internet
per connettersi nel gioco in internet
per connettersi nel gioco in internet
per inviare i dati nel gioco in internet
per chiudere la connessione nel gioco in internet
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per la connessione al database
per visualizzare i dati
per visualizzare i dati
per il disegno delle statistiche
per il disegno delle statistiche
A.2 Allegati
A.2 Allegati
In allegato a questa tesina troverete un dvd. Questo dvd contiene il sistema operativo Ubuntu modicato, con l'aggiunta di alcuni programmi, quali
Gambas, il linguaggio di programmazione che ho usato per programmare il
gioco, TexMaker, l'editor utilizzato per scrivere la tesina in LaTex, alcuni
programmi per il video editing, utilizzati per creare i video di presentazione,
come cinelerra e kdenlive, alcuni programmi per la graca 2d (Gimp) e 3d
(Blender), alcuni programmi utili per la gestione di internet e dei social network ed, ovviamente, il gioco giá installato, la tesina e la presentazione, oltre
a molti le utili per la spiegazione approfondita della stessa, quali i sorgenti
iniziali. Oltre a tutti questi programmi ce ne sono molti altri, oltre a dei
plug-in per refox, per gestirlo al meglio.
Questo dvd é stato realizzato per permettere a tutti di provare il programma senza dover installare nulla. Basterá, infatti, inserire il dvd nel proprio
lettore ed avviare il computer (ovviamente il bios deve essere settato correttamente, quindi deve prevedere la lettura da cd prima di altri dispositivi
bootabili). 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), scegliendo di provarlo si avvierá normalmente, senza modicare in alcun modo il
vostro computer, i dati per l'accesso sono: nome utente: ealmuno, password:
ealmuno. Scegliendo di installarlo potrete poi salvare i vostri le e modicarlo
a vostro piacimento, ovviamente occuperá spazio nel vostro computer.
77
78
Appendice
A.3 Approfondimenti odierni: la guerra fredda
Usa, arrestati dieci russi: Sono spie.
L'Fbi: agivano sotto copertura usando nomi e identitá fasulle
In America coperti da Mosca
NEW YORK
Le relazioni tra Stati Uniti e Russia riprecipitano in pieno
clima di Guerra Fredda: l'Fbi ha arrestato dieci persone con l'accusa di essere spie russe mentre un'undicesima, identicata come
Christopher Metsos, é ancora ricercata. Otto di loro sono state fermate domenica, con l'accusa di aver condotto azioni sotto
copertura per conto della Federazione Russa, di aver fornito a
Mosca informazioni sensibili e di aver riciclato denaro sporco.
Gli altri due sono sospettati di far parte dello stesso programma, si legge in un comunicato diuso dai federali. I presunti
agenti erano stati addestrati dai servizi di intelligence di Mosca
nell'uso di codici e cifre e in varie lingue straniere prima di essere spediti negli Stati Uniti nel corso dell'ultimo decennio. Ora
rischiano no a cinque anni di carcere per la loro attivitá di 007sono accusati di cospirazione per aver agito come agenti illegali
della Federazione Russa all'interno degli Stati Uniti e venti per
le operazioni nanziarie proibite. L'obiettivo della loro missione,
spiega il Ministero della Giustizia, era la ricerca e lo sviluppo di
contatti in circoli politici americani.
L'Fbi é ancora sulle tracce di un undicesimo uomo, identicato
come Christopher Metsos. Le manette sono scattate quasi contemporaneamente in tutti gli Stati Uniti: da Montclair, in New
Jersey, Yonkers, nello stato di New York ad Arlington, in Virginia. Altri due agenti, conosciuti con i nomi di Donald Heatheld
e 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. Alcuni nomi, secondo fonti del Dipartimento della Giustizia citate
dalla Cnn, appartenevano ad americani morti, ed erano stati assunti all'inizio degli Anni Novanta per inserirsi nella societá a
stelle e strisce. L'operazione é il frutto di un'indagine durata
anni, che ha coinvolto una rete di poliziotti disseminata su tut-
A.3 Approfondimenti odierni: la guerra fredda
to il territorio americano, scattata dopo l'intercettazione di un
messaggio partito dal quartier generale dell'intelligence moscovita. Siete stati inviati negli Usa per una missione a lungo termine.
La vostra istruzione, i vostri conti bancari, auto e casa, hanno
un solo obiettivo: riempire appieno la vostra missione, ossia cercare e sviluppare legami nei circoli politici americani ed inviarci
messaggi segreti.
Questo é un articolo tratto dal quotidiano presente anche online, lastampa, 1 in data 29 giugno 2010 (e richiamato da numerose testate nazionali e
telegiornali), la guerra fredda si puó denire nita il 9 novembre 1989 con il
crollo 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 il
corriere 2
L'inchiesta ha sollevato non pochi interrogativi. La prima
riguarda il danno fatto dalla rete: quali informazioni hanno carpito? Il secondo quesito concerne i tempi del blitz dell'Fbi: se
uno degli agenti, il principale, é nito sotto inchiesta n dal 2004
perché la polizia federale ha deciso di muoversi proprio adesso? E
non potevano beccarne solo un paio visto che le coppie agivano in
modo indipendente e lasciare la briglia sciolta agli altri? Alcuni
esperti sostengono che la retata é un chiaro messaggio politico
lanciato dagli Stati Uniti ai russi: smettetela con queste operazioni. Un segnale che arriva a pochi giorni dal caloroso incontro
tra Obama e il presidente Medvedev. Un colloquio seguito da uno
spuntino a base di hamburger e patatine in un locale di Arlington. A pochi chilometri dal ristorante l'Fbi ha arrestato proprio
due delle spie.
L'accusa lanciata dagli esperti, che il corriere cita, é quella di voler dare
un chiaro e forte messaggio politico alla Russia.
1 http://www.lastampa.it/redazione/cmsSezioni/esteri/201006articoli/56266girata.asp
2 http://www.corriere.it/esteri/10
g iugno2 8/usa − spie − russe − arrestate3 ccc0902 −
82f 6 − 11df − 9406 − 00144f 02aabe.shtml?f r = boxp rimopiano
79
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
modicata dalla licenza.
• Altri Diritti - La licenza non ha eetto 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]