### classe qui répond au cahier des charges ### programme fonctionnel, la gestion du combat entre les personnages pourrait être ### automatique au lieu de cliquer à chaque fois sur combat ### Eviter les fonctions au milieu du programme principal ### L'usage des variables globale dans le cours de POO est maladroit ### note : 19/20 (classe : 12/12 prog : 7/8) import tkinter as tk from random import randint class Personnage: def __init__(self, nom, cat): self.nom = nom self.pdv = 20 self.exp = 1 self.cat = cat self.inventaire = [] if self.cat == "guerrier": self.inventaire = ["épée", "potion"] self.coefatk = 10 self.coefdef = 8 elif self.cat == "magicien": self.inventaire = ["bâton", "potion"] self.coefatk = 10 self.coefdef = 7 elif self.cat == "voleur": self.inventaire = ["dague", "potion"] self.coefatk = 3 self.coefdef = 9 elif self.cat == "elfe": self.inventaire = ["arc", "potion"] self.coefatk = 8 self.coefdef = 10 def jet_attaque(self): de_atk = randint(1, 20) return de_atk + self.exp * self.coefatk def jet_defense(self): de_def = randint(1, 20) return de_def + self.exp * self.coefdef def change_pdv(self, nb_pdv): self.pdv += nb_pdv return self.pdv def change_exp(self, nb_exp): self.exp += nb_exp return self.exp def affiche_caracteristiques(self): return f"Nom: {self.nom}, Catégorie: {self.cat}, Points de vie: {self.pdv}, Expérience: {self.exp}" def affiche_inventaire(self): return f"Inventaire: {', '.join(self.inventaire)}" # Création de la fenêtre principale root = tk.Tk() root.title("Combat RPG") # Variables globales perso perso1 = None perso2 = None tour = 1 # Fonctions pour le jeux def creer_personnages(): global perso1, perso2 nom1 = entry_nom1.get() cat1 = entry_cat1.get() nom2 = entry_nom2.get() cat2 = entry_cat2.get() perso1 = Personnage(nom1, cat1) perso2 = Personnage(nom2, cat2) afficher_message(f"Personnages créés : {perso1.nom} le {perso1.cat} et {perso2.nom} le {perso2.cat}") def afficher_message(message): text_area.insert(tk.END, message + "\n") text_area.see(tk.END) def combat(): global tour, perso1, perso2 if perso1.pdv > 0 and perso2.pdv > 0: afficher_message(f"\n--- Tour {tour} ---") afficher_message(f"{perso1.nom} attaque {perso2.nom}") attaque = perso1.jet_attaque() defense = perso2.jet_defense() if attaque > defense: degats = randint(1, 8) perso2.change_pdv(-degats) afficher_message(f"{perso1.nom} inflige {degats} points de dégâts à {perso2.nom}") else: degats = randint(1, 4) perso1.change_pdv(-degats) afficher_message(f"{perso2.nom} esquive et inflige {degats} points de dégâts à {perso1.nom}") afficher_message(f"Caractéristiques de {perso1.nom} : {perso1.affiche_caracteristiques()}") afficher_message(f"Caractéristiques de {perso2.nom} : {perso2.affiche_caracteristiques()}") perso1, perso2 = perso2, perso1 tour += 1 else: if perso1.pdv > 0: perso1.change_exp(1) afficher_message(f"\n{perso1.nom} a gagné le combat et gagne 1 point d'expérience!") else: perso2.change_exp(1) afficher_message(f"\n{perso2.nom} a gagné le combat et gagne 1 point d'expérience!") bouton_combat.config(state=tk.DISABLED) # Interface utilisateur (j'ai utliser le cours de l'anée passe et internet pour l'interface) frame = tk.Frame(root) frame.pack(pady=10) tk.Label(frame, text="Nom du premier personnage:").grid(row=0, column=0) entry_nom1 = tk.Entry(frame) entry_nom1.grid(row=0, column=1) tk.Label(frame, text="Catégorie du premier personnage:").grid(row=1, column=0) entry_cat1 = tk.Entry(frame) entry_cat1.grid(row=1, column=1) tk.Label(frame, text="Nom du deuxième personnage:").grid(row=2, column=0) entry_nom2 = tk.Entry(frame) entry_nom2.grid(row=2, column=1) tk.Label(frame, text="Catégorie du deuxième personnage:").grid(row=3, column=0) entry_cat2 = tk.Entry(frame) entry_cat2.grid(row=3, column=1) bouton_creer = tk.Button(frame, text="Créer les personnages", command=creer_personnages) bouton_creer.grid(row=4, columnspan=2, pady=10) bouton_combat = tk.Button(frame, text="Lancer le combat", command=combat) bouton_combat.grid(row=5, columnspan=2, pady=10) text_area = tk.Text(root, height=15, width=50) text_area.pack(pady=10) # Lancer l'interface graphique root.mainloop()