def generer_score(): for i in range (1,6): seth (0) up () forward (40) color ("red") begin_fill () polygone (6,20) end_fill () up () forward (3) left (90) forward (5) color ("black") texte (str (i)) yield # TODO: utilisation de scores.py for i in range(0,5): down() score = persistance.get_propriete ("scores", str (i) + ":score") texte (score) up () yield for i in range(0,5): down () nom = persistance.get_propriete ("scores", str (i) + ":nom") texte (nom) up () yield
def win (score): """ Affiche l'écran de victoire (fond choisi) @bg : str @return : None """ raz () # Ou pas ? th = persistance.get_propriete ("backgrounds", "theme:courant") y = int (persistance.get_propriete ("backgrounds", "theme:" + th + ":y:plateau")) x = int (persistance.get_propriete ("backgrounds", "theme:" + th + ":x:plateau")) path = "Images/Theme" + th + "/gagne.gif" bgpic(path) aller_a (-125, -70) # On centre la réponse color ("white") begin_fill () rectangle (250,110) end_fill () aller_a (-110,0) color ("black") texte ("Votre score final","important") aller_a (-9 * len (str (score)),-50) color ("black") texte (score)
def nouvelle_partie (): """ Commence une nouvelle partie, nécessaire pour pouvoir utilser les fonctions relatives à une partie ... afin de bien savoir ce qui se passe @return : None @throw : persistance.CleInvalide # pour le nombre de coups persistance.FichierInvalide # « config » persistance.ValeurInvalide (fichier,clé) # nombre de coups """ global en_cours_de_partie,historique,restant,code_secret,mode_partie en_cours_de_partie = True historique = [] # Initialise l'historique mode_partie = get_next_mode () # susceptible de planter restant = persistance.get_propriete ("config", "coups:" + mode_partie) try: restant = int (restant) except ValueError: raise persistance.ValeurInvalide ("config", "coups:" + mode_partie) affichage.plateau () # Remet l'affichage du plateau
def set_mode (m): global mode,restant if m in liste_modes: mode = m restant = persistance.get_propriete ("config","coups:"+m) return True else: return False
def string_to_hexa (couleur): """ Retourne la valeur Hexa de la couleur @couleur : string = couleur à convertir @return : string | False """ if is_string (couleur): # vérifie que c'est une chaine valide return persistance.get_propriete ("couleurs",couleur) else: return False # on sait pas convertir
def get_next_mode (): """ Retourne le mode de jeu de la prochaine partie (comme définit dans le fichier de configuration) @return : str (facile | moyen | difficile) @throw : persistance.CleInvalide persistance.FichierInvalide """ return persistance.get_propriete ("config", "niveau")
def definir_code (tableau): global code_secret if len (tableau) == int (persistance.get_propriete ("config", "nombre_cases")): for i in tableau: if couleurs.is_string (i) == False: return False code_secret = tableau return True else: return False
def get_theme_opts (t,*args): l = [] for j in args: if j == "@self": l.append (t) else: try: s = "theme:{0}:{1}".format (t,j) l.append (persistance.get_propriete ("backgrounds",s)) except: pass # RàF return l
def maximum (): """ Retourne le thème maximal """ try: max_theme = persistance.get_propriete ("backgrounds","theme:max") except persistance.CleInvalide: pass except persistance.FichierInvalide: pass else: try: return int (max_theme) except ValueError: raise persistance.ValeurInvalide ("backgrounds","theme:max")
def plateau (): """ Affiche un plateau vierge et définit toutes les constantes pour afficher les coups sur le plateau @return : None """ global y,x raz () th = persistance.get_propriete ("backgrounds","theme:courant") path = "Images/Theme" + th + "/fond.gif" bgpic (path) y = int (persistance.get_propriete ("backgrounds", "theme:" + th + ":y:plateau")) x = int (persistance.get_propriete ("backgrounds", "theme:" + th + ":x:plateau")) goto(x,y) speed (0)
def get_nombre_couleurs_next (): """ Retourne le nombre de couleurs disponibles dans le futur niveau de difficulté @return : int @throw : persistance.CleInvalide persistance.FichierInvalide ValueError """ cle = "couleurs:{0}".format (get_next_mode ()) return int (persistance.get_propriete ("config", cle))
def loose (code): """ Affiche l'écran de défaite @bg : str @return : None """ raz () # Ou pas ? th = persistance.get_propriete ("backgrounds", "theme:courant") y = int (persistance.get_propriete ("backgrounds", "theme:" + th + ":y:plateau")) x = int (persistance.get_propriete ("backgrounds", "theme:" + th + ":x:plateau")) path = "Images/Theme" + th + "/perdu.gif" bgpic(path) aller_a (-125, -70) # On centre la réponse color ("white") begin_fill () rectangle (250,110) end_fill () aller_a (-95, -65) # On centre la réponse for i in code: color (couleurs.couleur_to_hexa (i)) begin_fill () carre (40) end_fill () fd(50) aller_a (-110,0) color ("black") texte ("La solution était","important")
def abrv_to_string (abrv): """ Retourne la valeur String de l'abréviation @abréviation : string = abréviation à convertir @return : string @throw : CouleurInvalide persistance.FichierInvalide persistance.CleInvalide """ if is_abrv (abrv): # vérifie que c'est une chaine valide return persistance.get_propriete ("couleurs", "$" + abrv) # Les abréviations commencent par un $ else: raise CouleurInvalide
def string_to_hexa (couleur): """ Retourne la valeur Hexa de la couleur @couleur : string = couleur à convertir @return : string @throw : CouleurInvalide persistance.FichierInvalide persistance.CleInvalide """ if is_string (couleur): # vérifie que c'est une chaine valide return persistance.get_propriete ("couleurs",couleur) else: raise CouleurInvalide
def recup_score (): """ Recupere la liste des 5 meilleurs scores @return : [ int ... ] = les 5 meilleurs scores @throw : persistance.CleInvalide persistance.FichierInvalide """ score = [] i = 0 while i < 5: score.append (persistance.get_propriete ("scores",str(i)+":score")) i = i + 1 return score
def recup_nom (): #recupere les noms des joueurs des 5 meilleurs scores """ Récupère les noms des joueurs des 5 meilleurs scores dans le fichier de scores @return : [str ... ] = les 5 meilleurs noms @throw : persistance.CleInvalide persistance.FichierInvalide """ nom = [] i = 0 while i < 5: nom.append (persistance.get_propriete ("scores",str(i)+":nom")) i = i + 1 return nom
def get_nombre_couleurs (): """ Retourne le nombre de couleurs disponibles dans le niveau de difficulté courant @return : int @throw : PasEnCoursDePartie persistance.CleInvalide persistance.FichierInvalide ValueError """ global mode_partie if est_en_partie () != True: raise PasEnCoursDePartie return int (persistance.get_propriete ("config","couleurs:" + mode_partie))
def choix_theme (nbr_theme = 1): """ Sélectionne un thème (modifie le fichier de configuration) @nbr_theme : int = le numéro du nouveau thème sélectionné @return : None @throw : persistance.CleInvalide persistance.FichierInvalide ValueEror # si jamais il y a une valeur erronée dans backgrounds -> theme:max """ if not isinstance (nbr_theme, int): nbr_theme = 1 max_theme = persistance.get_propriete ("backgrounds","theme:max") if nbr_theme > int (max_theme): nbr_theme = 1 persistance.set_propriete ("backgrounds","theme:courant",str (nbr_theme))
def regles (mode = False): """Affiche les règles ainsi que les aides du jeu. Selon le niveau sélectionné. (un fond y est inséré)""" if mode == False: mode = "" try: mode = moteur.get_mode () except: mode = moteur.get_next_mode () raz () screensize(600,600,"white") if mode == "facile": bgpic("Images/Regles/ff.gif") elif mode == "moyen": bgpic ("Images/Regles/fn.gif") else: bgpic ("Images/Regles/fd.gif") up() goto(30,220) color("black") niveau(mode) nombre_coups = persistance.get_propriete ("config","coups:" + mode) generateur = generateur_texte (nombre_coups) goto (-133,150) lignes (1, 0, 30, generateur) goto(-133,20) main_text2() goto (-245,-160) couleurs_possibles ()
def definir_code (tableau): """ Définit le code à trouver pour la partie ! @tableau : [couleurs (français) ...] = le code à trouver @return : None @throw : TableauInvalide (msg) PasEnCoursDePartie """ global code_secret if est_en_partie () != True: raise PasEnCoursDePartie if len (tableau) == int (persistance.get_propriete ("config", "nombre_cases")): for i in tableau: if couleurs.is_string (i) == False: raise TableauInvalide ("La couleur {0} est invalide".format (i)) code_secret = tableau else: raise TableauInvalide ("Le tableau ne contient pas le bon nombre de cases")
def generer_couleurs_aleatoires (c = False): """ Génère un code aléatoire de couleurs, complètement ! @c : [couleurs (fr) ...] | False = si on a un univers prédéfini ! @return : list of couleurs (Français) """ sortie = [] # le tableau de sortie # On récupère la liste des couleurs possibles if c == False: lst = couleurs.liste_couleurs () else: lst = c # On récupère le nombre de cases demandées n = persistance.get_propriete ("config","nombre_cases") # On définit n couleurs au hasard ... for i in range (int (n)): sortie.append (choice (lst)) return sortie
def gen_fsm (): """ Crée la FSM ... c'est toute la fonction la plus importante """ # Variables de la FSM fichier = "" st = "menu-fichier" while True: # Là est toute la magnificience # on rend la main avec l'état actuel (comme ça les gens peuvent # savoir où on est) # mais la prochaine exécution ... demande une action à faire # (et comme la boucle est infinie ... on revient toujours attendre # à ce point exact de la boucle :-P. req = (yield st) # on sauve dans une variable if st == "menu-fichier": # Si on est dans le menu-fichier les commandes sont if req == "list": # On affiche la liste des fichiers # disponnibles iconsole.afficher (st, persistance.liste_fichiers ()) elif req == "entrer": # Yop, on transite vers l'état menu-variable # SI ET SEULEMENT SI l'utilisateur # a sélectionné un fichier !!! if fichier != "": st = "menu-variable" else: iconsole.afficher (st,"Vous n'avez pas sélectionné un fichier ...") elif req == "help": # L'aide affiche la liste des commandes possibles iconsole.afficher (st, "Les commandes sont : « quit », « list », « entrer », « help » et @Fichier") else: # C'est un nom de fichier # On suppose que si ce n'est pas une commande, # c'est un nom de fichier, et on change donc # le fichier sélectionné fichier = req iconsole.afficher (st,"Vous avez sélectionné " + req) else: # il n'existe que deux états, celui là est donc menu-variable # On a forcément définit un fichier, # vu que l'on ne peut être arrivé à cet état # QUE par une transition ! if req == "list": # On affiche simplement la liste des variables disponnibles iconsole.afficher (st, persistance.liste_variables (fichier)) elif req == "up": # On retourne au menu fichier ... tout con st = "menu-fichier" elif req == "ou": # On dit à l'utilisateur où il se trouve, c'est à dire le fichier courant iconsole.afficher (st, "Le fichier courant est : "+ fichier) elif req == "help": # On affiche la liste des commandes disponnibles iconsole.afficher (st, "Les commandes sont : « quit », « ou », « list », « help », « up » et @Variable") else: # C'est une variable # On suppose que si ce n'est pas une commande c'est une variable # à modifier ... Donc on demande la nouvelle valeur # et on modifie ... try: iconsole.afficher (st, "Valeur actuelle : " + str (persistance.get_propriete (fichier,req))) except: iconsole.afficher (st, "Nouvelle variable !") val = iconsole.demander (st,"Nouvelle valeur") persistance.set_propriete (fichier,req,val) iconsole.afficher (st,"Bien modifié !")
#-*- coding: utf-8 -*- # 29/03/13 #derniere maj 3/4 import persistance import couleurs import affichage code_secret = False mode = "moyen" restant = persistance.get_propriete ("config","coups:facile") liste_mode = ["facile","moyen","difficile"] def get_mode (): return mode def set_mode (m): global mode,restant if m in liste_modes: mode = m restant = persistance.get_propriete ("config","coups:"+m) return True else: return False def get_restant (): return restant def double_couleur (test):
def actuel (): """ Retourne le thème actuel """ return persistance.get_propriete ("backgrounds", "theme:courant")
def send(rep): """ Envoie une requête utilisateur au Mastermind qui va gérer la redirection et les actions nécessaires @rep : str = la requête @return : str = l'état actuel """ if rep == "help": # Commande indépendante de l'état courant ! afficher_aide() elif rep == "regles": # Commande indépendante de l'état courant ! afficher("Affichage des règles sur la fenêtre graphique ...") set_ecran("regles", 2) elif rep == "clear": iconsole.clear() elif rep == "scores": # Commande indépendante de l'état courant ! afficher("Affichage des scores sur la fenêtre graphique ...") set_ecran("scores", 1) s, n = scores.recup_score(), scores.recup_nom() liste = utils.bi_map(lambda a, b: (a, b), s, n) afficher_liste("Scores", liste) elif rep == "fortune": try: maximum = persistance.get_propriete("phrases", "max") maximum = int(maximum) aleatoire = randint(0, maximum - 1) afficher(persistance.get_propriete("phrases", str(aleatoire))) except persistance.CleInvalide: afficher("Il est impossible de récupérer la fortune ... le fichier « phrases » doit être corrompu »") except persistanec.FichierInvalide: afficher( "Le fichier est introuvable ... Cela implique un problème dans le CODE SOURCE ... revenez plus tard ..." ) except ValueError: afficher("La valeur de « max » dans « phrases » est fausse et ne représente pas un nombre valide ...") except: afficher("Une erreur inconnue est survenue ... ") elif rep == "couleurs": afficher_couleurs() elif get_etat() == "Humain-Joue": humain_joue(rep) elif get_etat() == "Menu": menu(rep) elif get_etat() == "Menu-Partie": menu_partie(rep) elif get_etat() == "Theme": theme(rep) elif get_etat() == "Niveau": niveau(rep) elif get_etat() == "Proposer-Code": proposer_code(rep) elif get_etat() == "Definir-Code": definir_code(rep) else: raise ErreurFatale return get_etat()