aW1wb3J0IHRraW50ZXIgYXMgdGsKZnJvbSB0a2ludGVyIGltcG9ydCBtZXNzYWdlYm94LCBzaW1wbGVkaWFsb2cKCiMgRGF0aSBkaSBiYXNlCmdpb2NhdG9yaSA9IHsKICAgICZxdW90O3BvcnRpZXJpJnF1b3Q7OiBbZiZxdW90O1BvcnRpZXJlIHtpKzF9JnF1b3Q7IGZvciBpIGluIHJhbmdlKDMwKV0sCiAgICAmcXVvdDtkaWZlbnNvcmkmcXVvdDs6IFtmJnF1b3Q7RGlmZW5zb3JlIHtpKzF9JnF1b3Q7IGZvciBpIGluIHJhbmdlKDYwKV0sCiAgICAmcXVvdDtjZW50cm9jYW1waXN0aSZxdW90OzogW2YmcXVvdDtDZW50cm9jYW1waXN0YSB7aSsxfSZxdW90OyBmb3IgaSBpbiByYW5nZSg2MCldLAogICAgJnF1b3Q7YXR0YWNjYW50aSZxdW90OzogW2YmcXVvdDtBdHRhY2NhbnRlIHtpKzF9JnF1b3Q7IGZvciBpIGluIHJhbmdlKDYwKV0sCn0KCmNsYXNzIFNxdWFkcmE6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbm9tZSk6CiAgICAgICAgc2VsZi5ub21lID0gbm9tZQogICAgICAgIHNlbGYuZ2lvY2F0b3JpID0gewogICAgICAgICAgICAmcXVvdDtwb3J0aWVyaSZxdW90OzogW10sCiAgICAgICAgICAgICZxdW90O2RpZmVuc29yaSZxdW90OzogW10sCiAgICAgICAgICAgICZxdW90O2NlbnRyb2NhbXBpc3RpJnF1b3Q7OiBbXSwKICAgICAgICAgICAgJnF1b3Q7YXR0YWNjYW50aSZxdW90OzogW10KICAgICAgICB9CgogICAgZGVmIGFjcXVpc3RhX2dpb2NhdG9yZShzZWxmLCBydW9sbywgbm9tZV9naW9jYXRvcmUpOgogICAgICAgIGlmIGxlbihzZWxmLmdpb2NhdG9yaVtydW9sb10pICZsdDsgKDMgaWYgcnVvbG8gPT0gJnF1b3Q7cG9ydGllcmkmcXVvdDsgZWxzZSA2KToKICAgICAgICAgICAgc2VsZi5naW9jYXRvcmlbcnVvbG9dLmFwcGVuZChub21lX2dpb2NhdG9yZSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgdmVuZGlfZ2lvY2F0b3JlKHNlbGYsIHJ1b2xvLCBub21lX2dpb2NhdG9yZSk6CiAgICAgICAgaWYgbm9tZV9naW9jYXRvcmUgaW4gc2VsZi5naW9jYXRvcmlbcnVvbG9dOgogICAgICAgICAgICBzZWxmLmdpb2NhdG9yaVtydW9sb10ucmVtb3ZlKG5vbWVfZ2lvY2F0b3JlKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKZGVmIGNyZWFfc3F1YWRyZShuKToKICAgIHJldHVybiBbU3F1YWRyYShmJnF1b3Q7U3F1YWRyYSB7aSsxfSZxdW90OykgZm9yIGkgaW4gcmFuZ2UobildCgpjbGFzcyBGYW50YWNhbGNpb0FwcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290KToKICAgICAgICBzZWxmLnJvb3QgPSByb290CiAgICAgICAgc2VsZi5yb290LnRpdGxlKCZxdW90O0ZhbnRhY2FsY2lvIE1hbmFnZXImcXVvdDspCiAgICAgICAgc2VsZi5zcXVhZHJlID0gY3JlYV9zcXVhZHJlKDEwKQoKICAgICAgICBzZWxmLmxpc3RhX3NxdWFkcmUgPSB0ay5MaXN0Ym94KHJvb3QsIGhlaWdodD0xMCkKICAgICAgICBzZWxmLmxpc3RhX3NxdWFkcmUuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHBhZHg9MTAsIHBhZHk9MTAsIHJvd3NwYW49NSkKICAgICAgICBmb3Igc3F1YWRyYSBpbiBzZWxmLnNxdWFkcmU6CiAgICAgICAgICAgIHNlbGYubGlzdGFfc3F1YWRyZS5pbnNlcnQodGsuRU5ELCBzcXVhZHJhLm5vbWUpCgogICAgICAgIHNlbGYuYnRuX21vc3RyYV9zcXVhZHJhID0gdGsuQnV0dG9uKHJvb3QsIHRleHQ9JnF1b3Q7TW9zdHJhIFNxdWFkcmEmcXVvdDssIGNvbW1hbmQ9c2VsZi5tb3N0cmFfc3F1YWRyYSkKICAgICAgICBzZWxmLmJ0bl9tb3N0cmFfc3F1YWRyYS5ncmlkKHJvdz0wLCBjb2x1bW49MSwgcGFkeD0xMCkKCiAgICAgICAgc2VsZi5idG5fYWNxdWlzdGEgPSB0ay5CdXR0b24ocm9vdCwgdGV4dD0mcXVvdDtBY3F1aXN0YSBHaW9jYXRvcmUmcXVvdDssIGNvbW1hbmQ9c2VsZi5hY3F1aXN0YV9naW9jYXRvcmUpCiAgICAgICAgc2VsZi5idG5fYWNxdWlzdGEuZ3JpZChyb3c9MSwgY29sdW1uPTEsIHBhZHg9MTApCgogICAgICAgIHNlbGYuYnRuX3ZlbmRpID0gdGsuQnV0dG9uKHJvb3QsIHRleHQ9JnF1b3Q7VmVuZGkgR2lvY2F0b3JlJnF1b3Q7LCBjb21tYW5kPXNlbGYudmVuZGlfZ2lvY2F0b3JlKQogICAgICAgIHNlbGYuYnRuX3ZlbmRpLmdyaWQocm93PTIsIGNvbHVtbj0xLCBwYWR4PTEwKQoKICAgICAgICBzZWxmLmJ0bl9tb3N0cmFfZ2lvY2F0b3JpID0gdGsuQnV0dG9uKHJvb3QsIHRleHQ9JnF1b3Q7R2lvY2F0b3JpIERpc3BvbmliaWxpJnF1b3Q7LCBjb21tYW5kPXNlbGYubW9zdHJhX2dpb2NhdG9yaSkKICAgICAgICBzZWxmLmJ0bl9tb3N0cmFfZ2lvY2F0b3JpLmdyaWQocm93PTMsIGNvbHVtbj0xLCBwYWR4PTEwKQoKICAgICAgICBzZWxmLmJ0bl9lc2NpID0gdGsuQnV0dG9uKHJvb3QsIHRleHQ9JnF1b3Q7RXNjaSZxdW90OywgY29tbWFuZD1yb290LnF1aXQpCiAgICAgICAgc2VsZi5idG5fZXNjaS5ncmlkKHJvdz00LCBjb2x1bW49MSwgcGFkeD0xMCkKCiAgICBkZWYgbW9zdHJhX3NxdWFkcmEoc2VsZik6CiAgICAgICAgaW5kaWNlID0gc2VsZi5saXN0YV9zcXVhZHJlLmN1cnNlbGVjdGlvbigpCiAgICAgICAgaWYgbm90IGluZGljZToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygmcXVvdDtTZWxlemlvbmUmcXVvdDssICZxdW90O1NlbGV6aW9uYSB1bmEgc3F1YWRyYS4mcXVvdDspCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNxdWFkcmEgPSBzZWxmLnNxdWFkcmVbaW5kaWNlWzBdXQogICAgICAgIGRldHRhZ2xpID0gZiZxdW90O1NxdWFkcmE6IHtzcXVhZHJhLm5vbWV9XG4mcXVvdDsKICAgICAgICBmb3IgcnVvbG8sIGxpc3RhIGluIHNxdWFkcmEuZ2lvY2F0b3JpLml0ZW1zKCk6CiAgICAgICAgICAgIGRldHRhZ2xpICs9IGYmcXVvdDt7cnVvbG8uY2FwaXRhbGl6ZSgpfTogeycsICcuam9pbihsaXN0YSkgaWYgbGlzdGEgZWxzZSAnTmVzc3Vubyd9XG4mcXVvdDsKICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCZxdW90O0RldHRhZ2xpIFNxdWFkcmEmcXVvdDssIGRldHRhZ2xpKQoKICAgIGRlZiBhY3F1aXN0YV9naW9jYXRvcmUoc2VsZik6CiAgICAgICAgaW5kaWNlID0gc2VsZi5saXN0YV9zcXVhZHJlLmN1cnNlbGVjdGlvbigpCiAgICAgICAgaWYgbm90IGluZGljZToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygmcXVvdDtTZWxlemlvbmUmcXVvdDssICZxdW90O1NlbGV6aW9uYSB1bmEgc3F1YWRyYS4mcXVvdDspCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHJ1b2xvID0gc2ltcGxlZGlhbG9nLmFza3N0cmluZygmcXVvdDtSdW9sbyZxdW90OywgJnF1b3Q7SW5zZXJpc2NpIGlsIHJ1b2xvIChwb3J0aWVyaSwgZGlmZW5zb3JpLCBjZW50cm9jYW1waXN0aSwgYXR0YWNjYW50aSk6JnF1b3Q7KS5sb3dlcigpCiAgICAgICAgaWYgcnVvbG8gbm90IGluIGdpb2NhdG9yaToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoJnF1b3Q7RXJyb3JlJnF1b3Q7LCAmcXVvdDtSdW9sbyBub24gdmFsaWRvLiZxdW90OykKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGdpb2NhdG9yaVtydW9sb106CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oJnF1b3Q7SW5mbyZxdW90OywgZiZxdW90O05lc3N1biB7cnVvbG9bOi0xXX0gZGlzcG9uaWJpbGUuJnF1b3Q7KQogICAgICAgICAgICByZXR1cm4KICAgICAgICBub21lX2dpb2NhdG9yZSA9IHNpbXBsZWRpYWxvZy5hc2tzdHJpbmcoJnF1b3Q7R2lvY2F0b3JlJnF1b3Q7LCBmJnF1b3Q7U2VsZXppb25hIHVuIHtydW9sb1s6LTFdfTogKHsnLCAnLmpvaW4oZ2lvY2F0b3JpW3J1b2xvXSl9KSZxdW90OykKICAgICAgICBpZiBub21lX2dpb2NhdG9yZSBpbiBnaW9jYXRvcmlbcnVvbG9dOgogICAgICAgICAgICBpZiBzZWxmLnNxdWFkcmVbaW5kaWNlWzBdXS5hY3F1aXN0YV9naW9jYXRvcmUocnVvbG8sIG5vbWVfZ2lvY2F0b3JlKToKICAgICAgICAgICAgICAgIGdpb2NhdG9yaVtydW9sb10ucmVtb3ZlKG5vbWVfZ2lvY2F0b3JlKQogICAgICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93aW5mbygmcXVvdDtTdWNjZXNzbyZxdW90OywgJnF1b3Q7R2lvY2F0b3JlIGFjcXVpc3RhdG8gY29uIHN1Y2Nlc3NvISZxdW90OykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd3dhcm5pbmcoJnF1b3Q7TGltaXRlJnF1b3Q7LCAmcXVvdDtMaW1pdGUgcmFnZ2l1bnRvIHBlciBxdWVsIHJ1b2xvLiZxdW90OykKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigmcXVvdDtFcnJvcmUmcXVvdDssICZxdW90O0dpb2NhdG9yZSBub24gZGlzcG9uaWJpbGUuJnF1b3Q7KQoKICAgIGRlZiB2ZW5kaV9naW9jYXRvcmUoc2VsZik6CiAgICAgICAgaW5kaWNlID0gc2VsZi5saXN0YV9zcXVhZHJlLmN1cnNlbGVjdGlvbigpCiAgICAgICAgaWYgbm90IGluZGljZToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93d2FybmluZygmcXVvdDtTZWxlemlvbmUmcXVvdDssICZxdW90O1NlbGV6aW9uYSB1bmEgc3F1YWRyYS4mcXVvdDspCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHJ1b2xvID0gc2ltcGxlZGlhbG9nLmFza3N0cmluZygmcXVvdDtSdW9sbyZxdW90OywgJnF1b3Q7SW5zZXJpc2NpIGlsIHJ1b2xvIChwb3J0aWVyaSwgZGlmZW5zb3JpLCBjZW50cm9jYW1waXN0aSwgYXR0YWNjYW50aSk6JnF1b3Q7KS5sb3dlcigpCiAgICAgICAgaWYgcnVvbG8gbm90IGluIGdpb2NhdG9yaToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoJnF1b3Q7RXJyb3JlJnF1b3Q7LCAmcXVvdDtSdW9sbyBub24gdmFsaWRvLiZxdW90OykKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbm9tZV9naW9jYXRvcmUgPSBzaW1wbGVkaWFsb2cuYXNrc3RyaW5nKCZxdW90O0dpb2NhdG9yZSZxdW90OywgJnF1b3Q7SW5zZXJpc2NpIGlsIG5vbWUgZGVsIGdpb2NhdG9yZSBkYSB2ZW5kZXJlOiZxdW90OykKICAgICAgICBpZiBzZWxmLnNxdWFkcmVbaW5kaWNlWzBdXS52ZW5kaV9naW9jYXRvcmUocnVvbG8sIG5vbWVfZ2lvY2F0b3JlKToKICAgICAgICAgICAgZ2lvY2F0b3JpW3J1b2xvXS5hcHBlbmQobm9tZV9naW9jYXRvcmUpCiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oJnF1b3Q7U3VjY2Vzc28mcXVvdDssICZxdW90O0dpb2NhdG9yZSB2ZW5kdXRvIGNvbiBzdWNjZXNzbyEmcXVvdDspCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoJnF1b3Q7RXJyb3JlJnF1b3Q7LCAmcXVvdDtHaW9jYXRvcmUgbm9uIHByZXNlbnRlIG5lbGxhIHNxdWFkcmEuJnF1b3Q7KQoKICAgIGRlZiBtb3N0cmFfZ2lvY2F0b3JpKHNlbGYpOgogICAgICAgIGRldHRhZ2xpID0gJnF1b3Q7R2lvY2F0b3JpIGRpc3BvbmliaWxpOlxuJnF1b3Q7CiAgICAgICAgZm9yIHJ1b2xvLCBsaXN0YSBpbiBnaW9jYXRvcmkuaXRlbXMoKToKICAgICAgICAgICAgZGV0dGFnbGkgKz0gZiZxdW90O3tydW9sby5jYXBpdGFsaXplKCl9OiB7JywgJy5qb2luKGxpc3RhKSBpZiBsaXN0YSBlbHNlICdOZXNzdW5vJ31cbiZxdW90OwogICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oJnF1b3Q7R2lvY2F0b3JpIERpc3BvbmliaWxpJnF1b3Q7LCBkZXR0YWdsaSkKCmlmIF9fbmFtZV9fID09ICZxdW90O19fbWFpbl9fJnF1b3Q7OgogICAgcm9vdCA9IHRrLlRrKCkKICAgIGFwcCA9IEZhbnRhY2FsY2lvQXBwKHJvb3QpCiAgICByb290Lm1haW5sb29wKCk=
import tkinter as tk
from tkinter import messagebox, simpledialog
# Dati di base
giocatori = {
"portieri": [f"Portiere {i+1}" for i in range(30)],
"difensori": [f"Difensore {i+1}" for i in range(60)],
"centrocampisti": [f"Centrocampista {i+1}" for i in range(60)],
"attaccanti": [f"Attaccante {i+1}" for i in range(60)],
}
class Squadra:
def __init__(self, nome):
self.nome = nome
self.giocatori = {
"portieri": [],
"difensori": [],
"centrocampisti": [],
"attaccanti": []
}
def acquista_giocatore(self, ruolo, nome_giocatore):
if len(self.giocatori[ruolo]) < (3 if ruolo == "portieri" else 6):
self.giocatori[ruolo].append(nome_giocatore)
return True
return False
def vendi_giocatore(self, ruolo, nome_giocatore):
if nome_giocatore in self.giocatori[ruolo]:
self.giocatori[ruolo].remove(nome_giocatore)
return True
return False
def crea_squadre(n):
return [Squadra(f"Squadra {i+1}") for i in range(n)]
class FantacalcioApp:
def __init__(self, root):
self.root = root
self.root.title("Fantacalcio Manager")
self.squadre = crea_squadre(10)
self.lista_squadre = tk.Listbox(root, height=10)
self.lista_squadre.grid(row=0, column=0, padx=10, pady=10, rowspan=5)
for squadra in self.squadre:
self.lista_squadre.insert(tk.END, squadra.nome)
self.btn_mostra_squadra = tk.Button(root, text="Mostra Squadra", command=self.mostra_squadra)
self.btn_mostra_squadra.grid(row=0, column=1, padx=10)
self.btn_acquista = tk.Button(root, text="Acquista Giocatore", command=self.acquista_giocatore)
self.btn_acquista.grid(row=1, column=1, padx=10)
self.btn_vendi = tk.Button(root, text="Vendi Giocatore", command=self.vendi_giocatore)
self.btn_vendi.grid(row=2, column=1, padx=10)
self.btn_mostra_giocatori = tk.Button(root, text="Giocatori Disponibili", command=self.mostra_giocatori)
self.btn_mostra_giocatori.grid(row=3, column=1, padx=10)
self.btn_esci = tk.Button(root, text="Esci", command=root.quit)
self.btn_esci.grid(row=4, column=1, padx=10)
def mostra_squadra(self):
indice = self.lista_squadre.curselection()
if not indice:
messagebox.showwarning("Selezione", "Seleziona una squadra.")
return
squadra = self.squadre[indice[0]]
dettagli = f"Squadra: {squadra.nome}\n"
for ruolo, lista in squadra.giocatori.items():
dettagli += f"{ruolo.capitalize()}: {', '.join(lista) if lista else 'Nessuno'}\n"
messagebox.showinfo("Dettagli Squadra", dettagli)
def acquista_giocatore(self):
indice = self.lista_squadre.curselection()
if not indice:
messagebox.showwarning("Selezione", "Seleziona una squadra.")
return
ruolo = simpledialog.askstring("Ruolo", "Inserisci il ruolo (portieri, difensori, centrocampisti, attaccanti):").lower()
if ruolo not in giocatori:
messagebox.showerror("Errore", "Ruolo non valido.")
return
if not giocatori[ruolo]:
messagebox.showinfo("Info", f"Nessun {ruolo[:-1]} disponibile.")
return
nome_giocatore = simpledialog.askstring("Giocatore", f"Seleziona un {ruolo[:-1]}: ({', '.join(giocatori[ruolo])})")
if nome_giocatore in giocatori[ruolo]:
if self.squadre[indice[0]].acquista_giocatore(ruolo, nome_giocatore):
giocatori[ruolo].remove(nome_giocatore)
messagebox.showinfo("Successo", "Giocatore acquistato con successo!")
else:
messagebox.showwarning("Limite", "Limite raggiunto per quel ruolo.")
else:
messagebox.showerror("Errore", "Giocatore non disponibile.")
def vendi_giocatore(self):
indice = self.lista_squadre.curselection()
if not indice:
messagebox.showwarning("Selezione", "Seleziona una squadra.")
return
ruolo = simpledialog.askstring("Ruolo", "Inserisci il ruolo (portieri, difensori, centrocampisti, attaccanti):").lower()
if ruolo not in giocatori:
messagebox.showerror("Errore", "Ruolo non valido.")
return
nome_giocatore = simpledialog.askstring("Giocatore", "Inserisci il nome del giocatore da vendere:")
if self.squadre[indice[0]].vendi_giocatore(ruolo, nome_giocatore):
giocatori[ruolo].append(nome_giocatore)
messagebox.showinfo("Successo", "Giocatore venduto con successo!")
else:
messagebox.showerror("Errore", "Giocatore non presente nella squadra.")
def mostra_giocatori(self):
dettagli = "Giocatori disponibili:\n"
for ruolo, lista in giocatori.items():
dettagli += f"{ruolo.capitalize()}: {', '.join(lista) if lista else 'Nessuno'}\n"
messagebox.showinfo("Giocatori Disponibili", dettagli)
if __name__ == "__main__":
root = tk.Tk()
app = FantacalcioApp(root)
root.mainloop()