Il progettino attuale si basa sulla vaga idea di disegnare la mappa di una città: ma, come spiegato, in realtà navigo a vista col risultato che decido di giorno in giorno cosa aggiungere. Lo scopo può essere il mio personale divertimento oppure qualcosa che ritengo particolarmente istruttivo come, ad esempio, una tecnica particolare oppure una qualche libreria…
Stavolta sono stato furbetto: ho capito che per “divertirmi” è importante che possa vedere immediatamente i miei progressi. Per questo ho separato la logica della costruzione della mappa dalla sua visualizzazione. Inizialmente ho scritto del codice che visualizzava la mappa con semplici caratteri sul terminale: il risultato era abbastanza bruttino però mi permetteva di controllare visivamente come funzionava il mio programma che, come spiegato, è molto importante…
Qualche giorno ho deciso di migliorare la resa visiva della mappa e ho guardato cosa fosse disponibile di librerie Python. Sono stato fortemente tentato di usare la “curses” una libreria che dà il completo controllo del terminale, addirittura è possibile definirvi delle finestre virtuali di caratteri! Inoltre avevo vaghe reminiscenze di vecchi giochi usati con tale libreria (che infatti è realizzata in C: per Python c’è un wrapper, cioè una specie di adattatore)…
Poi però non mi è sembrata così facile da usare e così ho iniziato a guardare cosa fosse disponibile per la grafica: da quel che ho capito la norma per Python è usare la libreria “pillow” e così ho fatto.
Oggi ho guardato un po’ di documentazione e, come al solito a “martellate”, ho fatto funzionare il tutto.
Nelle due immagini seguenti la vecchia resa della mappa a confronto con quella nuova grafica.
In realtà, come si può vedere, più che di una città sto facendo la mappa di una fattoria!
Nei prossimi giorni aggiungerò molti nuovi elementi che la renderanno decisamente più colorata…
Non credo che sia il caso di entrare nei dettagli tecnici che, in realtà, non sono niente di interessante: del resto l’intero codice è appena circa 150 linee che significa che qualcuno bravo col Python l’avrebbe potuto scrivere con appena un centinaio di righe!
Ma del resto, almeno al momento, non cerco di comprimere il codice il più possibile: preferisco che sia bello chiaro in maniera da poterlo cambiare facilmente…
Vabbè, volendo aggiungere qualche dettaglio tecnico posso dire che:
- ho iniziato a creare classi Python: ODIO dover scrivere “self” davanti a tutte le variabili. Davvero non riesco a capire che senso abbia…
- Mi piace però poter inserire nello stesso archivio più classi (in Java, in genere, a ogni archivio corrisponde una sola classe).
- Anche la manipolazione dei dati è molto più agile in Python che con Java…
- Ah! Il codice che disegna l’area coltivata intorno alle fattorie è carino: è dinamico, se ci sono ostacoli vengono correttamente aggirati fino a una distanza di 5 quadretti: da notare che considero la diagonale di un quadretto lunga 1.42 quadretti e questo dà all’area coltivata un aspetto “rotondeggiante”. Ecco per realizzare questo codice ho avuto qualche problema: ho dovuto usare in parallelo sia una “lista” che un “dizionario” Python: probabilmente un bravo programmatore sarebbe stato in grado di fare tutto con un’unica struttura.
Il fatto è che con solo una lista di triplette (ovvero 2 coordinate e 1 distanza) non sapevo come filtrare gli elementi basandomi solo sulle coordinate; vice versa con un dizionario non sapevo come estrarre nell’ordine di inserzione i vari elementi (non credo si possa). Così ho usato entrambe le strutture: la lista per mantenere l’ordine e il dizionario per cercare la distanza di una specifica coppia di coordinate…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | def aggCasa(self): while True: x=random.randint(0,self.dimX-2) y=random.randint(0,self.dimY-2) ca=Casa(x,y) nonqui=False for px, py in ca.area(): if self.matrice[px][py][-1].tipo!='.': nonqui=True break if not nonqui: break self.matrice[x][y].append(Elemento('=')) self.matrice[x][y+1].append(Elemento('=')) self.matrice[x+1][y].append(Elemento('=')) self.matrice[x+1][y+1].append(Elemento('=')) self.oggetti.append(ca) base={(x,y) : 0,(x+1,y) : 0,(x,y+1) : 0,(x+1,y+1) :0} basel=[(x,y),(x+1,y),(x,y+1),(x+1,y+1)] while len(basel)>0: x,y=basel.pop(0) cv=base[(x,y)] del base[(x,y)] lista=self.intorno(x,y) for cx, cy, dist in lista: if dist+cv>5: continue if self.matrice[cx][cy][-1].tipo=='.': self.matrice[cx][cy].append(Elemento('^')) basel.append((cx,cy)) base[(cx,cy)]=cv+dist continue if self.matrice[cx][cy][-1].tipo=='^' and (cx, cy) in base: if base[(cx, cy)]>dist+cv: base[(cx,cy)]=cv+dist continue |
La parte interessante del codice inizia dalla linea 18: notare il dizionario “base” e la lista “basel”…
Vabbè, se qualcuno fosse interessato mi faccia sapere e scenderò in maggiori dettagli!
Conclusione: per adesso mi diverto: vediamo quanto dura!
PS: Bellina la presentazione grafica del codice, vero? Ho trovato questo ottimo convertitore da codice ad HTML qui su Hilite.me
Nessun commento:
Posta un commento