You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
7.8 KiB
215 lines
7.8 KiB
# -*- coding: utf-8 -*-
|
|
"""
|
|
Cahier des charges respecté, sans ajout personnel.
|
|
Pas de gestion d'un joueur qui existerait déjà.
|
|
Code propre et fonctionnel.
|
|
Note : 9 / 10
|
|
"""
|
|
|
|
"""
|
|
É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()
|
|
|
|
|