-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemory.py
264 lines (238 loc) · 10.3 KB
/
memory.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
from random import *
def initGrille(nbLettres:int, nbLignes:int, nbColonnes:int) -> list:
"""
Initialise une grille avec comme taille les paramètres données.
:param nbLettres: le nombre de pairs disponible dans la grille
:param nbLignes: le nombre de lignes dans la grille
:param nbColonnes: le nombre de colonnes dans la grille
:type nbLettres: int
:type nbLignes: int
:type nbColonnes: int
:return: Une matrice avec nbLettres nombres de pairs
:rtype: list
"""
symboles = ['A','A','B','B','C','C','D','D','E','E','F','F','G','G','H','H','I','I','J','J','K','K','L','L','M','M','N','N','O','O','P','P','Q','Q','R','R','S','S','T','T','U','U','V','V','W','W','X','X','Y','Y','Z','Z']
compteur=0
# Test sur les paramètres donnés pour savoir si la grille est possible
if nbLignes*nbColonnes %2 != 0:
print(nbLignes, "*", nbColonnes, " n'est pas paire")
return None
if 2 * nbLettres < nbLignes * nbColonnes:
print("Il y a pas assez de symboles")
return None
elif 2 * nbLettres > nbLignes * nbColonnes or nbLettres*2 > len(symboles):
print("Il y a trop de symboles")
return None
grille=[]
# Création de la grille
for l in range(nbLignes):
grille.append([])
for c in range(nbColonnes):
grille[l].append(symboles[compteur])
compteur+=1
return grille
def melange(grille:list):
"""
Permet de mélanger une matrice
:param grille: une matrice qui sera mélangé
:type grille: list
"""
compteur = -1
for i in range(len(grille)):
for j in range(len(grille[0])):
compteur += 1
for k in range(compteur*2):
valeur1 = randint(0,compteur)
valeur2 = randint(0,compteur)
rang1 = 0
rang2 = 0
while valeur1 >= len(grille[0]):
valeur1 -= len(grille[0])
rang1 += 1
while valeur2 >= len(grille[0]):
valeur2 -= len(grille[0])
rang2 += 1
grille[rang1][valeur1], grille[rang2][valeur2] = grille[rang2][valeur2], grille[rang1][valeur1]
def initMarked(nbLignes:int, nbColonnes:int) -> list:
"""
Créer une matrice aidant à savoir si les éléments de la grilles sont visibles ou non
avec une taille donnée en paramètre avec False comme valeurs
:param nbLignes: nombre de lignes de la matrice
:param nbColonnes: nombre de colonnes de la matrice
:type nbLignes: int
:type nbColonnes: int
:return: retourne une matrice
:rtype: list
"""
grille=[]
for l in range(nbLignes):
grille.append([])
for c in range(nbColonnes):
grille[l].append(False)
return grille
def initMarkedTrue(nbLignes:int, nbColonnes:int) -> list:
"""
Créer une matrice aidant à savoir si une matrice est composé uniquement de True
avec une taille donnée en paramètre avec True comme valeurs
:param nbLignes: nombre de lignes de la matrice
:param nbColonnes: nombre de colonnes de la matrice
:type nbLignes: int
:type nbColonnes: int
:return: retourne une matrice
:rtype: list
"""
grille=[]
for l in range(nbLignes):
grille.append([])
for c in range(nbColonnes):
grille[l].append(True)
return grille
def display(grilleJeu:list, grilleVisible:list):
"""
Permet d'afficher le grille de jeu si la case est visible selon la liste grilleVisible
:param grilleJeu: la grille comportant les paires
:param grilleVisible: la grille qui contient l'information de si une case est visible ou non
"""
# Affichage des numéros de la grille
ligne = " "
for i in range(len(grilleJeu[0])):
ligne += f"{i+1} "
print(ligne)
# Affichage des pairs
for i in range(len(grilleJeu)):
ligne = f"{i+1} " # Affichage du numéro de la ligne
for j in range(len(grilleJeu[i])):
if grilleVisible[i][j]:
ligne += f"{grilleJeu[i][j]} "
else:
ligne += "? "
print(ligne)
def askPosition(grilleVisible:list)-> tuple:
"""
Permet de demander au joueur quelle ligne il veut regarder en gérant si les lignes et colonnes sont disponibles
:param grilleVisible: La grille que l'utilisateur voit
:type grille: list
:return: retourne un tuple vide si la case est déjà visible ou retourne un tuple avec les coordonnées de la case choisis par l'utilisateur
:rtype: tuple
"""
reponse = ""
lignedisponible = [str(i+1) for i in range(len(grilleVisible))] # Défini les réponses possibles par l'utilisateur
while reponse not in lignedisponible: # Boucle pour que l'utilisateur rentre un élément autorisé
reponse = input("Numéro de la ligne : ")
ligne = int(reponse) - 1 # L'utilisateur rentre un numéro de ligne mais on a besoin de l'index d'où le -1
reponse = ""
colonnedisponible = [str(i+1) for i in range(len(grilleVisible[0]))] # Défini les réponses possibles par l'utilisateur
while reponse not in colonnedisponible: # Boucle pour que l'utilisateur rentre un élément autorisé
reponse = input("Numéro de la colonne : ")
colonne = int(reponse) - 1 # L'utilisateur rentre un numéro de ligne mais on a besoin de l'index d'où le -1
if not grilleVisible[ligne][colonne]:
return ligne, colonne
return ()
def memory():
"""
Fonction principale permettant de jouer au jeu du mémory
"""
# ---
# Initialisation de la partie
# ---
grille = None
while grille == None: # Boucle tant que les paramètres ne sont pas bons
trait = "----------------------"
print(trait)
print("Paramètres du jeu")
nb_joueurs = ""
nb_joueurs_possible = [str(i+1) for i in range(10)]
while nb_joueurs not in nb_joueurs_possible:
nb_joueurs = input("Combien de Joueurs ? (max 10): ")
nb_lettres = ""
while not nb_lettres.isdigit():
nb_lettres = input("Combien de lettres ? : ")
nb_lignes = ""
while not nb_lignes.isdigit():
nb_lignes = input("Combien de lignes ? : ")
nb_colonnes =""
while not nb_colonnes.isdigit():
nb_colonnes = input("Combien de colonnes ? : ")
nb_joueurs = int(nb_joueurs)
nb_lettres = int(nb_lettres)
nb_lignes = int(nb_lignes)
nb_colonnes = int(nb_colonnes)
grille = initGrille(nb_lettres, nb_lignes, nb_colonnes) # initGrille renvoie None si les valeurs ne sont pas bonnes
# ---
# Initialisation des varibles utilisés dans la boucle du jeu
# ---
print(trait)
print("MEMORY")
# Permet aux joueurs de ne pas remonter voir le résultat
antiTriche = "\n"*30
# Créer une matrice avec le même nombre d'éléments que la grille avec False comme valeurs
visible = initMarked(nb_lignes, nb_colonnes)
score = [0 for i in range(nb_joueurs)]
# Créer une matrice avec le même nombre d'éléments que la grille avec True comme valeurs
# pour savoir si la partie est finis ou non
visibleComplet = initMarkedTrue(nb_lignes, nb_colonnes)
melange(grille)
fini = False
# ---
# Boucle du jeu
# ---
while visible != visibleComplet: # Tant que les cases ne sont pas toutes visibles
for joueur in range(1, nb_joueurs + 1):
rejouer = True # Permet au joueur de rejouer quand il gagne un point
# Regarde si la partie est fini ou non
if not fini:
while rejouer:
case_joue = [] # Contient la paire que l'utilisateur essaye
for i in range(2): # Pour que l'utilisateur puisse tester une paire
print(f"Scores : {score}")
display(grille, visible)
print(f"Joueur {joueur} :")
position = askPosition(visible)
# askPosition renvoie () si la case demandée est déjà visible
while position == ():
position = askPosition(visible)
visible[position[0]][position[1]] = True
case_joue.append(position)
premierEssai = case_joue[0]
deuxiemeEssai = case_joue[1]
# Si le joueur gagne le tour
if grille[premierEssai[0]][premierEssai[1]] == grille[deuxiemeEssai[0]][deuxiemeEssai[1]]:
score[joueur - 1] += 1
# Si la partie est fini
if visible == visibleComplet:
rejouer = False
display(grille, visible)
fini = True
else:
display(grille, visible)
input(f"Le joueur {joueur} rejoue ! (Appuyez sur entrée pour continuer)")
else:
display(grille, visible)
input(f"Le joueur {joueur} a finis son tour, au prochain ! (Appuyez sur entrée pour continuer)")
print(antiTriche)
visible[premierEssai[0]][premierEssai[1]] = False
visible[deuxiemeEssai[0]][deuxiemeEssai[1]] = False
rejouer = False
# ---
# Fin de partie
# ---
# Permet de gérer les ex aequo
phraseMilieu = ""
maxScore = max(score)
nbGagnant = 0
lstGagnant = []
for indexJoueur in range(len(score)):
if score[indexJoueur] == maxScore:
nbGagnant += 1
lstGagnant.append(indexJoueur)
if nbGagnant == 1:
phraseMilieu += f"{indexJoueur + 1}"
else:
phraseMilieu += f", {indexJoueur + 1}"
if nbGagnant == 1:
print(f"Le joueur {phraseMilieu} a gagné !")
else:
print(f"Les joueurs {phraseMilieu} ont gagnés !")
print(f"Liste des scores: {score}")
if __name__ == "__main__":
memory()