In questa lezione, esploreremo come sviluppare un gioco Snake utilizzando il modulo turtle di Python. Il gioco Snake è un classico gioco arcade in cui il giocatore controlla un serpente che cresce man mano che mangia del cibo, evitando di collidere con i bordi dello schermo o con il proprio corpo.
Configurazione di Base
Introduzione al modulo Turtle
Il modulo turtle è una libreria grafica di Python che permette di creare disegni e animazioni in modo semplice. È particolarmente utile per creare giochi 2D come Snake.
Configurazione dello schermo di gioco
Per iniziare, dobbiamo configurare la finestra di gioco. Utilizziamo la funzione setup_screen() per creare una finestra con uno sfondo nero e dimensioni 600×600 pixel.
[code language=”Python”]
import turtle
import time
import random
def setup_screen():
wn = turtle.Screen()
wn.title("Snake Game")
wn.bgcolor("black")
wn.setup(width=600, height=600)
wn.tracer(0)
return wn
[/code]
Creazione del serpente e del cibo
Successivamente, creiamo la testa del serpente e il cibo. La testa del serpente è un quadrato bianco, mentre il cibo è un cerchio rosso.
[code language=”Python”]
def create_snake():
head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("white")
head.penup()
head.goto(0, 0)
head.direction = "stop"
return head
def create_food():
food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("red")
food.penup()
food.goto(0, 100)
return food
[/code]
Test del funzionamento base
Dopo aver configurato lo schermo e creato il serpente e il cibo, possiamo testare il funzionamento base del gioco.
[code language=”Python”]
wn = setup_screen()
head = create_snake()
food = create_food()
[/code]
Movimento e Controlli
Implementazione delle funzioni di movimento
Il serpente si muove in quattro direzioni: su, giù, sinistra e destra. Implementiamo le funzioni per gestire il movimento.
[code language=”Python”]
def go_up():
if head.direction != "down":
head.direction = "up"
def go_down():
if head.direction != "up":
head.direction = "down"
def go_left():
if head.direction != "right":
head.direction = "left"
def go_right():
if head.direction != "left":
head.direction = "right"
def move():
if head.direction == "up":
y = head.ycor()
head.sety(y + 20)
elif head.direction == "down":
y = head.ycor()
head.sety(y – 20)
elif head.direction == "left":
x = head.xcor()
head.setx(x – 20)
elif head.direction == "right":
x = head.xcor()
head.setx(x + 20)
[/code]
Aggiunta dei controlli da tastiera
Per permettere al giocatore di controllare il serpente, dobbiamo associare le funzioni di movimento ai tasti della tastiera.
[code language=”Python”]
wn.listen()
wn.onkeypress(go_up, "w")
wn.onkeypress(go_down, "s")
wn.onkeypress(go_left, "a")
wn.onkeypress(go_right, "d")
[/code]
Creazione del game loop principale
Il game loop è il cuore del gioco. Gestisce il movimento del serpente, le collisioni e l’aggiornamento dello schermo.
[code language=”Python”]
while True:
wn.update()
move()
time.sleep(0.1)
[/code]
Meccaniche di Gioco
Implementazione della crescita del serpente
Quando il serpente mangia il cibo, deve crescere. Aggiungiamo un segmento al corpo del serpente ogni volta che mangia.
[code language=”Python”]
segments = []
def add_segment():
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("grey")
new_segment.penup()
segments.append(new_segment)
[/code]
Gestione delle collisioni
Il serpente deve evitare di collidere con i bordi dello schermo e con il proprio corpo. Implementiamo una funzione per controllare le collisioni.
[code language=”Python”]
def check_collisions():
if (head.xcor() > 290 or head.xcor() < -290 or
head.ycor() > 290 or head.ycor() < -290):
return True
for segment in segments:
if head.distance(segment) < 20:
return True
return False
[/code]
Sistema di punteggio
Ogni volta che il serpente mangia il cibo, il punteggio aumenta. Visualizziamo il punteggio e il record in alto sullo schermo.
[code language=”Python”]
score = 0
high_score = 0
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))
[/code]
Personalizzazione e Miglioramenti
Modifica delle impostazioni di gioco
Possiamo personalizzare il gioco modificando la velocità, le dimensioni dello schermo, i colori e le forme.
[code language=”Python”]
game_speed = 0.1 # Velocità del gioco
wn.setup(width=800, height=800) # Schermo più grande
wn.bgcolor("blue") # Cambia colore dello sfondo
head.color("yellow") # Cambia colore del serpente
food.color("green") # Cambia colore del cibo
[/code]
Aggiunta di funzionalità extra
Possiamo aggiungere funzionalità extra come un menu per selezionare la difficoltà, effetti visivi e un sistema di power-up.
[code language=”Python”]
class SnakeGame:
def __init__(self):
self.difficulty_levels = {
"Facile": 0.15,
"Medio": 0.1,
"Difficile": 0.05
}
self.current_difficulty = "Medio"
self.game_speed = self.difficulty_levels[self.current_difficulty]
self.is_game_on = False
self.score = 0
self.high_score = 0
[/code]
Debug e ottimizzazione
Infine, è importante testare il gioco e correggere eventuali bug. Possiamo anche ottimizzare il codice per migliorare le prestazioni.
[code language=”Python”]
def game_loop(self):
while self.is_game_on:
self.screen.update()
self.move()
if self.check_collisions():
time.sleep(1)
self.show_menu()
break
time.sleep(self.game_speed)
[/code]
Conclusione
In questa lezione, abbiamo imparato a sviluppare un gioco Snake utilizzando Python e il modulo turtle. Abbiamo visto come configurare lo schermo, creare il serpente e il cibo, gestire il movimento e le collisioni, e personalizzare il gioco. Con queste conoscenze, puoi continuare a migliorare il gioco aggiungendo nuove funzionalità e personalizzazioni. Buon coding!