Skill Factory
Tutte le categorie
Guida ai corsi della "Scuola di Innovazione Digitale" della Skill Factory
Gino Visciano |
Skill Factory - 06/03/2020 23:01:59 | in Home
Sulla piattafroma Skillbook.it è possibile consultare il catalogo dei corsi della "Scuola di Innovazione Digitale" della Skill Factory.
La scuola nasce con l'obiettivo di facilitare l'apprendimento delle Tecnologie Digitali atraverso una metodologia SMART, che permette anche a chi studia o lavora di acquisire le competenze informatiche per arricchire il proprio curriculum professionale.
La formazione SMART si differenzia da quella TRADIZIONALE perché è flessibile, sostenibile e pone al centro del processo di formazione principalmente gli obiettivi programmati.
In questo modello didattico il formatore diventa un Coach che, con il supporto di consulenti esperti nei diversi settori di specializzazione, ti aiuta a costruire step by step il tuo profilo professionale.
Grazie ai corsi del nostro catalogo, potrai acquisire le competenze che ti servono per specializzarti nei seguenti settori applicativi:
Per accedere all'elenco dei corsi organizzati per settore clicca qui.
Le LEZIONI TEORICHE, svolte dai Coach, pssono essere erogate sia in Presenza, presso la nostra sede di Napoli, sia in Virtual Class, attraverso la piattaforma Skillbook.it.
I LABORATORI PRATICI sono svolti in modalità SMART Working assistita, supportati a distanza dal Coach e dagli esperti del settore di specializzazione.
Per permettere a tutti di seguire le LEZIONI TEORICHE, sono disponibili diverse fasce orarie, come mostra la tabella seguente:
La propedeuticità dei corsi è indicata nelle schede tecniche, il colore delle icone associate ai corsi indica il livello di accesso richiesto:
Percorsi professionali disponibili
1.Sviluppatore di Siti e Portali Web
Front-End Developer - PHP Web Developer
2.Sviluppatore Angular
Front-End Developer - Angular Developer
3.Sviluppatore Java
Front-End Developer - Java Developer - Java Web Developer
4.Sviluppatore C#
Front-End Developer - C# Developer - C# Web Developer
5.Sviluppatore di App Mobile (ANDROID)
Front-End Developer - Java Developer - Java Android Developer
6.Sviluppatore C# di Videogame (UNITY)

7.Sviluppatore Python

