Skillbook Logo
foto profilo

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]]

La variabile indice_carta_girata è l'indice che ci permette di scegliere uno dei 10 valori presenti nella lista mazzo_carte a cui viene associata l'immagine della carta da visualizzare.   

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:

 

Come abbiamo già visto nella lezione precedente, le immagini nella lista immagini_carte vengono caricate con la funzione carica_immagini_carte(), nell'ordine seguente:
 

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

 



 

Share Button
TOP