diff --git a/assets/Manuel.pdf b/assets/Manuel.pdf index a1f3d70..90025ce 100644 Binary files a/assets/Manuel.pdf and b/assets/Manuel.pdf differ diff --git a/config.pickle b/config.pickle index 17b6722..7fbf7e5 100644 Binary files a/config.pickle and b/config.pickle differ diff --git a/main.pyw b/main.pyw index 331b30d..3d62c56 100644 --- a/main.pyw +++ b/main.pyw @@ -55,6 +55,8 @@ class AppClass(): # Classe du "moteur" du jeu def start(self): classModule["simon"].bind(UpCmd = "pass", DownCmd = "pass", LeftCmd = "pass", RightCmd = "pass") + self.Life = self.config["Vie"]["Value"] # On initialise le nombre de vie comme indiqué dans les paramètres + for module in classModule: classModule[module].start() diff --git a/module/button.py b/module/button.py index 49834db..41b0f27 100644 --- a/module/button.py +++ b/module/button.py @@ -1,5 +1,23 @@ class button(): def __init__(self): # Cette fonction est automatiquement éxécuter lors de la création de l'objet + self.rules = { + "Facile": { + "Else": "None" + }, "Normal": { + "F Blink": "3 any", + "F Off": "7 any", + "F On": "0 any" + }, "Difficile": { + "D Blink": "3 any", + "A Off": "7 any", + "B On": "0 any", + "F Blink": "5 sec", + "B Blink": "5 sec", + "C On": "3 sec", + "Else": "None" + } + } + self.frame = LabelFrame(Fen, text = "Button") # On créer une sous-fenêtre self.frame.grid(row = 2, column = 3, sticky = "NEWS") # On l'affiche @@ -9,8 +27,52 @@ class button(): def start(self): - pass - # déterminer les règles pour désamorçer + self.defuse = False + self.big_but.config(command = self.check) + + + def def_condition(self): + Difficulty = App.config["Difficulté"]["Value"] + Condition = list(self.rules[Difficulty].keys()) + + for index in range(len(Condition)): + Condition_split = Condition[index].split(" ") + + if Condition_split[0] != "Else": State_led = classModule["wire"].dico_wire[Condition_split[0]]["LIT"] # Si la condition n'est pas else, on récupère l'état de la LED + else: State_led = Condition_split[-1] # Sinon, on fait en sorte que la condition fonctionne obligatoirement. + + if State_led == Condition_split[-1]: + self.rules_chrono = self.rules[Difficulty][Condition[index]] + break + + + def check(self): + second = classModule["display"].second + minute = classModule["display"].minute + + rules_chrono_split = self.rules_chrono.split(" ") + + _Stop = False + + if rules_chrono_split[0] != "None": + if rules_chrono_split[1] == "any": + if not(rules_chrono_split[0] in str(minute) + str(second)): + _Stop = True + + if rules_chrono_split[1] == "sec": + if not(rules_chrono_split[0] in str(second)[-1]): + _Stop = True + + + if not(_Stop): + self.defuse = True + classModule["display"].checkDefuse() + + else: + classModule["display"].PenalityLife() classModule["button"] = button() + +# 2 - Le bouton doit être relié à la fonction "check" +# 3 - On vérifie que la condition est respecté diff --git a/module/display.py b/module/display.py index ad93fb0..107b8d9 100644 --- a/module/display.py +++ b/module/display.py @@ -12,19 +12,61 @@ class display(): self.label.config(text = text) - def chrono(self, time): - minute = time // 60 - seconde = time % 60 + def chrono(self): + self.time -= 1 + self.minute = self.time // 60 + self.second = self.time % 60 - self.write("%02i:%02i" % (minute, seconde)) + if self.PenalityAnimation: # Si le joueur vient de se trompé + self.PenalityAnimation = False + self.write("/!\\ Erreur /!\\\nVie restante : %i" % App.Life) - self.chrono_event = Fen.after(1000, lambda: self.chrono(time - 1)) + elif self.DefuseAnimation: # Si le joueur vient de désamorçé tout le module + self.DefuseAnimation = False + self.write("Module désamorcé !") + + else: + self.write("%02i:%02i" % (self.minute, self.second)) + + if self.time > 0: + self.chrono_event = Fen.after(1000, self.chrono) + else: self.Lose() # Perdu par manque de temps def start(self): - self.chrono(time = 180) - # rien de spécial - # peut être chrono + self.PenalityAnimation = False + self.DefuseAnimation = False + self.time = 181 # En lanceant le chrono, une seconde est immédiatement supprimée + self.chrono() + def checkDefuse(self): + self.time += App.config["Bonus de temps"]["Value"] + + _Stop = False + for module in classModule: + if classModule[module].defuse == False: + _Stop = True + + if not(_Stop): # Si tout les modules sont désamorcé + Fen.after_cancel(self.chrono_event) # On désactive le chrono + self.write(random.choice(["GG", "Bravo", "Félicitation"])) + + else: + self.DefuseAnimation = True + + + def PenalityLife(self): + App.Life -= 1 + self.PenalityAnimation = True + + if App.Life <= 0: + self.Lose() + + + def Lose(self): + Fen.after_cancel(self.chrono_event) # On désactive le chrono + self.write(random.choice(["Perdu", "Dommage", "Try again"])) + # Réitialiser tout les modules + classModule["display"] = display() diff --git a/module/morse.py b/module/morse.py index 4c2fb7a..78c01dd 100644 --- a/module/morse.py +++ b/module/morse.py @@ -1,5 +1,5 @@ class morse(): - def __init__(self): # Cette fonction est automatiquement éxécuter lors de la création de l'objetself.Complete = False + def __init__(self): # Cette fonction est automatiquement éxécuter lors de la création de l'objet self.PATH_SYMBOL = "./assets/morse/" self.MorseWordTable = { 'ABSTRAIT': 3, 'BAIGNER': 9, 'CACHOT': 10, 'DALLE': 2, 'ERREUR': 11, 'FLEUR': 6, @@ -13,15 +13,17 @@ class morse(): 'CUIVRE': 3, 'DORMIR': 2, 'EFFECTIF': 8, 'FABULEUX': 3, 'GRANDE': 12, 'HAUTEUR': 7, 'IDEE': 7, 'JOIE': 12, 'KOALA': 6, 'LOUP': 4, 'MOUCHE': 1, 'NOUS': 9, 'ORANGE': 11, 'POULET': 8, 'QUICHE': 6, 'RITUEL': 12, 'SAUCE': 10, 'TUILE': 9, 'UTILE': 2, - 'VICTOIRE': 11, 'WEEKEND': 9, 'XENOPHOBE': 5, 'YOGA': 2, 'ZEN': 9} + 'VICTOIRE': 11, 'WEEKEND': 9, 'XENOPHOBE': 5, 'YOGA': 2, 'ZEN': 9 + } self.MorseLetter = { "A": ".-", "B":"-...", "C":"-.-.", "D":"-..", "E":".", "F":"..-.", "G":"--.", "H":"....", "I":"..", "J":".---", "K":"-.-", "L":"--.", "M":"--", "N":"-.", "O":"---", "P":".--.", "Q":"--.-", "R":".-.", "S":"...", "T":"-", "U":"..-", - "V":"...-", "W":".--", "X":"-..-", "Y":"-.--", "Z":"--.."} + "V":"...-", "W":".--", "X":"-..-", "Y":"-.--", "Z":"--.." + } - self.frame = LabelFrame(Fen, text = "Morse") # On créer une sous-f enêtre + self.frame = LabelFrame(Fen, text = "Morse") # On créer une sous-fenêtre self.frame.grid(row = 2, column = 2, sticky = "NEWS") # On l'affiche self.frame.grid_rowconfigure(1, weight = 1) # tout les objets seront centré horizontalement @@ -107,12 +109,12 @@ class morse(): def check(self, symbol_press): if symbol_press == self.True_symbol: self.defuse = True + classModule["display"].checkDefuse() for index in self.dico_But: self.dico_But[index].config(command = lambda: "pass") else: - pass - # + pénalité + classModule["display"].PenalityLife() diff --git a/module/safe.py b/module/safe.py index db962fb..c0488f8 100644 --- a/module/safe.py +++ b/module/safe.py @@ -71,12 +71,12 @@ class safe(): self.Step += 1 if self.Step >= Step_max: # Si à la dernière étape self.defuse = True - print("DEFUSER") + classModule["display"].checkDefuse() else: self.zone_choice() - else: print("FAUX") - # +pénaliter si le nombre d'erreur autorisé est atteint donc enlever une vie + else: + classModule["display"].PenalityLife() diff --git a/module/simon.py b/module/simon.py index c9ae55a..6d9d9ab 100644 --- a/module/simon.py +++ b/module/simon.py @@ -70,12 +70,12 @@ class simon(): for index in range(nomber_condition): # boucle pour tester toute les conditions Condition = list(self.rules[Difficulty].keys())[index] # Condition pour utiliser le réarangement des touches Condition_split = Condition.split(" ") - if Condition_split[0] != "Else": State_led = classModule["wire"].dico_wire[Condition_split[0]]["LIT"] - if (State_led == Condition_split[-1]) or (Condition_split[0] == "Else"): # regarder si le sconditon est bonne avec les LED + if Condition_split[0] != "Else": State_led = classModule["wire"].dico_wire[Condition_split[0]]["LIT"] + else: State_led = Condition_split[-1] + + if (State_led == Condition_split[-1]): # regarder si le condition est bonne avec les LED self.rules_sequence = self.rules[Difficulty][Condition] # difinition de la bonne séquence - print(self.rules_sequence) - print(Condition) break # On arrête la boucle car on a trouvé ce que l'on cherchait @@ -120,14 +120,14 @@ class simon(): self.Step += 1 else: - pass - # + Pénalité + classModule["display"].PenalityLife() self.Sequence_Button = [] if self.Step >= self.MaxStep - 1: # Si le joueur a atteint la dernière étape self.defuse = True # la bombe est désamorçé. + classModule["display"].checkDefuse() self.bind(LeftCmd = lambda: "pass", RightCmd = lambda: "pass", UpCmd = lambda: "pass", DownCmd = lambda: "pass") diff --git a/module/wire.py b/module/wire.py index 04efcda..439bc9a 100644 --- a/module/wire.py +++ b/module/wire.py @@ -62,7 +62,8 @@ class wire(): self.wrong_cut = 0 # Compte le nombre de fils que le joueur n'aurait dû pas coupé avant self.check(penality = False) # On compte le nombre de fil à corrigé pour les pénalités plus tard - classModule["simon"].def_sequence() # Puisque le module "simon" a besoin de l'état des LEDs pour fonctionner, on l'éxécute après leur définition + if "simon" in classModule: classModule["simon"].def_sequence() # Puisque le module "simon" a besoin de l'état des LEDs pour fonctionner, on l'éxécute après leur définition + if "button" in classModule: classModule["button"].def_condition() # Puisque le module "button" a besoin de l'état des LEDs pour fonctionner, on l'éxécute après leur définition def cut_wire(self, led): #coupe les cables @@ -96,11 +97,12 @@ class wire(): if penality: # Si on compte les pénalité, alors on fait ces calculs if self.wire_errorTotalBefore - self.wire_errorTotal == -1: # Si le fil à mal été coupé self.wrong_cut += 1 - # + Rajouter +1 sur le compteur + classModule["display"].PenalityLife() if self.wire_errorTotal - self.wrong_cut == 0: # Si le joueur à tout désamorçer, en comptant les fils qu'ils n'auraient pas du coupé self.defuse = True + classModule["display"].checkDefuse() for led in self.dico_wire: # On rend les câbles insécable de nouveau pour évité une nouvelle erreur self.dico_wire[led]["WIRE"].config(command = lambda: "pass") # + Rajouter le bonus de temps