Front-End Developer - Python Developer - Python Web Developer
8.Sviluppatore Python di Videogame 2D
Python Developer - Python Game Developer 2D
9.Sviluppatore Hadoop ETL (BIG DATA)
Java Developer - Python Developer - Hadoop ETL Developer
- Corsi a numero chiuso, per informazioni e contatti: sid@skillfactory.it
Formazione SMART a Napoli - La Skill Factory apre la "Scuola d'Innovazione Digitale"
Gino Visciano |
Skill Factory - 13/02/2020 23:31:14 | in Home
A marzo iniziano a Napoli le attività didattiche della nuova "Scuola d'innovazione digitale" della Skill Factory, un progetto pilota di tipo SMART, che nasce con l'obiettivo di favorire l'acquisizione delle employability skills (abilità per l'impiego) richieste nel mondo delle aziende e dell'industria 4.0, per far fronte ai cambiamenti prodotti dalla trasformazione digitale.
L'idea di applicare un modello di apprendimento diverso, basato sulla "Formazione SMART", è importante per rispondere all'esigenza di un'utenza che ha sempre più bisogno di formazione, ma ha sempre meno tempo per formarsi.
La formazione per essere SMART deve avere le seguenti caratteristiche:
Oggi la rivoluzione digitale impone a tutti coloro che studiano o lavorano di acquisire le Soft Skills, le ICT literacy Skills e le Hard Skills indispensabili per governare la crescente diffusione delle tecnologie informatiche e delle macchine sempre più usate nell'era digitale.
L'insegnamento delle competenze digitali è fondamentale anche per le scuole superiori, per fornire agli studenti le competenze trasversali necessarie per entrare nel mondo del lavoro.
Il nuovo modello SMART , proposto dalla Skill Factory, rappresenta un valido supporto anche per gli Education Partner che condividono con l'azienda progetti PCTO.
Con la "Scuola d'innovazione digitale" collaborano Formatori ed Esperti che lavorano nel settore dell'Information Technology e dell'industria 4.0, con competenze avanzate nei seguenti ambiti applicativi:
- Alfabetizzazione Digitale
- Office Automation
- Digital MarKeting
- Videomaking
- Computer Grafica
- E-Commerce
- CRM/ERP
- Sistemi, Reti e Sicurezza
- Cloud computing
- Cyber Security
- Sviluppo Applicativo/Web/Mobile
- Domotica
- Internet of Things
- Big Data
- Machine Learning
- CAD/CAM
- Robotica
Tutti i Corsi ed i Seminari prevedono sia attività didattiche in Presenza, sia in FAD (Virtual Class e Self-Study).
Sono disponibili le seguenti fasce orarie:
Tutto il processo di Assessment, di Formazione e di Certificazione delle competenze è gestito attraverso la piattaforma Skillbook, la community learning che favorisce l'incontro tra domanda ed offerta di formazione e lavoro.
Se sei già registrato su www.skillbook.it, per richiedere infomazioni clicca qui.
Impariamo Python creando il "Calendario Perpetuo" - Lezione 7
Gino Visciano |
Skill Factory - 30/01/2020 23:29:56 | in Tutorials
In questa lezione creiamo un Calendario perpetuo, per ricavare il giorno della settimana di qualsiasi data.
L'algoritmo per creare un calendario perpetuo richiede le seguenti informazioni:
1) Codice dell'anno
2) Codice del mese
3) Numero del giorno della settimana
4) Se l'anno è Bisestile oppure no
Come calcolare il Codice dell'anno
Per calcolare Il codice dell'anno bisogna prima ottenere le due cifre a destra dell'anno scelto, ad esempio per l'anno 2019 serve il 19, che per comodità indichiamo con aa.
In Python per ottenere aa possiamo usare il comando seguente:
La funzione str(...) converte la variabile intera anno in stringa, mentre con [2:] indichiamo a Python di eliminare dalla stringa i due caratteri a sinistra. Infine i due caratteri che restano vengono di nuovo convertiti in intero ed assgnati alla variabile aa.
Successivamente dobbiamo calcolare il codice_anno_intermedio che è dato dalla formula:
codice_anno_intermedio=aa+int(aa/4)
Infine per ottenere il codice_anno occorre sottrarre al codice_anno_intermedio il suo multiplo di 7 più piccolo, come mostra la formula seguente:
codice_anno=codice_anno_intermedio-int(codice_anno_intermedio/7)*7.
Facciamo un esempio, calcoliamo il codice anno del 2019:
1) aa=19
2) codice_anno_intermendio=aa+int(aa/4)=19+4=23
3) codice_anno=codice_anno_intermedio-int(codice_anno_intermedio/7)*7=23-21=2
Come ottenere il Codice del mese
Il codice del mese è un valore intero difficile da calcolare, fortunatmente c'è già chi l'ha fatto per noi, quindi basta guardare semplicemente i risultati ottenuti:
1) gennaio = 6 se l'anno è bisestile 5
2) febbraio = 2 se l'anno è bisestile 1
3) marzo = 2
4) aprile = 5
5) maggio = 0
6) giuugno = 3
7) luglio = 5
8) agosto = 1
9) settembre = 4
10) ottobre = 6
11) novembre = 2
12) dicembre = 4
Come potete vedere per ottenere il codice del mese è importante sapere se l'anno di riferimento è bisestile.
Come verificare se un anno è bisestile
def verificaBisestile(anno):
bisestile=False
if anno%100==0:
if anno%400==0:
bisestile=True
elif anno%4==0:
bisestile=True
return bisestile
In questa funzione l'opertore % (modulo) permette di capire se l'anno è divisibile prima per 100 e poi per 400 oppure se è divisibile direttamente per 4.
1) Lunedì = 1
2) Martedì = 2
3) Meercoledì = 3
4) Giovedì = 4
5) Venerdì = 5
6) Sabato = 6
7) Domenica = 7 oppure 0
La formula per calcolare il numero del giorno è la seguente:
Numero giorno = (Codice anno + Codice Mese + Progressivo giorno del mese)%7
Facciamo un esempio, con un anno non bisestile ed uno bisestile:
Esempio 1
Il 18 marzo 2019, corrisponde ad un lunedì, per verificare calcolare il numero del giorno:
1) aa=19
2) codice_anno_intermendio=aa+int(aa/4)=19+4=23
3) codice_anno=codice_anno_intermedio-int(codice_anno_intermedio/7)*7=23-21=2
4) codice_mese=2
5) Numero giorno = (Codice anno + Codice Mese + Progressivo giorno del mese)%7 = (2+2+18)%7=1
6) Il numero giorno 1 corrisponde a lunedì
Esempio 2
Il 10 gennaio 2020, corrisponde ad un venerdì, per verificare calcolare il numero del giorno:
1) aa=20
2) codice_anno_intermendio=aa+int(aa/4)=20+5=25
3) codice_anno=codice_anno_intermedio-int(codice_anno_intermedio/7)*7=25-21=4
4) codice_mese=5 perché l'anno 2020 è bisestile
5) Numero giorno = (Codice anno + Codice Mese + Progressivo giorno del mese)%7 = (4+5+10)%7=5
6) Il numero giorno 5 corrisponde a venerdi
In Python per ottenere il numero del giorno della settimana di una data qualunque del calendario, possiamo usare la funzione seguente:
aa=int(str(aaaa)[2:])
codici_mesi=[6,2,2,5,0,3,5,1,4,6,2,4]
if verificaBisestile(aaaa)==True:
codici_mesi=[5,1,2,5,0,3,5,1,4,6,2,4]
codice_anno_intermedio=(aa+int(aa/4))
codice_anno=codice_anno_intermedio-int(codice_anno_intermedio/7)*7
giorno=(codice_anno+codici_mesi[mm-1]+gg)%7
return giorno
Analisi del codice Python
# Calendario perpetuo
import tkinter as tk # Classe che permette di creare GUI
from PIL import Image, ImageTk # Classi per gestire immagini
import time # Classe che permette di gestire il tempo
# Funzione che calcola il numero del giorno della settimana
def giornoSettimana(gg,mm,aaaa):
aa=int(str(aaaa)[2:])
codici_mesi=[6,2,2,5,0,3,5,1,4,6,2,4]
if verificaBisestile(aaaa)==True:
codici_mesi=[5,1,2,5,0,3,5,1,4,6,2,4]
codice_anno_intermedio=(aa+int(aa/4))
codice_anno=codice_anno_intermedio-int(codice_anno_intermedio/7)*7
giorno=(codice_anno+codici_mesi[mm-1]+gg)%7
return giorno
# Funzione che stampa i mesi dell'anno scelto
def stampaGiorni(mm,aaaa):
mesi=["Gennaio", "Febbraio", "Marzo", "Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"]
giorni=[31, 28, 31, 30,31,30,31,31,30,31,30,31]
if mm==2:
if verificaBisestile(aaaa)==True:
giorni[1]=29 # Imposta il mese di febbraio a 29 giorni se l'anno è bisestile
conta=0
titolo=mesi[mm-1]+" "+str(aaaa)
centra=" "[:10-int(len(titolo)/2)]
T2.insert(tk.END, '\n'+centra+titolo+'\n')
T2.insert(tk.END, " Lu Ma Me Gi Ve Sa Do\n")
gg_settimana=giornoSettimana(1,mm,aaaa)
if gg_settimana==0:
gg_settimana=7
for i in range(1,gg_settimana):
T2.insert(tk.END, " ")
conta=gg_settimana-1
for gg in range(1,giorni[mm-1]+1):
giorno=" "[:(3-len(str(gg)))]+str(gg)
T2.insert(tk.END, giorno)
conta=conta+1
if conta==7:
T2.insert(tk.END,'\n')
conta=0
T2.insert(tk.END,'\n')
T2.insert(tk.END,"---------------------\n")
# Funzione che verifica se l'anno è bisestile
def verificaBisestile(aaaa):
bisestile=False
if aaaa%100==0:
if aaaa%400==0:
bisestile=True
elif aaaa%4==0:
bisestile=True
return bisestile
# Funzione che imposta l'anno precedente e lo visualizza
def anno_precedente():
global anno
anno=anno-1
label_anno.config(text=anno)
main()
# Funzione che imposta l'anno successivo e lo visualizza
def anno_successivo():
global anno
anno=anno+1
label_anno.config(text=anno)
main()
# Funzione che crea i Frame in cui visualizzare i mesi dell'anno
def main():
global T2
F=[]
offset=0 # Permette di stampare 3 mesi in ogni Frame
for f in range(0,4):
F.append(tk.Frame(Frame_body)) # Il Frame_body contiene 4 Frame ciascuno con 3 mesi
F[f].grid(column = f, row = 0)
for f in range(0,4):
T2=tk.Text(F[f], height=29, width=25,font=("Courier", 12)) # Imposta lo stile del testo per stampare i mesi dell'anno
T2.pack(side=tk.LEFT, fill=tk.Y)
for mm in range(1+offset,4+offset):
stampaGiorni(mm,anno)
offset=offset+3 # Inizio programma
root = tk.Tk()
root.wm_title('CALENDARIO PERPETUO')
root.resizable(False, False)
icona = ImageTk.PhotoImage(Image.open("icona_cal.ico")) # Carica l'immagine dell'icona visualizzata in alto a sinistra della finestra del calendario
root.tk.call("wm", "iconphoto", root._w, icona)
Frame_top=tk.Frame(root)
Frame_top.pack(side="top", fill="both", expand = True) # Associa il Frame_top alla finestra root e lo espande in tutto lo spazio disponibile
# Pulsante freccia a sinistra usato per visualizzare l'anno precedente
freccia_sx=tk.Button(Frame_top,text="<", bd=1,command=anno_precedente, bg="blue",fg="white",font=("courier", 28))
freccia_sx.pack(side="left")
t = time.localtime()
anno=t.tm_year
label_anno = tk.Label(Frame_top, text=anno, bg="blue", fg="white",font=("Courier", 38))
label_anno.pack(side="left",fill="both",expand=True)
# Pulsante freccia a destra usato per visualizzare l'anno successivo
freccia_dx=tk.Button(Frame_top,text=">", bd=1, command=anno_successivo, bg="blue",fg="white",font=("courier", 28))
freccia_dx.pack(side="left")
Frame_body.pack()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
Frame_bottom=tk.Frame(root)
Frame_bottom.pack()
logo=ImageTk.PhotoImage(Image.open('logo_sf.png'))
label_logo=tk.Label(Frame_bottom, image=logo)
label_powered_sf=tk.Label(Frame_bottom, text="2020 - Powered by Skill Factory",font=("times", 14,'italic'))
label_logo.pack(side="left")
label_powered_sf.pack(side="left",fill="both",expand=True)
main()
tk.mainloop()
Questa lezione è sicuramente molto interessante perché oltre a permettere di acquisire nuove conoscenze ed abilità sull'utilizzo del linguaggio Python, permette anche di conoscere le caratteristiche fondamentali del calendario Gregoriano, come ad esempio la durata effettiva di un anno astronomico ed il meccanismo dell'anno bisestile per correggere il ritardo che si accumula ogni quattro anni.
L'applicazione può essere compilata per ottenere un eseguibile che vi permetterà di usare il calendario perpetuo senza dover usare l'interprete Python.
Per compilare lo script Python dovete installare il tool pyinstaller, con il comando:
pip install pyinstaller
Per compilare lo script dovete usare il comando:
pyinstaller calendario.py --noconsole
Dopo la compilazione travate tutto quello che vi serve nella cartella \dist\calendario.
Prima di lanciare il file eseguibile calendario.exe, dovete caricare nella cartella \dist\calendario tutte le immagini.
Arrivederci alla prossima lezione!
Per scaricare le risorse di questa lezione clicca sul link seguente:risorse_lezione_07
EDUCATIONAL GAMING BOOK (EGB) "H2O"
Nell'era dello SMART LEARNING e di PYTHON i libri non si scrivono, ma si sviluppano, in questo modo chi studia, può sperimentare ed apprendere contemporaneamente; un libro con queste caratteristiche lo possiamo definire un Educational Gaming Book (EGB).
"H2O" è un EGB che descrive tutte le caratteristiche dell'acqua, la sostanza formata da molecole di H2O, che attraverso il suo ciclo di vita garantisce la sopravvivenza di tutti gli esseri viventi del Pianeta.
L'obiettivo dell'EGB è quello di far conoscere ai giovani le proprietà dell'acqua, sotto molti aspetti uniche, per sensibilizzarli a salvaguardare un bene comune e raro, indispensabile per la vita.
Per il DOWNLOAD di "H2O" clicca qui.
Impariamo Python giocando al "Solitario del Ferroviere" - Lezione 6
Gino Visciano |
Skill Factory - 19/01/2020 23:16:45 | in Tutorials
In questa lezione completiamo il "Solitario del Ferroviere" implementando i tre livelli previsti: Apprendisti, Principianti ed Esperti.
Come abbiamo già visto nelle lezioni precedenti, i primi due livelli del gioco offrono aiuti differenti, quello per Esperti non prevede nessun tipo di aiuto, dipende tutto dalle capacità del giocatore.
Per scegliere uno dei tre livelli previsti, bisogna cliccare su una delle immagini seguenti presenti sul Frame di avvio:
Le immagini cliccabili, sono associate alle funzioni apprendisti, principainti ed esperti che attivano i Frame con i componenti del livello scelto.
Di seguito i blocchi di codice python delle tre funzioni che permettono di gestire i livelli del solitario:
def apprendista(event):
global livello
frame_avvio.pack_forget()
frame_avvio.quit()
livello=1
root.wm_title('Solitario del ferroviere:[Apprendista]')
crea_primo_livello_solitario(root)
def principiante(event):
global livello
frame_avvio.pack_forget()
frame_avvio.quit()
livello=2
root.wm_title('Solitario del ferroviere:[Principiante]')
crea_altri_livelli_solitario(root)
def esperto(event):
global livello
frame_avvio.pack_forget()
frame_avvio.quit()
livello=3
root.wm_title('Solitario del ferroviere:[Esperto]')
crea_altri_livelli_solitario(root)
Come creare il pannello di gioco ed avviare il livello di avvio
import pygame # Libreria usata nel gioco per gestire i suoni
import random # Libreria che serve a gestire valori casuale
import tkinter as tk # Libreria usata per creare, pannelli e finestre
import time # Libreria per gestire il tempo
from tkinter import messagebox # Libreria per gestire le finestre modali di scelta
root.wm_title('Solitario del ferroviere')
root.geometry("1400x600")
root.resizable(False, False)
root.protocol("WM_DELETE_WINDOW", on_closing)
flag=False # flag=True aggiorna tempo e punteggio, flag=False aggiorna solo orologio
crea_avvio_solitario(root) # Questa funzione crea ed avvia il livello di avvio del solitario
root.mainloop()
Come creare il livello di avvio del gioco e rendere le immagini cliccabili
Il codice seguente mostra come caricare le immagini dei livelli di gioco ed associarle ad un evento di tipo click per avviare le funzioni: apprendisti, principainti ed esperti.
def crea_avvio_solitario(root):
global frame_avvio
global livello
livello=0
# Creazione Frame del livello di avvio (frame_avvio) ed associazione al pannello di gioco root
frame_avvio=tk.Frame(root)
frame_avvio.pack(side="top", fill="both", expand = True)
immagine_titolo=ImageTk.PhotoImage(Image.open('titolo_solitario_del_ferroviere.png'))
# Caricamento immagini
immagine_apprendisti=ImageTk.PhotoImage(Image.open('apprendisti.png'))
immagine_principianti=ImageTk.PhotoImage(Image.open('principianti.png'))
immagine_esperti=ImageTk.PhotoImage(Image.open('esperti.png'))
immagine_asso=ImageTk.PhotoImage(Image.open('1coppe.png'))
immagine_retro=ImageTk.PhotoImage(Image.open('Carte_Napoletane_retro.png'))
label_titolo=tk.Label(frame_avvio, image=immagine_titolo)
label_titolo.place(x=180,y=5)
# Posizionamento delle immagini sul Frame del livello di avvio ed attivazione (bind(...)) dell'evento click alle funzioni apprendiata, principiante ed esperto
label_apprendisti=tk.Label(frame_avvio, image=immagine_apprendisti)
label_apprendisti.place(x=100,y=280)
label_apprendisti.bind("<Button>",apprendista)
label_principianti=tk.Label(frame_avvio, image=immagine_principianti)
label_principianti.place(x=355,y=280)
label_principianti.bind("<Button>",principiante)
label_esperti=tk.Label(frame_avvio, image=immagine_esperti)
label_esperti.place(x=600,y=280)
label_esperti.bind("<Button>",esperto)
label_asso=tk.Label(frame_avvio, image=immagine_asso)
label_asso.place(x=870,y=180)
label_retro=tk.Label(frame_avvio, image=immagine_retro)
label_retro.place(x=1100,y=180)
label_messaggio=tk.Label(frame_avvio, text="Scegli il livello per iniziare a giocare ...",font=("times", 18,'italic'))
label_messaggio.place(x=240,y=210)
logo=ImageTk.PhotoImage(Image.open('logo_sf.png'))
label_logo=tk.Label(frame_avvio, image=logo)
label_powered_sf=tk.Label(frame_avvio, 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)
frame_avvio.mainloop()
Come creare il primo livello di gioco
Il codice seguente mostra come creare il primo livello di gioco:
def crea_primo_livello_solitario(root):
global frame_primo_livello_solitario
global label_carte_small_si
global label_carte_small_no
global immagini_carte
global immagini_carte_small
global label_mazzo_di_carte
global label_carta_girata
global label_non_indovinate
global label_indovinate
global label_girate
global label_carta_pensata
global label_clock
global label_titolo_tempo
global label_titolo_tentativi
global label_secondi
global label_tentativi
global label_titolo_score
global label_score
global pulsante_gira
global pulsante_mischia
global pulsante_nuova_partita
# Creazione Frame del primo livello di gioco (frame_primo) ed associazione al pannello di gioco root
frame_primo_livello_solitario=tk.Frame(root)
frame_primo_livello_solitario.pack(side="top", fill="both", expand = True)
#Orologio
label_clock = tk.Label(frame_primo_livello_solitario, font=('arial', 14, 'italic'), bg='darkgray',fg='black')
label_titolo_tempo=tk.Label(frame_primo_livello_solitario, text="TEMPO",font=("times", 12,"italic"),fg="black")
label_titolo_tentativi=tk.Label(frame_primo_livello_solitario, text="TENTATIVI",font=("times", 12,"italic"),fg="black")
label_secondi=tk.Label(frame_primo_livello_solitario, font=('arial', 14, 'normal'), bg='blue',fg='white')
label_tentativi=tk.Label(frame_primo_livello_solitario, font=('arial', 14, 'normal'), bg='orange',fg='white')
label_titolo_score=tk.Label(frame_primo_livello_solitario, text="SCORE",font=("times", 12,"italic"),fg="black")
label_score=tk.Label(frame_primo_livello_solitario, font=('arial', 16, 'normal'), bg='palevioletred',fg='white')
immagine_indovinate=ImageTk.PhotoImage(Image.open('verde.png'))
immagine_non_indovinate=ImageTk.PhotoImage(Image.open('rosso.png'))
label_titolo_carta_pensata=tk.Label(frame_primo_livello_solitario, text="CARTA PENSATA",font=("Helvetica", 14))
label_titolo_mazzo_di_carte=tk.Label(frame_primo_livello_solitario, text="MAZZO DI CARTE",font=("Helvetica", 14))
#Pulsanti per gestire il gioco
pulsante_cambia=tk.Button(frame_primo_livello_solitario,text="CAMBIA", width=10, height=2, bd = 3,command=cambia, bg="seagreen",font=("Helvetica", 12))
pulsante_gira=tk.Button(frame_primo_livello_solitario,text="GIRA", width=10, height=2, bd = 3,command=gira_primo, bg="teal",font=("Helvetica", 12))
pulsante_mischia=tk.Button(frame_primo_livello_solitario,text="MISCHIA", width=10, height=2, bd = 3,command=mischia_primo, bg="mediumpurple",font=("Helvetica", 12))
pulsante_nuova_partita=tk.Button(frame_primo_livello_solitario,text="NUOVA PARTITA", width=15, height=2, bd = 3,command=nuova_partita_primo, bg="darkorange",font=("Helvetica", 12))
label_girate=tk.Label(frame_primo_livello_solitario, text=" 0/10 ",font=("Helvetica", 25),fg="white",bg="tomato")
label_img_indovinate=tk.Label(frame_primo_livello_solitario, image=immagine_indovinate)
label_indovinate=tk.Label(frame_primo_livello_solitario, text=str(indovinate),font=("Helvetica", 24))
label_non_indovinate=tk.Label(frame_primo_livello_solitario, text=str(non_indovinate),font=("Helvetica", 24))
label_img_non_indovinate=tk.Label(frame_primo_livello_solitario, image=immagine_non_indovinate)
immagini_carte=carica_immagini_carte()
label_carta_pensata=tk.Label(frame_primo_livello_solitario, image=immagini_carte[1])
label_mazzo_di_carte=tk.Label(frame_primo_livello_solitario, image=immagini_carte[0])
label_carta_girata=tk.Label(frame_primo_livello_solitario, image=immagini_carte[0])
immagini_carte_small=carica_immagini_carte_small()
logo=ImageTk.PhotoImage(Image.open('logo_sf.png'))
label_logo=tk.Label(frame_primo_livello_solitario, image=logo)
label_powered_sf=tk.Label(frame_primo_livello_solitario, text="2020 - Powered by Skill Factory",font=("times", 14,'italic'))
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)
label_powered_sf.place(x=550,y=557)
label_logo.place(x=805,y=545)
start_primo()
# Se il flag avviaTick e True viene eseguita la funzione Tick(). Questa funzione ogni 200 millisecondi aggiorna l'orologio, il tempo trascorso ed il punteggio
if avviaTick:
tick()
frame_primo_livello_solitario.mainloop()
Come creare gli altri livello di gioco
Il codice seguente mostra come creare gli altri livelli di gioco:
global frame_altri_livelli_solitario
global label_mazzo_di_carte
global label_carta_girata
global label_girate
global label_carta_pensata
global label_clock
global label_titolo_tempo
global label_titolo_tentativi
global label_secondi
global label_tentativi
global label_titolo_score
global label_score
global pulsante_gira
global pulsante_mischia
global pulsante_nuova_partita
global immagini_carte
global label_titolo_carta_da_indovinare
global label_titolo_carte_indovinate
global label_titolo_carte_non_indovinate
global label_indovinate
global label_non_indovinate
global label_carta_indovinata
global label_carta_non_indovinata
global label_carte_da_indovinare
global label_carta_non_indovinata_retro
global livello
# Creazione Frame per il secondo e terzo livello di gioco (frame_altri_livelli) ed associazione al pannello di gioco root
frame_altri_livelli_solitario=tk.Frame(root)
frame_altri_livelli_solitario.pack(side="top", fill="both", expand = True)
label_titolo_carte_indovinate=tk.Label(frame_altri_livelli_solitario, text="CARTE INDOVINATE",font=("Helvetica", 14),fg="green")
label_titolo_carte_non_indovinate=tk.Label(frame_altri_livelli_solitario, text="CARTE NON INDOVINATE",font=("Helvetica", 14),fg="red")
label_indovinate=tk.Label(frame_altri_livelli_solitario, text=" 0 ",font=("Helvetica", 25),fg="white",bg="green")
label_non_indovinate=tk.Label(frame_altri_livelli_solitario, text=" 0 ",font=("Helvetica", 25),fg="white",bg="red")
label_clock = tk.Label(frame_altri_livelli_solitario, font=('arial', 14, 'italic'), bg='darkgray',fg='black')
label_titolo_tempo=tk.Label(frame_altri_livelli_solitario, text="TEMPO",font=("times", 12,"italic"),fg="black")
label_titolo_tentativi=tk.Label(frame_altri_livelli_solitario, text="TENTATIVI",font=("times", 12,"italic"),fg="black")
label_secondi=tk.Label(frame_altri_livelli_solitario, font=('arial', 14, 'normal'), bg='blue',fg='white')
label_tentativi=tk.Label(frame_altri_livelli_solitario, font=('arial', 14, 'normal'), bg='orange',fg='white')
label_titolo_score=tk.Label(frame_altri_livelli_solitario, text="SCORE",font=("times", 12,"italic"),fg="black")
label_score=tk.Label(frame_altri_livelli_solitario, font=('arial', 16, 'normal'), bg='palevioletred',fg='white')
label_titolo_carta_pensata=tk.Label(frame_altri_livelli_solitario, text="CARTA PENSATA",font=("Helvetica", 14))
label_titolo_mazzo_di_carte=tk.Label(frame_altri_livelli_solitario, text="MAZZO DI CARTE",font=("Helvetica", 14))
#Pulsanti per gestire il gioco
pulsante_cambia=tk.Button(frame_altri_livelli_solitario,text="CAMBIA", width=10, height=2, bd = 3,command=cambia, bg="seagreen",font=("Helvetica", 12))
pulsante_gira=tk.Button(frame_altri_livelli_solitario,text="GIRA", width=10, height=2, bd = 3,command=gira_altri, bg="teal",font=("Helvetica", 12))
pulsante_mischia=tk.Button(frame_altri_livelli_solitario,text="MISCHIA", width=10, height=2, bd = 3,command=mischia_altri, bg="mediumpurple",font=("Helvetica", 12))
pulsante_nuova_partita=tk.Button(frame_altri_livelli_solitario,text="NUOVA PARTITA", width=15, height=2, bd = 3,command=nuova_partita_altri, bg="darkorange",font=("Helvetica", 12))
label_girate=tk.Label(frame_altri_livelli_solitario, text=" 0/10 ",font=("Helvetica", 25),fg="white",bg="tomato")
immagini_carte=carica_immagini_carte()
label_carta_pensata=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[1])
label_mazzo_di_carte=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
label_carta_girata=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
label_carte_da_indovinare=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
label_carta_girata=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
logo=ImageTk.PhotoImage(Image.open('logo_sf.png'))
label_logo=tk.Label(frame_altri_livelli_solitario, image=logo)
label_powered_sf=tk.Label(frame_altri_livelli_solitario, text="2020 - Powered by Skill Factory",font=("times", 14,'italic'))
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_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)
label_powered_sf.place(x=550,y=557)
label_logo.place(x=805,y=545)
label_carta_indovinata=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
label_carta_non_indovinata=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
if livello==2:
label_carta_non_indovinata=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
label_carta_non_indovinata.bind("<Button>",gira_carta_non_indovinata)
immagine_help=ImageTk.PhotoImage(Image.open('help.png'))
label_carta_non_indovinata_help=tk.Label(frame_altri_livelli_solitario, image=immagine_help)
label_carta_non_indovinata_help.place(x=1230,y=150)
label_carta_non_indovinata_help.bind("<Button>",help_frame_show)
label_carta_non_indovinata_retro=tk.Label(frame_altri_livelli_solitario, image=immagini_carte[0])
label_carta_non_indovinata_retro.bind("<Button>",gira_carta_non_indovinata_back)
label_carta_non_indovinata_help.place(x=1230,y=150)
label_carta_non_indovinata_help.bind("<Button>",help_frame_show)
start_altri()
if avviaTick:
tick()
frame_altri_livelli_solitario.mainloop()
Come abbandonare il Solitario oppure un livello di gioco
Per abbandonare il livello di gioco scelto oppure uscire dal Solitario, basta cliccare sull'icona close in alto a destra del Pannello di gioco.
La finestra modele seguente permette di abbandonare un livello di gioco.
La finestra modele seguente permette di uscire dal Solitario.
Per associare all'icona close del Pannello di gioco la funzione per abbandonare il livello di gioco oppure il Solitario abbiamo usato il codice seguete:
root.protocol("WM_DELETE_WINDOW", on_closing)
def on_closing():
if livello==0:
if messagebox.askokcancel("EXIT", "Vuoi uscire dal solitario?"):
root.destroy()
else:
if messagebox.askokcancel("EXIT", "Vuoi abbandonare il gioco?"):
torna_avvio_solitario()
La funzione torna_avvio_solitario() permette di abbandonare il livello di gioco corrente e tornare al livello di avvio.
def torna_avvio_solitario():
global mazzo_carte
global mazzo_carte_non_indovinate
global indovinate
global non_indovinate
global offset_indovinate
global offset_non_indovinate
global tentativi
global score
global conta_score
global time_start
global livello
global flag
if livello==1:
frame_primo_livello_solitario.pack_forget()
frame_primo_livello_solitario.quit()
elif livello>1:
frame_altri_livelli_solitario.pack_forget()
frame_altri_livelli_solitario.quit()
mazzo_carte=[1,2,3,4,5,6,7,8,9,10]
mazzo_carte_non_indovinate.clear()
livello=0
flag=False
indovinate=0
offset_indovinate=50
non_indovinate=0
offset_non_indovinate=50
tentativi=1
score=1000
conta_score=0
time_start=0
crea_avvio_solitario(root)
Descrizione delle Funzioni usate nel gioco
def tick(): Aggiorna l'orologio, il tempo ed il punteggio ogni 200 millisecondi
def suono(sound,tempo): Gestisce i suoni del gioco
def on_closing(): Associa all'icona close del Pannello di gioco la funzione per abbandonare il livello di gioco oppure il Solitario
def mischia_carte(mazzo): Mischia le carte del mazzo centrale
def carica_immagini_carte(): Carica le immagini del gioco
def carica_immagini_carte_small(): Carica le immagini del primo livello di gioco
def cambia(): Permette di scegliere la carta pensata
def gira_primo(): Gira le carte del mazzo centrale del primo livello di gioco
def gira_altri(): Gira le carte del mazzo centrale del secondo e terzo livello di gioco
def nuova_partita_primo(): Avvia una nuova partita nel primo livello di gioco
def nuova_partita_altri(): Avvia una nuova partita nel secondo e terzo livello di gioco
def mischia_primo(): Mischia le carte nel primo livello di gioco
def mischia_altri(): Mischia le carte nel secondo e terzo livello di gioco
def torna_avvio_solitario(): Abbandona il livello di gioco corrente e torna al livello di avvio
def gira_carta_non_indovinata(event): Gira le carte del mazzo di carte non indovinate
def gira_carta_non_indovinata_back(event): Gira le carte del mazzo di carte non indovinate
def ripristina_carte_non_indovinate(): Ripristina il mazzo di carte non indovinate se si gira una carta del mazzo centrale
def help_frame_hidden(): Nasconde l'help del secondo livello di gioco
def help_frame_show(event): Mostra l'help del secondo livello di gioco
def apprendista(event): Avvia il primo livello di gioco
def principiante(event): Avvia il secondo livello di gioco
def esperto(event): Avvia il terzo livello di gioco
def crea_avvio_solitario(root): Avvia il livello di avvio del solitario
def crea_primo_livello_solitario(root): Crea il frame con tutti i componenti del primo livello di gioco
def crea_altri_livelli_solitario(root): Crea il frame con tutti i componenti del secondo e terzo livello di gioco
def start_primo(): Inizializza il primo livello di gioco
def start_altri(): Inizializza il secondo e terzo livello di gioco
Conclusioni
Con questa lezione il gioco del "Solitario del Ferroviere" è finito, sicuramente può essere migliorato e possono essere aggiunte ultriori funzionalità, come ad esempio la registrazione dei punteggi migliori raggiunti, per creare una classifica dei giocatori più bravi.
Il gioco può essere compilato per ottenere un eseguibile che vi permetterà di giocare senza dover usare l'interprete Python.
Per compilare uno script Python potete installare il tool pyinstaller, con il comando:
pip install pyinstaller
Per compilare lo script dovete usare il comando:
pyinstaller solitario_del_ferroviere.py --noconsole
Dopo la compilazione travate tutto quello che vi serve nella cartella \dist\solitario_del_ferroviere.
Prima di lanciare il file eseguibile solitario_del_ferroviere.exe, dovete caricare nella cartella \dist\solitario_del_ferroviere tutte le immagini ed i file audio.
Buon divertimento ed arrivederci alla prossima lezione!
<< Lezione precedente Lezione successiva >>
Per scaricare le risorse di questa lezione clicca sul link seguente:risorse_lezione_06
Impariamo Python giocando al "Solitario del Ferroviere" - Lezione 5
Gino Visciano |
Skill Factory - 06/01/2020 22:33:30 | in Tutorials
Nella lezione precedente abbiamo completato il primo livello del "Solitario del Ferroviere", questo livello è stato creato per gli apprendisti che intendono imparare a giocare, senza grosse difficoltà. La caratteristica principale è quella che sia le carte indovinate, sia quelle non indovinate sono scoperte, in modo da rendere più facile la scelta della carta da pensare, come mostra l'immagine seguente.
In questa lezione completiamo il secondo livello del "Solitario del Ferroviere", creato per i principianti. A differenza del livello precedente, qui sia le carte indovinate, sia quelle non indovinate sono coperte, come mostra l'immagine seguente:
A cosa serve l'icona Help me!
L'icona Help me! segnala al giocatore come ottenere un aiuto per ricordare quali sono le le carte non indovinate.
Cliccando sull'icona Help me! appare la finestra seguente:
Il messaggio di aiuto indica al giocatore come vedere le carte non indovinate:
L'immagine Help me! sparisce automaticamente dopo 5 secondi. Per ottenere questo effetto, sono state utilizzate le funzioni seguenti:
# Disattiva la finestra Help me!
def help_frame_hidden():
global help_show
help_show.place_forget()
# Attiva la finestra Help me!
def help_frame_show(event):
global help_show
help_show=tk.Frame(root)
label_carta_non_indovinata_help_show=tk.Label(help_show, image=immagine_help_show)
label_carta_non_indovinata_help_show.pack()
help_show.place(x=1000,y=60)
suono(11,0.1)
# Dopo 5000 millisecondi (5 secondi) esegue la funzione help_frame_hidden
help_show.after(5000,help_frame_hidden)
Come rendere cliccabile l'icona Help me
L'icona Help me, corrisponde all'immagine seguente:
Per renderla cliccabile è stato utilizzato il codice seguente:
immagine_help=ImageTk.PhotoImage(Image.open('help.png')) # Carica l'immagine dell'icona
label_carta_non_indovinata_help=tk.Label(root, image=immagine_help) # Associa l'immagine dell'icona all'etichetta
label_carta_non_indovinata_help.place(x=1230,y=150) # Visualizza l'etichetta con l'immagine dell'icona sul piano di gioco
# La funzione bind permette di associare all'etichetta l'evento click (<button> ) per eseguire la funzione help_frame_show
label_carta_non_indovinata_help.bind("<Button>",help_frame_show)
Come consultare le carte sbagliate cliccando sul mazzo delle carte non indovinate
Per poter gestire questa funzionalità è stato applicato l'algoritmo seguente:
Inizio (Azione 1)
Mentre clicchi su una carta del mazzo
Se carte del mazzo non indivinate>1 allora
Se non è l'ultima carta del mazzo allora
Se è la prima carta allora
visualizza carta precedente
visualizza retro carta a desta
Altrimenti
visualizza carta precedente
Fine se
Fine se
Fine se
Fine Mentre
Fine
Inizio (Azione 2)
Mentre clicchi sul retro della carta a destra
Se la carte del mazzo visualizzata non è la penultima allora
Visualizza la carta precedente a quella visualizzata
Altrimenti
visualizza la prima carta del mazzo
nascondi il retro della carta a destra
Fine se
Fine Mentre
Fine
label_carta_non_indovinata.bind("<Button>",gira_carta_non_indovinata)
label_carta_non_indovinata_retro.bind("<Button>",gira_carta_non_indovinata_back)
In questo modo, quando si clicca su una carta del mazzo delle carte non indovinate, si attiva la funzione gira_carta_non_indovinata, quando si clicca sul retro, si attiva la funzione gira_carta_non_indovinata_back. Le due funzioni permettono di vedere tutte le carte del mazzo delle carte non indovinate.
# Ad ogni click gira le carte del mazzo e mostra la carta successiva
def gira_carta_non_indovinata(event):
global indice_gira_carta_non_indovinata
if len(mazzo_dx)>1 and indice_gira_carta_non_indovinata>0:
label_carta_non_indovinata_retro.place(x=1175,y=40)
indice_gira_carta_non_indovinata-=1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
suono(2,0.1)
else:
suono(6,0.1)
# Ad ogni click gira le carte del mazzo e mostra la carta precedente
def gira_carta_non_indovinata_back(event):
global mazzo_dx
global indice_gira_carta_non_indovinata
if indice_gira_carta_non_indovinata<len(mazzo_dx)-2:
indice_gira_carta_non_indovinata+=1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
else:
label_carta_non_indovinata_retro.place_forget()
indice_gira_carta_non_indovinata+=1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
suono(1,0.1)
Come ripristinare le carte del mazzo carte non indovinate quando si gira una nuova carta dal mazzo centrale
Quando viene girata una nuova carta dal mazzo centrale, il mazzo delle carte non indovinate deve essere ripristinato, per ottenere questo risultato è stata implementata la funzione seguente:
def ripristina_carte_non_indovinate():
if len(mazzo_dx)>1:
label_carta_non_indovinata_retro.place_forget()
indice_gira_carta_non_indovinata=len(mazzo_dx)-1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
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_centrale=[1,2,3,4,5,6,7,8,9,10] # Lista con i valori delle carte (mazzo di carte centrale)
mazzo_sx=[] # Lista con i valori delle carte (mazzo di carte indovinate)
mazzo_dx=[] # Lista con i valori delle carte (mazzo di carte non indovinate)
immagini_carte=[] # Lista con i riferimenti delle immagini delle carte
indice_carta_pensata=0
indice_carta_girata=0
indice_gira_carta_non_indovinata=0
time1=0
time_start=0
tentativi=1
score=1000
conta_score=0
flag=True # Abilita (True) e disabilita (False) l'aggiornamento dei secondi e del punteggio
help_show=None # Riferimento della finestra Help me!
# Termina l'applicazione
def esci():
root.quit()
# Ogni 200 millisecondi aggiorna secondi, tentativi, punteggio ed orologio
def tick():
global time1
global time_start
global tentativi
global score
global conta_score
global flag
# legge ora locale del pc
if flag: # Abilita/Disabilita aggiornamento secondi e punteggio
time2 = time.strftime('%H:%M:%S')
if time2 != time1:
time1 = time2
label_clock.config(text=time2)
secondi=int(round(time.time()-time_start,0))
conta_score+=1
if conta_score>10:
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 ")
info=messagebox.showinfo('Fine Partita', 'GAME OVER')
esci()
# chiama se stessa (ricorsiva) ogni 200 milliseconds
label_clock.after(200, tick)
# Mischia i valori delle carte del mazzo centrale
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
# Gestisce i suoni e le durate
def suono(sound,tempo):
if sound==1:
pygame.mixer_music.load("Click.wav")
elif sound==2:
pygame.mixer_music.load("PenSound.wav")
elif sound==3:
pygame.mixer_music.load("ToggleSound.wav")
elif sound==4:
pygame.mixer_music.load("TickSound.mp3")
elif sound==5:
pygame.mixer_music.load("ToneSound.wav")
elif sound==6:
pygame.mixer_music.load("PlingSound.wav")
elif sound==7:
pygame.mixer_music.load("OvationSound.wav")
elif sound==8:
pygame.mixer_music.load("ElectronicSound.wav")
elif sound==9:
pygame.mixer_music.load("CardSound.wav")
elif sound==10:
pygame.mixer_music.load("BranchSound.wav")
elif sound==11:
pygame.mixer_music.load("smsalertSound.wav")
elif sound==12:
pygame.mixer_music.load("ComputerSound.wav")
pygame.mixer_music.play()
time.sleep(tempo)
# Carica le immagini delle carte ed aggiunge i riferimenti alla 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
# Si attiva quando si clicca sul pulsante gira, alza le carte del mazzo centrale e controlla se la carta alzata è uguale alla carta pensata
def gira():
global indice_carta_girata
global indice_carta_pensata
global indice_gira_carta_non_indovinata
global mazzo_centrale
global flag
ripristina_carte_non_indovinate()
max=len(mazzo_centrale)-1
if indice_carta_pensata==1:
carta_pensata=10
else:
carta_pensata=indice_carta_pensata-1
label_carta_girata.config(image=immagini_carte[mazzo_centrale[indice_carta_girata]])
label_carta_girata.place(x=475,y=40)
girate=" "+str(indice_carta_girata+1)+"/"+str(max+1)+" "
label_girate.config(text=girate)
label_girate.place(x=520,y=370)
if carta_pensata==mazzo_centrale[indice_carta_girata]:
mazzo_sx.append(mazzo_centrale[indice_carta_girata])
indovinate= " "+str(len(mazzo_sx))+" "
if len(mazzo_sx)==10:
indovinate=indovinate[:9]
label_indovinate.config(text=indovinate)
label_indovinate.place(x=765,y=370)
label_carta_indovinata.config(image=immagini_carte[mazzo_centrale[indice_carta_girata]])
label_carta_indovinata.place(x=710,y=40)
suono(5,0.1)
else:
mazzo_dx.append(mazzo_centrale[indice_carta_girata])
indice_gira_carta_non_indovinata=len(mazzo_dx)-1
non_indovinate= " "+str(len(mazzo_dx))+" "
if len(mazzo_dx)==10:
non_indovinate=non_indovinate[:9]
label_non_indovinate.config(text=non_indovinate)
label_non_indovinate.place(x=1000,y=370)
label_carta_non_indovinata.config(image=immagini_carte[mazzo_centrale[indice_carta_girata]])
label_carta_non_indovinata.place(x=945,y=40)
suono(3,0.1)
if indice_carta_girata<max:
indice_carta_girata=indice_carta_girata+1
else:
label_carte_da_indovinare.place_forget()
label_carta_girata.place_forget()
pulsante_gira.place_forget()
label_girate.place_forget()
indice_carta_girata=0
if(len(mazzo_dx)>0):
suono(8,0.5)
pulsante_mischia.place(x=290,y=370)
else:
suono(7,0.3)
pulsante_nuova_partita.place(x=290,y=370)
flag=False
# Si attiva quando si clicca sul pulsante cambia, permette di scegliere la carta pensata
def cambia():
global 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(4,0.1)
# Si attiva quando si clicca sul pulsante mischia, avvia tutta la procedura per mischiare le carte
def mischia():
global mazzo_centrale
global indice_carta_pensata
global tentativi
global score
suono(9,4)
tentativi=tentativi+1
score=int(score/2)
mazzo_centrale.clear()
mazzo_centrale=mazzo_dx[:]
ripristina_carte_non_indovinate()
mazzo_dx.clear()
mischia_carte(mazzo_centrale)
label_carta_girata.place_forget()
label_carta_non_indovinata.place_forget()
label_carta_pensata.config(image=immagini_carte[1])
indice_carta_pensata=2
label_carta_girata.config(image=immagini_carte[0])
label_carte_da_indovinare.place(x=245,y=40)
label_non_indovinate.config(text=" 0 ")
label_non_indovinate.place(x=1000,y=370)
girate=" 0/"+str(len(mazzo_centrale))+" "
label_girate.config(text=girate)
label_girate.place(x=520,y=370)
pulsante_gira.place(x=290,y=370)
pulsante_mischia.place_forget()
# Si attiva quando si clicca sul pulsante nuova_partita, avvia tutta la procedura per iniziare una nuova partita
def nuova_partita():
global mazzo_dx
global mazzo_sx
global mazzo_centrale
global indice_carta_pensata
global indice_carta_girata
global indice_gira_carta_non_indovinata
global tentativi
global score
global conta_score
global time_start
global flag
mazzo_centrale=[1,2,3,4,5,6,7,8,9,10]
mazzo_sx=[]
ripristina_carte_non_indovinate()
mazzo_dx=[]
indice_carta_pensata=0
indice_carta_girata=0
indice_gira_carta_non_indovinata=0
tentativi=1
score=1000
conta_score=0
flag=True
time_start=time.time()
label_carta_indovinata.place_forget()
label_carta_non_indovinata.place_forget()
label_carta_girata.place_forget()
label_carta_pensata.config(image=immagini_carte[1])
indice_carta_pensata=2
label_carta_girata.config(image=immagini_carte[0])
label_carte_da_indovinare.place(x=245,y=40)
label_indovinate.config(text=" 0 ")
label_indovinate.place(x=765,y=370)
label_non_indovinate.config(text=" 0 ")
label_non_indovinate.place(x=1000,y=370)
girate=" 0/"+str(len(mazzo_centrale))+" "
label_girate.config(text=girate)
label_girate.place(x=520,y=370)
pulsante_gira.place(x=290,y=370)
pulsante_nuova_partita.place_forget()
mischia_carte(mazzo_centrale)
suono(12,2.5)
# Si attiva quando si clicca sulla carta del mazzo carte non indovinate, mostra la carta precedente se disponibile
def gira_carta_non_indovinata(event):
global indice_gira_carta_non_indovinata
if len(mazzo_dx)>1 and indice_gira_carta_non_indovinata>0:
label_carta_non_indovinata_retro.place(x=1175,y=40)
indice_gira_carta_non_indovinata-=1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
suono(2,0.1)
else:
suono(6,0.1)
# Si attiva quando si clicca sul retro di una carta del mazzo carte non indovinate, riscopre le carte girate
def gira_carta_non_indovinata_back(event):
global mazzo_dx
global indice_gira_carta_non_indovinata
if indice_gira_carta_non_indovinata<len(mazzo_dx)-2:
indice_gira_carta_non_indovinata+=1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
else:
label_carta_non_indovinata_retro.place_forget()
indice_gira_carta_non_indovinata+=1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
suono(1,0.1)
def ripristina_carte_non_indovinate():
if len(mazzo_dx)>1:
label_carta_non_indovinata_retro.place_forget()
indice_gira_carta_non_indovinata=len(mazzo_dx)-1
label_carta_non_indovinata.config(image=immagini_carte[mazzo_dx[indice_gira_carta_non_indovinata]])
label_carta_non_indovinata.place(x=945,y=40)
# Disattiva la finestra Help me!
def help_frame_hidden():
global help_show
help_show.place_forget()
# Attiva la finestra Help me!
def help_frame_show(event):
global help_show
help_show=tk.Frame(root)
label_carta_non_indovinata_help_show=tk.Label(help_show, image=immagine_help_show)
label_carta_non_indovinata_help_show.pack()
help_show.place(x=1000,y=60)
suono(11,0.1)
help_show.after(5000,help_frame_hidden)
# Inizia una nuova partita
def start():
global indice_carta_pensata
global indice_carta_girata
global time_start
pulsante_gira.place(x=290,y=370)
pulsante_cambia.place(x=60,y=370)
label_titolo_carta_pensata.place(x=25,y=5)
label_carta_pensata.place(x=5,y=40)
label_carte_da_indovinare.place(x=245,y=40)
label_titolo_carta_da_indovinare.place(x=230,y=5)
label_titolo_carte_indovinate.place(x=710,y=5)
label_titolo_carte_non_indovinate.place(x=920,y=5)
label_girate.place(x=520,y=370)
label_indovinate.place(x=765, y=370)
label_non_indovinate.place(x=1000, y=370)
label_clock.place(x=1300,y=5)
if time_start==0:
time_start = time.time()
label_titolo_tempo.place(x=30,y=490)
label_secondi.place(x=30,y=515)
label_tentativi.place(x=160,y=515)
label_titolo_tentativi.place(x=160,y=490)
label_titolo_score.place(x=280,y=490)
label_score.place(x=280,y=515)
pygame.init()
indice_carta_pensata=2
indice_carta_girata=0
# Preparazione pannello di gioco
root = tk.Tk()
root.wm_title('Solitario del ferroviere')
root.geometry("1400x600")
root.resizable(False, False)
immagine_help=ImageTk.PhotoImage(Image.open('help.png'))
label_carta_non_indovinata_help=tk.Label(root, image=immagine_help)
immagine_help_show=ImageTk.PhotoImage(Image.open('help_show.png'))
pulsante_gira=tk.Button(root,text="GIRA", width=10, height=2, bd = 3,command=gira, bg="teal",font=("Helvetica", 12))
pulsante_cambia=tk.Button(root,text="CAMBIA", width=10, height=2, bd = 3,command=cambia, bg="seagreen",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_titolo_carta_pensata=tk.Label(root, text="CARTA PENSATA",font=("Helvetica", 14))
label_titolo_carta_da_indovinare=tk.Label(root, text="CARTE DA INDOVINARE",font=("Helvetica", 14))
label_titolo_carte_indovinate=tk.Label(root, text="CARTE INDOVINATE",font=("Helvetica", 14),fg="green")
label_titolo_carte_non_indovinate=tk.Label(root, text="CARTE NON INDOVINATE",font=("Helvetica", 14),fg="red")
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_titolo_score=tk.Label(root, text="SCORE",font=("times", 12,"italic"),fg="black")
label_indovinate=tk.Label(root, text=" 0 ",font=("Helvetica", 25),fg="white",bg="green")
label_powered_sf=tk.Label(root, text="2020 - Powered by Skill Factory",font=("times", 14,'italic'))
label_non_indovinate=tk.Label(root, text=" 0 ",font=("Helvetica", 25),fg="white",bg="red")
label_girate=tk.Label(root, text=" 0/10 ",font=("Helvetica", 25),fg="white",bg="tomato")
label_clock = tk.Label(root, font=('arial', 16, 'italic'), bg='darkgray',fg='black')
label_secondi=tk.Label(root, font=('arial', 16, 'normal'), bg='blue',fg='white')
label_tentativi=tk.Label(root, font=('arial', 16, 'normal'), bg='orange',fg='white')
label_score=tk.Label(root, font=('arial', 16, 'normal'), bg='palevioletred',fg='white')
immagini_carte=carica_immagini_carte()
logo=ImageTk.PhotoImage(Image.open('logo_sf.png'))
label_logo=tk.Label(root, image=logo)
label_carta_pensata=tk.Label(root, image=immagini_carte[1])
label_carte_da_indovinare=tk.Label(root, image=immagini_carte[0])
label_carta_girata=tk.Label(root, image=immagini_carte[0])
label_carta_indovinata=tk.Label(root, image=immagini_carte[0])
label_carta_non_indovinata=tk.Label(root, image=immagini_carte[0])
label_carta_non_indovinata.bind("<Button>",gira_carta_non_indovinata)
label_carta_non_indovinata_retro=tk.Label(root, image=immagini_carte[0])
label_carta_non_indovinata_retro.bind("<Button>",gira_carta_non_indovinata_back)
label_powered_sf.place(x=550,y=557)
label_logo.place(x=805,y=545)
label_carta_non_indovinata_help.place(x=1230,y=150)
label_carta_non_indovinata_help.bind("<Button>",help_frame_show)
tick()
start()
mischia_carte(mazzo_centrale)
root.mainloop()
Nella prossima lezione implementeremo le funzionalità per creare il terzo livello di difficoltà del "Solitario del Ferroviere", creato per gli esperti. Per questo livello di gioco non è previsto nessun aiuto, dipende tutto dalla capacità del giocatore che deve ricordare tutte le carte indovinate e non indovinate.
Arrivederci ...
<< Lezione precedente Lezione successiva >>
Per scaricare le risorse di questa lezione clicca sul link seguente:risorse_lezione_05