Mise en conformite convention nommage & description: zpendu.py
This commit is contained in:
parent
2fcea80ee7
commit
e2dfab8858
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,34 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# donnee.py : donnee du fichier pendu.py
|
||||
|
||||
""" Rassemble les donnee du script pendu.py """
|
||||
|
||||
# Constantes
|
||||
SCORES_FILE = ".scores"
|
||||
WORD_LIST_FILE = "dicolight.txt"
|
||||
MAX_TURNS = 12
|
||||
MAX_NAME_LEN = 7
|
||||
MIN_NAME_LEN = 2
|
||||
MSG_DISCLAMER = "Bienvenue au zPendu!\nLe but du jeu est de deviner"+\
|
||||
" un mot de 8 lettres max en moins de {} tours.".format(MAX_TURNS)
|
||||
ASK_NAME = "Votre nom ({} à {} caratères) : ".format(MIN_NAME_LEN, MAX_NAME_LEN)
|
||||
ASK_LETTER = "Choisissez une lettre : "
|
||||
ERR_WORD_LIST_FILE = "\t#!@?# Oups… Le dictionnaire n'est pas accesible! #?@!#"
|
||||
ERR_LETTER_LEN = "\t#!@?# Oups… Saisie trop courte ou trop longue! #?@!#"
|
||||
ERR_LETTER_ALPHA = "\t#!@?# Oups… Il faut saisir une lettre! #?@!#"
|
||||
ERR_LETTER_USED = "\t#!@?# Oups… Cette lettre à déjà été jouée! #?@!#"
|
||||
MSG_END_GAME = "Partie terminée avec {} point(s).\nLe mot mystère était : \n"
|
||||
MSG_1ST_GAME = "C'était votre 1ère partie ;-)"
|
||||
MSG_SCORES = "\n-== Les Scores : ==-"
|
||||
|
||||
# Variables
|
||||
game_continue = True
|
||||
player_name = str()
|
||||
letter = str()
|
||||
turns = 0
|
||||
alphabet = [
|
||||
'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'
|
||||
]
|
|
@ -0,0 +1,50 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# fonction.py : fonctions du fichier pendu.py
|
||||
|
||||
""" Rassemble les fonctions du script pendu.py """
|
||||
|
||||
|
||||
def check_letter(letter, target):
|
||||
"""
|
||||
Verifie la presence de **letter** dans **target**
|
||||
Retourne la liste des positions de la letter ou False
|
||||
@letter str
|
||||
@target list of letters
|
||||
"""
|
||||
if len(letter) != 1 or len(target) < 2 and letter is not str:
|
||||
return False
|
||||
|
||||
else:
|
||||
return [k for k, v in enumerate(target) if letter == v]
|
||||
|
||||
|
||||
def cls():
|
||||
""" Efface l'historique de la console """
|
||||
import os
|
||||
os.system('clear')
|
||||
return
|
||||
|
||||
|
||||
def stringalise (letter_list):
|
||||
"""
|
||||
Convertit un liste en une chaine
|
||||
@letter_list list()
|
||||
@return string()
|
||||
"""
|
||||
stringalised = str()
|
||||
for letter in letter_list:
|
||||
stringalised = stringalised + ' ' + letter
|
||||
|
||||
return stringalised
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Tests de la fonction
|
||||
print(check_letter('A', ['M', 'A', 'M', 'O', 'U', 'T', 'H']))
|
||||
print(check_letter('M', ['M', 'A', 'M', 'O', 'U', 'T', 'H']))
|
||||
print(check_letter('o', ['M', 'A', 'M', 'O', 'U', 'T', 'H']))
|
||||
print(check_letter('À', ['M', 'A', 'M', 'O', 'U', 'T', 'H']))
|
||||
print(check_letter(1, ['M', 'A', 'M', 'O', 'U', 'T', 'H']))
|
||||
print(check_letter(False, ['M', 'A', 'M', 'O', 'U', 'T', 'H']))
|
|
@ -0,0 +1,153 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import random
|
||||
import os
|
||||
import pickle
|
||||
from donnees import *
|
||||
from fonctions import *
|
||||
|
||||
#check_letter, cls, stringalise
|
||||
|
||||
# 2.7-zPendu.py: Jeu de pendu avec cumul des scores des differant joueurs
|
||||
|
||||
# OpenClassrooms - Apprenez a programmer en Python -
|
||||
# https://openclassrooms.com/courses/apprenez-a-programmer-en-python/tp-un-bon-vieux-pendu
|
||||
|
||||
# Le joueur donne son nom au debut (enregistrement du score)
|
||||
# Le script choisit un mot (8 lettres max) au hasard dans une liste
|
||||
# Le joueur a chaque tour saisit une lettre
|
||||
# Si la lettre figure dans le mot, l'ordinateur affiche le mot avec
|
||||
# les lettres deja trouvees. Celles qui ne le sont pas encore sont
|
||||
# remplacees par des etoiles (*). Le joueur a autant de chances que
|
||||
# le nombre de lettre du mot. Au dela, perdu.
|
||||
# Le score: score courant (0 si aucun score deja enregistre), a
|
||||
# chaque partie, ajoute le nombre de coups restants (non utilise)
|
||||
|
||||
# intégrer la date de 1ere partie dans le score
|
||||
# intégrer la partie au plus fort score
|
||||
# zerofill les scores
|
||||
|
||||
# Constantes
|
||||
SCORES_FILE = ".scores"
|
||||
WORD_LIST_FILE = "dicolight.txt"
|
||||
MAX_TURNS = 12
|
||||
MAX_NAME_LEN = 7
|
||||
MIN_NAME_LEN = 2
|
||||
MSG_DISCLAMER = "Bienvenue au zPendu!\nLe but du jeu est de deviner" + \
|
||||
" un mot de 8 lettres max en moins de {} tours.".format(MAX_TURNS)
|
||||
ASK_NAME = "Votre nom ({} à {} caratères) : "\
|
||||
.format(MIN_NAME_LEN, MAX_NAME_LEN)
|
||||
ASK_LETTER = "Choisissez une lettre : "
|
||||
ERR_WORD_LIST_FILE = "\t#!@?# Oups… Le dictionnaire n'est pas accesible! #?@!#"
|
||||
ERR_LETTER_LEN = "\t#!@?# Oups… Saisie trop courte ou trop longue! #?@!#"
|
||||
ERR_LETTER_ALPHA = "\t#!@?# Oups… Il faut saisir une lettre! #?@!#"
|
||||
ERR_LETTER_USED = "\t#!@?# Oups… Cette lettre à déjà été jouée! #?@!#"
|
||||
MSG_END_GAME = "Partie terminée avec {} point(s).\nLe mot mystère était : \n"
|
||||
MSG_1ST_GAME = "C'était votre 1ère partie ;-)"
|
||||
MSG_SCORES = "\n-== Les Scores : ==-"
|
||||
|
||||
# Variables
|
||||
game_continue = True
|
||||
player_name = str()
|
||||
letter = str()
|
||||
turns = 0
|
||||
alphabet = [
|
||||
'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'
|
||||
]
|
||||
|
||||
cls()
|
||||
print(MSG_DISCLAMER)
|
||||
|
||||
while (
|
||||
len(player_name) < MIN_NAME_LEN or
|
||||
len(player_name) > MAX_NAME_LEN or
|
||||
player_name.isalnum() is False
|
||||
): # Le joueur donne son nom
|
||||
player_name = str(input(ASK_NAME)).capitalize()
|
||||
|
||||
if len(player_name) < MIN_NAME_LEN or len(player_name) > MAX_NAME_LEN:
|
||||
print(ERR_LETTER_LEN)
|
||||
|
||||
if player_name.isalnum() is False:
|
||||
print(ERR_LETTER_ALPHA)
|
||||
|
||||
if os.path.isfile(WORD_LIST_FILE) is True: # Chargement du dictionnaire
|
||||
with open(WORD_LIST_FILE, "r") as word_list_file:
|
||||
word_list = word_list_file.read().splitlines()
|
||||
else:
|
||||
raise ValueError(ERR_WORD_LIST_FILE)
|
||||
|
||||
# Choix du mot cible
|
||||
target_word = list(word_list[random.randrange(0, len(word_list))])
|
||||
player_word = list("*" * len(target_word))
|
||||
|
||||
# Debut de partie
|
||||
while game_continue is True:
|
||||
|
||||
while (
|
||||
len(letter) != 1
|
||||
or letter.isalpha() is False
|
||||
or alphabet.count(letter) != 1
|
||||
): # Le joueur choisi une lettre
|
||||
|
||||
letter = str(input(ASK_LETTER)).upper()
|
||||
|
||||
if len(letter) != 1:
|
||||
print(ERR_LETTER_LEN)
|
||||
|
||||
elif letter.isalpha() is False:
|
||||
print(ERR_LETTER_ALPHA)
|
||||
|
||||
elif alphabet.count(letter) != 1:
|
||||
print(ERR_LETTER_USED)
|
||||
|
||||
# Presence de la lettre?
|
||||
if check_letter(letter, target_word) is not False:
|
||||
positions = check_letter(letter, target_word)
|
||||
for i in positions:
|
||||
player_word[i] = letter
|
||||
|
||||
alphabet[alphabet.index(letter)] = '_'
|
||||
turns += 1
|
||||
if turns == MAX_TURNS or player_word.count("*") == 0: # Fin de partie?
|
||||
game_continue = False
|
||||
|
||||
# Affichage de la fin de tour
|
||||
cls()
|
||||
print(stringalise(alphabet))
|
||||
print("tour : ", turns, "sur ", MAX_TURNS)
|
||||
print(stringalise(player_word))
|
||||
|
||||
|
||||
# Fin de partie
|
||||
points = (MAX_TURNS - turns) + 1
|
||||
cls()
|
||||
print(MSG_END_GAME.format(points))
|
||||
print(stringalise(target_word))
|
||||
|
||||
# Affichage du score de la partie et des highscores
|
||||
if os.path.isfile(SCORES_FILE) is True: # Ouverture du fichier
|
||||
with open(SCORES_FILE, "rb") as scores_file:
|
||||
scores = pickle.Unpickler(scores_file).load()
|
||||
|
||||
else:
|
||||
scores = {player_name: 0}
|
||||
print(MSG_1ST_GAME)
|
||||
|
||||
# Calcul du score
|
||||
if scores.get(player_name, False) is False: # Nouveau joueur
|
||||
scores.update({player_name: 0})
|
||||
|
||||
scores[player_name] = scores[player_name] + points
|
||||
|
||||
# Enregistrement du score
|
||||
with open(SCORES_FILE, "wb") as scores_file:
|
||||
pickle.Pickler(scores_file).dump(scores)
|
||||
|
||||
print(MSG_SCORES)
|
||||
for score in sorted(
|
||||
{(points, player) for player, points in scores.items()},
|
||||
reverse=True
|
||||
):
|
||||
print("{}\t: {} points".format(score[1], score[0]))
|
Loading…
Reference in New Issue