Skill Factory
Lista post > Impariamo Python giocando al "Solitario del Ferroviere" - Lezione 2
Impariamo Python giocando al "Solitario del Ferroviere" - Lezione 2
Gino Visciano |
Skill Factory - 21/12/2019 10:02:13 | in Tutorials
Come creare il mazzo di carte
Nella lezione precedente abbiamo descritto le regole del gioco per giocare al "Solitario del ferroviere" ed implementato la funzionalità per scegliere la carta da pensare.
In questa seconda lezione implementeremo la funzionalità che permette di girare le carte del mazzo.
Per iniziare serve il mazzo di carte, per crearlo abbiamo usato la lista mazzo_carte a cui sono stati aggiunti i valori delle 10 carte da gioco, come mostra il comando seguente:
mazzo_carte=[1,2,3,4,5,6,7,8,9,10]
Successivamente, per associare i valori delle carte alle ripsettive immagini, abbiamo usato come indice della lista immagini_carte, i valori della lista mazzo_carte, come mostra il comando seguente:
immagini_carte[mazzo_carte[indice_carta_girata]]
Ad esempio, se indice_carta_girata è uguale a 4, il valore corrispondente alla carta da visualizzare è 5, come mostra l'esempio seguente:
mazzo_carte=[1,2,3,4,5,6,7,8,9,10]
Utilizzando il valore ottenuto come indice della lista immagini_carte, che contiene le immagini delle carte da gioco, si ottine la carta da gioco corrispondente:
Per visualizzare le carte da gioco sul pannello di gioco, abbiamo usato le etichette seguenti:
label_mazzo_di_carte=tk.Label(root, image=immagini_carte[0])
label_carta_girata=tk.Label(root, image=immagini_carte[0])
Per cambiare l'immagine associata all'etichetta label_carta_girata, abbiamo usato la funzione config(...), come mostra il comando seguente :
label_carta_girata.config(image=immagini_carte[mazzo_carte[indice_carta_girata]])
Come girare le carte mazzo
Per girare le carte del mazzo, è sufficiente incrementare ogni volta di uno la variabile indice_carta_girata, naturalmente la variabile deve essere azzerata ogni volta che il suo valore va oltre il limite massimo consentito, per evitare che venga generato l'errore:
IndexError: list index out of range
Per gestire questa funzionalità abbiamo creato il pulsante gira associato alla funzione gira(), come mostra il comando seguente:
pulsante_gira=tk.Button(root,text="GIRA", width=10, height=2, bd = 3,command=gira, bg="green",font=("Helvetica", 12))
Ogni volta che si clicca sul pulsante gira, la funzione gira() incrementa di 1 la variabile indice_carta_girata, in questo modo, di volta in volta, vengono visualizzate tutte le carte del mazzo, come mostra l'immagine seguente:
Quando la variabile indice_carta_girata diventa uguale a 8, la funzione gira(), gestisce le seguenti attività:
1) visualizza il dieci di coppe
2) elimina dal pannello di gioco, l'ultima carta del mazzo
3) elimina dal pannello di gioco il pulsante gira
4) permette di iniziare una nuova partitta, visualizzando il pulsante nuova partita.
L'immagine seguente mostra il pannello di gioco quando la variabile indice_carta_girata diventa uguale ad 8.
Cliccando sul pulsante nuova partita, viene eseguita la funzione nuova_partita(), che svolge le attività necessarie per riprendere il gioco.
Analisi del codice Python
# Solitario del ferroviere (Lezione 2)
import pygame # Importo la libreria pygame per gestire i suoni
import tkinter as tk # Importo la libreria tkinter con alias (abbreviazione) tk, per gestire il pannello su cui giocare
import time #Importo la libreria time per gestire il tempo attraverso l'orologio di sistema
from PIL import Image, ImageTk # Importo da PIL le librerie per gestire le immagini
from tkinter import messagebox # Importo da tkinter la libreria per gestire una finestra modale per gestire la fine del programma (game over)
# Lista per gestire il mazzo di carte
mazzo_carte=[1,2,3,4,5,6,7,8,9,10]
# Lista in cui caricare i riferimenti alle immagini delle carte
immagini_carte=[]
# Indice che punta al valore della carta girata
indice_carta_girata=0
# Questa funzione gestisce i suoni, sound permette di scegliere il suono, tempo indica pa pausa richiesta dopo il suono
def suono(sound,tempo):
if sound==1:
pygame.mixer_music.load("TickSound.mp3")
elif sound==2:
pygame.mixer_music.load("ElectronicSound.wav")
else:
pygame.mixer_music.load("ComputerSound.wav")
pygame.mixer_music.play()
time.sleep(tempo)
# Questa funzione permette di aggiungere le immagini del gioco nella lista immagini_carte
def carica_immagini_carte():
immagini_carte=[]
immagini_carte.append(ImageTk.PhotoImage(Image.open('Carte_Napoletane_retro.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('1coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('2coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('3coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('4coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('5coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('6coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('7coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('8coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('9coppe.png')))
immagini_carte.append(ImageTk.PhotoImage(Image.open('10coppe.png')))
return immagini_carte
# Questa funzione permette di girare le carte del mazzo
def gira():
global indice_carta_girata
global mazzo_carte
global flag
# Visualizza la carta girata
label_carta_girata.config(image=immagini_carte[mazzo_carte[indice_carta_girata]])
label_carta_girata.place(x=240,y=40)
girate=" "+str(indice_carta_girata+1)+"/10 "
label_girate.config(text=girate)
label_girate.place(x=285,y=370)
if indice_carta_girata<9:
indice_carta_girata=indice_carta_girata+1
suono(1,0.1)
else:
# Questo blocco gestisce le attività richieste quando finiscono le carte del mazzo
pulsante_gira.place_forget()
label_girate.place_forget()
indice_carta_girata=0
label_mazzo_di_carte.place_forget()
pulsante_nuova_partita.place(x=270,y=370)
suono(2,0.1)
# Questa funzione avvia una nuova partita
def nuova_partita():
global indice_carta_girata
label_carta_girata.place_forget()
pulsante_nuova_partita.place_forget()
suono(3,2.5)
label_girate.config(text=" 0/10 ")
start()
# Questa funzione inizializza il pannello di gioco
def start():
global indice_carta_girata
label_titolo_mazzo_di_carte.place(x=45,y=5)
label_mazzo_di_carte.place(x=25,y=40)
pulsante_gira.place(x=70,y=370)
label_girate.place(x=285,y=370)
pygame.init()
indice_carta_girata=0
# Preparazione dei componenti del pannello di gioco
root = tk.Tk()
root.wm_title('Solitario del ferroviere')
root.geometry("460x450")
root.resizable(False, False)
label_titolo_mazzo_di_carte=tk.Label(root, text="MAZZO DI CARTE",font=("Helvetica", 14))
pulsante_gira=tk.Button(root,text="GIRA", width=10, height=2, bd = 3,command=gira, bg="green",font=("Helvetica", 12))
pulsante_nuova_partita=tk.Button(root,text="NUOVA PARTITA", width=15, height=2, bd = 3,command=nuova_partita, bg="orange",font=("Helvetica", 12))
label_girate=tk.Label(root, text=" 0/10 ",font=("Helvetica", 25),fg="white",bg="orange")
immagini_carte=carica_immagini_carte()
label_mazzo_di_carte=tk.Label(root, image=immagini_carte[0])
label_carta_girata=tk.Label(root, image=immagini_carte[0])
start()
root.mainloop()
Nella prossima lezione implementeremo la funzione per mischiare le carte del mazzo centrale.
Arrivederci ...
<< Lezione precedente Lezione successiva >>
Per scaricare le risorse di questa lezione clicca sul link seguente:risorse_lezione_02