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]