# -*- coding: utf-8 -*- """ Éditeur : Loïc J-O Version 5.2 Jeu de rôle (version SQL) Définit la table 'personnage' stockant et mettant à jour les attributs des personnages, Définit la classe Personnage, une fonction de combat, initialise une base de données si non existante, Initialise les 2 combattants (saisie clavier du nom et de la catégorie de chaque combattant), Lance le combat (fonction Main_Combat() ), Met à jour la DB avec les évolutions des caractéritiques des personnages créés, Affiche le résultat à chaque échange puis affiche le résultat final. """ import random import sqlite3 class Personnage: def __init__ (self, nom, cat): '''Initialisation de la class "Personnage" ayant comme attribus: nom, hp (pdv, points de vie), xp (exp), cat, inventaire ''' '''Attributs invariants : nom : nom du personnage cat : la catégorie (guerrier, magicien, voleur, elfe) Attribut "suplémentaire" pour l'utilisation de la DB : ident : l'ident du personnage dans la DB (Dans cette version du jeu, 'ident' n'est utile que pour différentier 2 joueurs du même nom et de même catégorie des fois qu'on tombe sur un petit malin :-) ) ''' self.nom = nom self.hp = 20 self.xp = 1 self.cat = cat if self.cat == "guerrier" : self.inventaire = "épée, potion" elif self.cat == "magicien" : self.inventaire = "bâton, potion" elif self.cat == "voleur" : self.inventaire = "dague, potion" elif self.cat == "elfe" : self.inventaire = "arc, potion" '''On met à jour la DB avec les infos du personnage et on récupère son identification DB :''' c_myDB.execute("INSERT INTO Personnages (nom, cat, xp, hp, inventaire) VALUES (?,?,?,?,?);", (self.nom, self.cat, self.xp, self.hp, self.inventaire)) conn.commit() c_myDB.execute("SELECT last_insert_rowid();") self.ident = c_myDB.fetchone()[0] def jet_attaque (self): '''Renvoie le jet d'attaque.''' if self.cat == "guerrier" or self.cat == "magicien": coef = 10 elif self.cat == "voleur": coef = 3 elif self.cat == "elfe": coef = 8 return random.randint(1, 20) + self.xp * coef def jet_defense (self): '''Renvoie le jet de défense.''' if self.cat == "guerrier": coef = 8 elif self.cat == "magicien": coef = 7 elif self.cat == "voleur": coef = 9 elif self.cat == "elfe": coef = 10 return random.randint(1, 20) + self.xp * coef def change_hp (self, nb_hp): self.hp = self.hp + nb_hp c_myDB.execute("UPDATE personnages SET hp=? WHERE ident=?;", (self.hp, self.ident)) conn.commit() def change_xp (self, nb_xp): self.xp = self.xp + nb_xp c_myDB.execute("UPDATE personnages SET xp=? WHERE ident=?;", (self.xp, self.ident)) conn.commit() def affiche_caracteristiques (self): print("Le Grand", self.nom, " : ", self.cat, ", Points de vie : ", self.hp, ", Expérience : ", self.xp) def affiche_inventaire (self): print("Inventaire : ", self.inventaire) def Main_Combat (): ''' Fonction qui simule un combat Player 1 attaque en premier, puis player 2 ... jusqu'à ce qu'un joueur n'ait plus de point de vie. Mise à jour de la DB au fur et à mesure que la partie avance Sortie : on affiche le gagnant et les caractéristiques des combattants (le gagnant voyant son Xp incrémentée de 1) ''' ''' Initialisation d'une variable i permettant de changer d'attaquant entre deux coups : dans le code, si i est impaire, player 1 attaque, si i est paire, player 2 attaque. ''' print("**********************************") i=1 while player1.hp > 0 and player2.hp > 0: if i % 2 != 0 : ''' i impair : attaque de player 1 ''' if player1.jet_attaque() > player2.jet_defense() : player2.change_hp(- random.randint(1, 8)) print(player1.nom," gagne son attaque, ", player2.nom," perd des points !" ) else : player1.change_hp(- random.randint(1, 4)) print(player1.nom, " perd son attaque, ", player1.nom," perd des points !") else : ''' i pair => attaque de player 2''' if player2.jet_attaque() > player1.jet_defense() : player1.change_hp(- random.randint(1, 8)) print(player2.nom," gagne son attaque, ", player1.nom," perd des points !" ) else : player2.change_hp(- random.randint(1, 4)) print(player2.nom, " perd son attaque, ", player2.nom," perd des points !" ) i=i+1 print("Bilan des 2 joueurs suite à l'attaque :") player1.affiche_caracteristiques() player2.affiche_caracteristiques() print("**********************************") if player1.hp <= 0: winner = player2.nom player2.change_xp(+1) else : winner = player1.nom player1.change_xp(+1) print("FIN DU COMBAT !!!") print("Le gagnant du combat est le Grand ", winner, " en ", i-1, " échange(s)") player1.affiche_caracteristiques() player2.affiche_caracteristiques() print("**********************************") '''Rejouer :''' rejouer() def rejouer(): print("ΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦ") print("Vous pouvez rejouer, vos combattants seront remis à leur état de vie initiale, mais garderont l'expérience gagnée") replayQuestion = input("Voulez-vous rejouer ? (oui ou non)") print("ΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦΦ") if replayQuestion == 'oui': player1.hp = 20 player2.hp = 20 Main_Combat() elif replayQuestion == 'non': print('Bonne journée') ''' Fermeture DB : ''' conn.close() else: rejouer() '''********************************************************************''' ''' Lancement application ''' '''********************************************************************''' print ("Jeu de rôle - choississez 2 combattants : leurs noms et leurs catégories, et le combat démarre !") ''' *** 1. connexion et création DB : *** ''' conn = sqlite3.connect('jeu_db.db') c_myDB = conn.cursor() c_myDB.execute ('''CREATE TABLE if not exists Personnages (ident INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT NOT NULL, cat TEXT NOT NULL, xp FLOAT NOT NULL, hp FLOAT NOT NULL, inventaire TEXT NOT NULL) ''') ''' *** 2. Instanciation de 2 combattants : *** ''' Test=False while (Test==False): player1 = Personnage(input("Joueur 1, veuillez choisissez votre nom : "), input("Joueur 1, veuillez choisissez votre catégorie (guerrier, magicien, elfe, voleur) : ")) player2 = Personnage(input("Joueur 2, veuillez choisissez votre nom : "), input("Joueur 2, veuillez choisissez votre catégorie (guerrier, magicien, elfe, voleur): ")) if (player1.cat=="guerrier" or player1.cat=="magicien" or player1.cat=="voleur" or player1.cat=="elfe" ) and (player2.cat=="guerrier" or player2.cat=="magicien" or player2.cat=="voleur" or player2.cat=="elfe"): Test = True else: print("Cette catégorie de personnage n'existe pas !") ''' *** 3. Fonction Combat (qui intègre les échanges avec la DB) : *** ''' Main_Combat()