Skillbook Logo
foto profilo

Skill Factory

Lista post > Impariamo Python giocando al "Solitario del Ferroviere" - Lezione 4

Impariamo Python giocando al "Solitario del Ferroviere" - Lezione 4

Gino Visciano | Skill Factory - 01/01/2020 21:44:25 | in Tutorials

Nella quarta lezione creiamo il primo livello del "Solitario del Ferroviere" con cui realmente potete iniziare a giocare, con questo livello di difficoltà è più semplice giocare perché  le carte indovinate e quelle non indovinate sono scoperte, in modo da rendere più facile la scelta della carta da pensare,  come mostra l'immagine seguente.

Il pulsante cambia, come abbiamo visto nella prima lezione, permette di scegliere la carta da pensare, mentre il  pulsante gira, come abbiamo visto nella seconda lezione e nella terza lezione permette di girare le carte del mazzo. Quando la carta pensata è uguale alla carta girata, l'immagine small della carta indovinata viene aggiunta in corrispondenza del cerchio verde, altrimenti viene aggiunta in corrispondenza del cerchio rosso.  

Quando le carte da girare finiscono, se ci sono carte non indovinate, è possibie mischiare e riprendere il gioco, come mostra l'immagine seguente.

Il gioco finisce quando s'indovinano tutte le carte, in quel caso è possibile iniziare una nuova partita, come mostra l'immagine seguente.

Col passare del tempo i punti diminuiscono ed ogni volta che le carte vengono mischiate il punteggio si dimezza. Se il punteggio arriva a 0 senza aver completato il solitario, appare la finestra modale (modale=impedisce qualunque operazione e permette solo di uscire), "GAME OVER" che indica la fine del gioco, come mostra l'immagine seguente.

Come aggiornare il punteggio

Il punteggio (score) all'inizio del gioco vale 1000, questo valore si decrementa di uno ogni 10 secondi e viene dimezzato ogni volta che si mischiano le carte.

Per gestire l'aggiornamento del punteggio è stata utilizzata la funzione tick() che viene eseguita ogni 200 millisecondi:

# chiama la funzione tick ogni 200 millisecondi
label_clock.after(200, tick)

Per decrementare il punteggio ogni 10 secondi si usa la variabile conta_score. Questa variabile  s'incrementa di uno, ogni volta che viene eseguita la funzione tick(), quando diventa uguale a 50, significa che sono trascorsi 10 secondi (1 secondo=5 x 200 millisecondi => 10 secondi/200 millisecondi = 50) e viene decrementato il punteggio di uno, come mostra il blocco di codice segunte, inserito nella funzione tick():

conta_score+=1
if conta_score>50:
   score=score-1
   conta_score=0

Per dimezzare il punteggio ogni volta che le carte vengono mischiate, è stata inserita l'istruzione score=int(score/2) nella funzione mischia(), come mostra il blocco di codice seguente:

def mischia():
    ...
    global tentativi
    global score
    tentativi=tentativi+1
    score=int(score/2)
    ...

 

Come visualizzzare le carte small indovinate e non indovinate

La visualizzazione delle carte small indovinate oppure non indovinate serve per rendere il livello di difficolta del solitario più semplice, perché è più facile scegliere la carta da pensare

Per caricare le carte small abbiamo usato la funzione carica_immagini_carte_small(), che aggiunge i riferimenti delle immagini nella lista immagini_carte_small e restituisce il riferimento della lista creata. 

