Python, scriviamo il primo videogioco

Se non avete mai avuto a che fare con Python vi consiglio di leggere questo articolo.

Questa volta proviamo a scrivere un videogioco, semplicissimo ma accattivante, in poche righe di codice. L’idea è quella di dover cliccare su un cerchio in una posizione casuale della finestra, appena ci clicchiamo sopra abbiamo fatto un punto e appare un nuovo cerchio in una nuova posizione. Il programma è questo:

from tkinter import *
from random import *

def cliccato(event):
    global punti,x,y
    xx = abs(x - event.x)
    yy = abs(y - event.y)
    if (xx < 10) and (yy < 10) :
        sfondo.create_oval(x - 10, y - 10, x + 10, y + 10,fill="#FFFFFF")    
        x = randint(10, 490)
        y = randint(10, 490)
        sfondo.create_oval(x - 10, y - 10, x + 10, y + 10,fill="#00FFFF")    
        #sfondo.pack()
        punti+=1
        p.configure(text="punti "+str(punti))
    
finestra = Tk()
finestra.bind("<Button-1>", cliccato)
sfondo = Canvas(finestra, width=500, height=500)
sfondo.pack()
p = Label(finestra, text="Punti 0")
p.pack()
punti = 0
x = randint(10, 490) 
y = randint(10, 490) 
sfondo.create_oval(x - 10, y - 10, x + 10, y + 10,fill="#00FFFF")    
finestra.mainloop()

Con le prime due righe diciamo all’interprete che librerie vogliamo utilizzare, subito dopo definiamo la funzione cliccato, a cui passiamo come parametri i valori di un evento. Queste istruzioni, tutte quelle che seguono il def cliccato(event), sono quelle che verranno eseguite ad ogni click, le vediamo meglio fra un po’.

Vi ricordo che tutte le istruzioni di una funzione devono essere indentate, cioè devono rientrare di almeno un carattere per permettere all’interprete di capire quali sono le istruzioni comprese nella funzione. Quindi possiamo passare a vedere la prima istruzione del programma, la prima dopo quelle indentate e cioè finestra = Tk().

Creare la finestra

Questa istruzione come abbiamo visto nell’articolo precedente crea una finestra, con l’istruzione bind che segue associamo alla finestra un evento (in questo caso il click del mouse) e la relativa funzione (cliccami); da questo momento ogni volta che verrà fatto un click sulla finestra, verranno eseguite le istruzioni della funzione cliccami. La riga successiva aggiunge uno sfondo di 500 x 500 pixel sul quale potremo disegnare seguito dal comando che lo rende visibile(pack).

La riga che segue, la 21 crea una label (un campo per visualizzare i punti) chiamato p; in un programma piccolo come questo si possono anche usare nomi di variabile di una sola lettera, ma di solito non conviene farlo, di solito conviene usare delle convenzioni per distinguere le variabili locali da quelle globali assegnando un prefisso per ogni tipo e il nome della variabile deve far capire il tipo di dato e il contenuto.

Un esempio di nome significativo di una variabile nel caso dei punti potrebbe essere am_glob_str_visualizza_punti dove am sono le mie iniziali (con cui identifico tutte le variabili definite da me) glob indica che la variabile è globale (viene definita nel corpo del programma ma utilizzata nella funzione) str indica che si tratta di una stringa e visualizza_punti mi fa capire cosa contiente. sicuramente era più facile chiamarla p.

Variabile per il punteggio

A questo punto definiamo la variabile punti che conterrà il punteggio e le diamo un valore iniziale di zero. Anche questa è una variabile globale, definita nel corpo del programma ma incrementata nella funzione cliccato. A questo punto dobbiamo generare il primo cerchio.

Con la funzione randint impostiamo un numero casuale fra 10 e 490, praticamente poichè il cerchio che andiamo a tracciare avrà un raggio di 10 pixel, evitiamo che esca dallo schermo. Quindi ora abbiamo un numero casuale x e un numero casuale y e attorno a quel punto possiamo tracciare il cerchio con la funzione crea.oval che scrive sullo sfondo (canvas); nella stessa funzione abbiamo detto, impostando il parametro fill, che vogliamo un riempimento verde.

Ora non ci resta che vedere che succede quando facciamo un click. per prima cosa dobbiamo vedere se abbiamo beccato il cerchio, sappiamo che x e y sono le coordinate le centro quindi se prendiamo il valore assoluto della differenza fra le singole coordinate del cerchio e del punto in cui abbiamo cliccato (event.x event.y) sappiamo quanto lontano dal centro abbiamo cliccato. Se entrambi questi valori sono inferiori a 10 (raggio del cerchio) lo abbiamo centrato

Tutto questo lo trovate dalla riga 6 alla 8, le righe che seguono sono indentate per definire le istruzione che l’interprete deve seguire solo se entrambe le condizioni sono vere, in quel caso viene prima ridisegnato il cerchio con riempimento bianco per visualizzare il fatto che lo abbiamo centrato e poi viene generato un nuovo cerchio in posizione casuale. Per ultimo incrementiamo i punti e li visualizziamo impostandoli nel campo p.

Conclusioni

Spero di essere stato chiaro, sicuramente non semplice ma se avete dubbi commentate pure qua sotto che vi rispondo.

Al prossimo articoli (magari fate richieste) vedremo come migliorare il programma, aggiungendo delle difficoltà, tipo il rimpicciolimento del cerchio man mano che passa il tempo e modificando il punteggio in modo che tenga conto del tempo impiegato a cliccare (più veloce, più punti) e magare qualche colore in più.

Il prossimo articolo su come eseguire Python su smartphone Android e scrivere la prima app lo trovate QUI.

Maurizio

Lascia un commento