def carica_immagini_carte_small():
    immagini_carte_small=[]
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('1coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('2coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('3coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('4coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('5coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('6coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('7coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('8coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('9coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('10coppe_small.png')))
    return immagini_carte_small

Per visualizzare le immagini small, ogni volta che si gira una carta, viene creata un'etichetta label_img_carta_indovinata se la carta è stata indovinata, altrimenti   label_img_carta_non_indovinata, se la carta non è stata indovinata.
Le etichette usate per visualizzare le carte small sul piano di gioco, si trovano ad una distanza di 50 Pixel, l'una dall'altra. La posizione corrente viene indicata dalle variabili offset_indovinate ed offset_non_indovinate, come mostral'immagine seguente:

Il blocco di codice seguente, incluso nella funzione gira(), mostra come sono gestite le carte small:

    if carta_pensata==mazzo_carte[indice_carta_girata]:
        label_img_carta_indovinata=tk.Label(root, image=immagini_carte_small[mazzo_carte[indice_carta_girata]-1])
        label_img_carta_indovinata.place(x=820+offset_indovinate,y=60)
        offset_indovinate=offset_indovinate+50
        indovinate=indovinate+1
        label_indovinate.config(text=str(indovinate))
        label_indovinate.place(x=820,y=65)
        label_carte_small_si.append(label_img_carta_indovinata)
        suono(5,0.1)
    else:
        label_img_carta_non_indovinata=tk.Label(root, image=immagini_carte_small[mazzo_carte[indice_carta_girata]-1])
        label_img_carta_non_indovinata.place(x=820+offset_non_indovinate,y=153)
        offset_non_indovinate=offset_non_indovinate+50
        non_indovinate=non_indovinate+1
        mazzo_carte_non_indovinate.append(mazzo_carte[indice_carta_girata])
        label_non_indovinate.config(text=str(non_indovinate))
        label_non_indovinate.place(x=820,y=158)
        label_carte_small_no.append(label_img_carta_non_indovinata)

 

Le liste label_carte_small_silabel_carte_small_no, servono per memorizzare i riferimenti di tutte le etichette che contengono carte smll, in modo da poter essere cancellate quando è necessario, utilizzando i blocchi di codice seguenti: 

# Elimina dal piano di gioco tutte le etichete che contengono carte small indovinate
for i in range(0,10):
    label_carte_small_si[i].place_forget() # Cancella l'etichetta corrispondente al riferimento corrente della lista
label_carte_small_si.clear() # Cancella dalla lista tutti i riferimenti alle etchette che contengono carte small indovinate

 

# Elimina dal piano di gioco tutte le etichete che contengono carte small non indovinate
for i in range(0,len(mazzo_carte)):
    label_carte_small_no[i].place_forget() # Cancella l'etichetta corrispondente al riferimento corrente della lista
label_carte_small_no.clear() # Cancella dalla lista tutti i riferimenti alle etchette che contengono carte small non indovinate

 

Come rimescolare le carte non indovinate e riprendere il gioco

Quando le carte del mazzo centrale vengono girate tutte, se ci sono ancora carte non indovinate occore rimescolarle per riprendere il gioco, questa operazione viene svolta dalla funzione mischia().

Prima di tutto bisogna svuotare la lista mazzo_carte, che contiene i valori delle 10 carte da gioco iniziali, il comando seguente esegue questa operazione:

mazzo_carte.clear()

Successivamente bisogna caricare i valori delle carte non indovinate nella lista mazzo_carte, e svuotare la lista che contiene i valori delle carte non indovinate, come mostrano le istruzioni seguenti:

mazzo_carte=mazzo_carte_non_indovinate[:]
mazzo_carte_non_indovinate.clear()

Il blocco di codice seguente mostra le istruzioni fondamentali della funzione mischia() per mescolare le carte non indovinate e riprendere il gioco:

def mischia():
    global mazzo_carte
    global mazzo_carte_non_indovinate
    global non_indovinate
    global offset_non_indovinate
    global label_carte_small_no
    ...
    mazzo_carte.clear()
    mazzo_carte=mazzo_carte_non_indovinate[:]
    mazzo_carte_non_indovinate.clear()
    non_indovinate=0
    offset_non_indovinate=50

     # Elimina dal piano di gioco il pulsante mischia
    pulsante_mischia.place_forget()
    suono(9,4)
    # Elimina dal piano di gioco tutte le etichete che contengono carte small non indovinate
    for i in range(0,len(mazzo_carte)):
        label_carte_small_no[i].place_forget()
    label_carte_small_no.clear()
    start() # Riavvia il gioco

 

Come iniziare una nuova partita oppure visualizzare la finestra modale "GAME OVER" per interrompere il gioco

Quando le carte vengono indovinate tutte, se il punteggio è maggiore di zero è possibile iniziare una nuova partita,

In qualunque momento il punteggio diventa zero, appare la finestra modale "GAME OVER" e bisogna interrompere il gioco.

Il primo caso (nuova partita) si controlla attraverso il codice seguente, inserito nella funzione gira():

    # Se l'indice della carta girata e minore del del massimo consentito, incrementa l'indice di uno, altrimenti mischia oppure inizia una nuova partita
    if indice_carta_girata<len(mazzo_carte)-1:
       indice_carta_girata=indice_carta_girata+1
       suono(3,0.1)
    else:
       pulsante_gira.place_forget()
       label_girate.place_forget()
       label_mazzo_di_carte.place_forget()
       label_carta_girata.place_forget()
       # Se ci sono ancora carte da indovinare mischia
       if indovinate<10:
          pulsante_mischia.place(x=295,y=370)
          suono(8,0.1)
       # Se non ci sono carte da indovinare inizia una nuova partita
       else:
          pulsante_nuova_partita.place(x=270,y=370)
          suono(7,0.1)
          flag=False

La variabile flag a false blocca l'aggiornamento dei secondi e del punteggio.

Per gestire il secondo caso (GAME OVER) occorre verificare se il punteggio diventa uguale a zero, questo è possibile solo quando viene aggiornato il punteggio all'interno della funzione tick(), come mostra blocco di codice seguente:

        conta_score+=1
        # Se conta_score>50 aggiorna il punteggio
        if conta_score>50:
            score=score-1
            conta_score=0
        
# Se score>0 aggiorna le etichette dei secondi, dei tentativi e del punteggio
        if score>0:
            spazi="          "[:(10-len(str(secondi)))]
            str_secondi=spazi+str(secondi)+" "
            label_secondi.config(text=str_secondi)
            spazi="          "[:(10-len(str(tentativi)))]
            label_tentativi.config(text=spazi+str(tentativi)+" ")
            spazi="          "[:(10-len(str(score)))]
            label_score.config(text=spazi+str(score)+" ")
        
# Se score==0 visualizza la finestra modale GAME OVER ed interrompe il gioco
       else:
            label_score.config(text="          0 ")
            flag=False
            messagebox.showinfo('Fine Partita', 'GAME OVER')
            esci() # Esegue funzione esci()

# Interrompe il gioco
def esci():
   root.quit()

 

Analisi del codice Python

# Solitario del ferroviere (Lezione 4)
import pygame                                  # Importa classe pygame per gestire i suoni
import tkinter as tk                           
# Importa classe tkinter con alias tk per gestire il pannello di gioco
import time                                        # Importa classe time per gestire l'orologio di sistema 
import random                                  # Importa classe random che permette di ottenere gli indici casuali usati per mischiare le carte
from PIL import Image, ImageTk    # Dalla libreira Pillow importa le classi Image e ImageTk per gestire le immagini del gioco 
from tkinter import messagebox    # Dalla libreira tkinter importa le classe messagebox usata per creare la finestra modale "GAME OVER"

mazzo_carte=[1,2,3,4,5,6,7,8,9,10]  # Contiene i valori della 10 carte da gioco
mazzo_carte_non_indovinate=[]     
# Contiene i valori delle carte non indovinate
immagini_carte=[]                             # Contiene i riferimenti delle immagini  della 10 carte da gioco
immagini_carte_small=[]                  # Contiene i riferimenti delle immagini  della 10 carte da gioco small
label_carte_small_no=[]
label_carte_small_si=[]
indice_carta_pensata=0
indice_carta_girata=2
indovinate=0
non_indovinate=0
carta_pensata=1
time1=0                                               
# Questa variabile viene usata per il calcolo dei secondi trascorsi
time_start=0                                       # Questa variabile viene usata per il calcolo dei secondi trascorsi
tentativi=1                                           # Questa variabile viene usata per contare quante volte vengono mischiate le carte
offset_indovinate=50                        # Questa variabile viene usata per posizionare le carte small indovinate sul pannello di gioco
offset_non_indovinate=50               # Questa variabile viene usata per posizionare le carte small non indovinate sul pannello di gioco
score=1000                                         # Questa variabile contiene il punteggio
conta_score=0                                    # Questa variabile viene usata per decrementare di uno il punteggio ogni 10 secondi
flag=True                                             # Questa variabile viene usata per interrompere l'aggiornamento dei secondi e del punteggio (nuova partita/game over)

# Questa funzione interrompe il gioco
def esci():
   root.quit()

# Questa funzione viene eseguita ogni 200 millisecondi ed aggiorna il contenuto di tutte le etichette del pannello di gioco
def tick():
    global time1
    global time_start
    global tentativi
    global score
    global conta_score
    global flag
    # legge ora locale del pc
    time2 = time.strftime('%H:%M:%S')
    if time2 != time1:
        time1 = time2
        label_clock.config(text=time2)   
# Aggiorna l'orologio in alto a destra del pannello di gioco
    if flag:     # Se flag==true vengono aggiornati i secondi ed il punteggio, altrimenti viene aggiornato solo l'orologio
        secondi=int(time.time()-time_start) # Calcola i secondi trascorsi
        spazi="          "[:(10-len(str(secondi)))]  # Qunatità di spazi usati per impaginare i secondi ed i tentativi
        str_secondi=spazi+str(secondi)+" "
        label_secondi.config(text=str_secondi)
        spazi="          "[:(10-len(str(tentativi)))]
        label_tentativi.config(text=spazi+str(tentativi)+" ")
        conta_score+=1
        if conta_score>50:   
# Quando conta_score è ugluale a 50 sono passati 10 secondi e bisogna decrementare di uno il punteggio
            score=score-1
            conta_score=0
        if score>0:
            spazi="          "[:(10-len(str(secondi)))]
            str_secondi=spazi+str(secondi)+" "
            label_secondi.config(text=str_secondi)
            spazi="          "[:(10-len(str(tentativi)))]
            label_tentativi.config(text=spazi+str(tentativi)+" ")
            spazi="          "[:(10-len(str(score)))]
            label_score.config(text=spazi+str(score)+" ")
        else:
            label_score.config(text="          0 ")
            flag=False  
# Disattiva l'aggiornamento dei secondi e del punteggio
            messagebox.showinfo('Fine Partita', 'GAME OVER')  # Visualizza la finestra modale "GAME OVER"
            esci()  # Esce dal gioco
    # chiama la funzione tick ogni 200 millisecondi
    label_clock.after(200, tick)


# Questa funzione viene eseguita per mischiare le carte
def mischia_carte(mazzo):
    temp=0
    max=len(mazzo)-1
    for i in range(1,100):
        prima=random.randint(0,max)
        seconda=random.randint(0,max)
        if prima!=seconda:
            temp=mazzo[prima]
            mazzo[prima]=mazzo[seconda]
            mazzo[seconda]=temp

def suono(sound,tempo):
    if sound==1:
       pygame.mixer_music.load("TickSound.mp3")
    elif sound==2:
       pygame.mixer_music.load("ElectronicSound.wav")
    elif sound==3:
       pygame.mixer_music.load("ToggleSound.wav")
    elif sound==4:
       pygame.mixer_music.load("ToneSound.wav")
    elif sound==5:
       pygame.mixer_music.load("OvationSound.wav")
    elif sound==6:
       pygame.mixer_music.load("ElectronicSound.wav")
    elif sound==7:
       pygame.mixer_music.load("CardSound.wav")
    elif sound==8:
       pygame.mixer_music.load("ComputerSound.wav")
    pygame.mixer_music.play()
    time.sleep(tempo)    
    

# Questa funzione viene eseguita per caricare le immagini delle 10 carte da gioco
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 viene eseguita per caricare le immagini small delle 10 carte da gioco
def carica_immagini_carte_small():
    immagini_carte_small=[]
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('1coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('2coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('3coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('4coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('5coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('6coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('7coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('8coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('9coppe_small.png')))
    immagini_carte_small.append(ImageTk.PhotoImage(Image.open('10coppe_small.png')))
    return immagini_carte_small


# Questa funzione permette di scegliere la carta pensata
def cambia():
    global indice_carta_pensata
    global carta_pensata
    carta_pensata=indice_carta_pensata
    label_carta_pensata.config(image=immagini_carte[indice_carta_pensata])
    label_carta_pensata.place(x=5,y=40)
    if indice_carta_pensata<10:
       indice_carta_pensata=indice_carta_pensata+1
    else:
       indice_carta_pensata=1
    suono(1,0.1)
    

# Questa funzione viene eseguita per girare le carte e verificare se la carta pensata è uguale alla carta girata
def gira():
    global indice_carta_girata
    global flag
    global mazzo_carte
    global carta_pensata
    global indovinate
    global non_indovinate
    global offset_indovinate
    global offset_non_indovinate
    global label_carte_small_no
    global label_carte_small_si
    label_carta_girata.config(image=immagini_carte[mazzo_carte[indice_carta_girata]])
    label_carta_girata.place(x=455,y=40)
    girate="   "+str(indice_carta_girata+1)+"/"+str(len(mazzo_carte))+"  "
    label_girate.config(text=girate)
    label_girate.place(x=500,y=370)
    if carta_pensata==mazzo_carte[indice_carta_girata]:
        label_img_carta_indovinata=tk.Label(root, image=immagini_carte_small[mazzo_carte[indice_carta_girata]-1])
        label_img_carta_indovinata.place(x=820+offset_indovinate,y=60)
        offset_indovinate=offset_indovinate+50
        indovinate=indovinate+1
        label_indovinate.config(text=str(indovinate))
        label_indovinate.place(x=820,y=65)
        label_carte_small_si.append(label_img_carta_indovinata)
        suono(4,0.1)
    else:
        label_img_carta_non_indovinata=tk.Label(root, image=immagini_carte_small[mazzo_carte[indice_carta_girata]-1])
        label_img_carta_non_indovinata.place(x=820+offset_non_indovinate,y=153)
        offset_non_indovinate=offset_non_indovinate+50
        non_indovinate=non_indovinate+1
        mazzo_carte_non_indovinate.append(mazzo_carte[indice_carta_girata])
        label_non_indovinate.config(text=str(non_indovinate))
        label_non_indovinate.place(x=820,y=158)
        label_carte_small_no.append(label_img_carta_non_indovinata)
    if indice_carta_girata<len(mazzo_carte)-1:
       indice_carta_girata=indice_carta_girata+1
       suono(3,0.1)
    else:
       pulsante_gira.place_forget()
       label_girate.place_forget()
       label_mazzo_di_carte.place_forget()
       label_carta_girata.place_forget()
       if indovinate<10:
          pulsante_mischia.place(x=295,y=370)
          suono(6,0.1)
       else:
          pulsante_nuova_partita.place(x=270,y=370)
          suono(5,0.1)
          flag=False

# Questa funzione viene eseguita quando si clicca sul pulsante mischia, gestisce tutte le operazioni richieste quando si mischiano le carte non indovinate
def mischia():
    global mazzo_carte
    global mazzo_carte_non_indovinate
    global non_indovinate
    global offset_non_indovinate
    global label_carte_small_no
    global tentativi
    global score
    tentativi=tentativi+1
    score=int(score/2)
    mazzo_carte.clear()
    mazzo_carte=mazzo_carte_non_indovinate[:]
    mazzo_carte_non_indovinate.clear()
    non_indovinate=0
    offset_non_indovinate=50
    pulsante_mischia.place_forget()
    suono(7,4)
    for i in range(0,len(mazzo_carte)):
        label_carte_small_no[i].place_forget()
    label_carte_small_no.clear()
    start()

# Questa funzione viene eseguita quando si clicca sul pulsante nuova partita, gestisce tutte le operazioni necessarie per iniziare una nuova partita
def nuova_partita():
   global mazzo_carte
   global mazzo_carte_non_indovinate
   global indovinate
   global non_indovinate
   global offset_indovinate
   global offset_non_indovinate
   global label_carte_small_si
   global tentativi
   global score
   global conta_score
   global time_start
   global flag
   mazzo_carte=[1,2,3,4,5,6,7,8,9,10]
   mazzo_carte_non_indovinate.clear()
   flag=True
   indovinate=0
   offset_indovinate=50
   non_indovinate=0
   offset_non_indovinate=50
   tentativi=1
   score=1000
   conta_score=0
   time_start=0
   label_carta_girata.place_forget()
   pulsante_nuova_partita.place_forget()
   suono(8,2.5)
   for i in range(0,10):
       label_carte_small_si[i].place_forget()
   label_carte_small_si.clear()
   start()

# Questa funzione viene eseguita per inizializzare il pannello di gioco e per gestire tutte le oprazioni richieste quando inizia una nuova partita
def start():
    global indice_carta_pensata
    global carta_pensata
    global indice_carta_girata
    global non_indovinate
    global mazzo_carte
    global time_start
    if time_start==0:
       time_start = time.time()
    label_clock.place(x=1300,y=5)
    pulsante_cambia.place(x=60,y=370)
    label_titolo_carta_pensata.place(x=25,y=5)
    label_carta_pensata.config(image=immagini_carte[1])
    label_carta_pensata.place(x=5,y=40)
    label_titolo_mazzo_di_carte.place(x=260,y=5)
    label_mazzo_di_carte.place(x=240,y=40)
    pulsante_gira.place(x=285,y=370)
    label_girate.config(text="   0/"+str(len(mazzo_carte))+"  ")
    label_girate.place(x=500,y=370)
    label_img_indovinate.place(x=750,y=60)
    label_indovinate.config(text=str(indovinate))
    label_indovinate.place(x=820,y=65)
    label_img_non_indovinate.place(x=750,y=150)
    label_non_indovinate.config(text=str(non_indovinate))
    label_non_indovinate.place(x=820,y=158)
    label_titolo_tempo.place(x=35,y=455)
    label_secondi.place(x=30,y=515)
    label_tentativi.place(x=160,y=515)
    label_titolo_tentativi.place(x=153,y=455)
    label_secondi.place(x=30,y=480)
    label_tentativi.place(x=160,y=480)
    label_titolo_score.place(x=280,y=455)
    label_score.place(x=280,y=480)
    pygame.init()
    indice_carta_pensata=2
    carta_pensata=1
    indice_carta_girata=0
    mischia_carte(mazzo_carte)

# Preparazione pannello di gioco
root = tk.Tk()
root.wm_title('Solitario del ferroviere')
root.geometry("1400x600")
root.resizable(False, False)
immagine_indovinate=ImageTk.PhotoImage(Image.open('verde.png'))
immagine_non_indovinate=ImageTk.PhotoImage(Image.open('rosso.png'))
label_titolo_carta_pensata=tk.Label(root, text="CARTA PENSATA",font=("Helvetica", 14))
label_titolo_mazzo_di_carte=tk.Label(root, text="MAZZO DI CARTE",font=("Helvetica", 14))
pulsante_cambia=tk.Button(root,text="CAMBIA", width=10, height=2, bd = 3,command=cambia, bg="seagreen",font=("Helvetica", 12))
pulsante_gira=tk.Button(root,text="GIRA", width=10, height=2, bd = 3,command=gira, bg="teal",font=("Helvetica", 12))
pulsante_mischia=tk.Button(root,text="MISCHIA", width=10, height=2, bd = 3,command=mischia, bg="mediumpurple",font=("Helvetica", 12))
pulsante_nuova_partita=tk.Button(root,text="NUOVA PARTITA", width=15, height=2, bd = 3,command=nuova_partita, bg="darkorange",font=("Helvetica", 12))
label_girate=tk.Label(root, text="   0/10  ",font=("Helvetica", 25),fg="white",bg="tomato")
label_img_indovinate=tk.Label(root, image=immagine_indovinate)
label_indovinate=tk.Label(root, text=str(indovinate),font=("Helvetica", 24))
label_non_indovinate=tk.Label(root, text=str(non_indovinate),font=("Helvetica", 24))
label_img_non_indovinate=tk.Label(root, image=immagine_non_indovinate)
label_clock = tk.Label(root, font=('arial', 14, 'italic'), bg='darkgray',fg='black')
label_titolo_tempo=tk.Label(root, text="TEMPO",font=("times", 12,"italic"),fg="black")
label_titolo_tentativi=tk.Label(root, text="TENTATIVI",font=("times", 12,"italic"),fg="black")
label_secondi=tk.Label(root, font=('arial', 14, 'normal'), bg='blue',fg='white')
label_tentativi=tk.Label(root, font=('arial', 14, 'normal'), bg='orange',fg='white')
label_titolo_score=tk.Label(root, text="SCORE",font=("times", 12,"italic"),fg="black")
label_score=tk.Label(root, font=('arial', 16, 'normal'), bg='palevioletred',fg='white')
logo=ImageTk.PhotoImage(Image.open('logo_sf.png'))
label_logo=tk.Label(root, image=logo)
label_powered_sf=tk.Label(root, text="2020 - Powered by Skill Factory",font=("times", 14,'italic'))
label_powered_sf.place(x=550,y=557)
label_logo.place(x=805,y=545)
immagini_carte=carica_immagini_carte()
label_carta_pensata=tk.Label(root, image=immagini_carte[1])
label_mazzo_di_carte=tk.Label(root, image=immagini_carte[0])
label_carta_girata=tk.Label(root, image=immagini_carte[0])
immagini_carte_small=carica_immagini_carte_small()
label_sinistra=tk.Label(root, image=immagini_carte_small[0])
label_destra=tk.Label(root, image=immagini_carte_small[0])
start()
tick()
root.mainloop()

 

Nella prossima lezione implementeremo le funzionalità  per creare il secondo livello di difficoltà del "Solitario del Ferroviere". 

Arrivederci ...


<< Lezione precedente           Lezione successiva >>



 Per scaricare le risorse di questa lezione clicca sul link seguente:risorse_lezione_04

 



 

Share Button
TOP