-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
421 lines (366 loc) · 15.8 KB
/
main.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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
from Player import Player
import re
from blessed import Terminal
import os
import main_game
import datetime
def win_screen(player):
print("""
███████ ███████ ██ ██ ██████ ██ ██████ █████ ██████ ███████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
█████ █████ ██ ██ ██ ██ ██ ██ ███████ ██ ██ █████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ███████ ███████ ██ ██████ ██ ██████ ██ ██ ██████ ███████ ███████
""")
print("Has evitado una catastrofe en la unimet.")
print(f"""
Tus estadísticas {player.get_username()}:
Tiempo: {datetime.timedelta(seconds=(player.get_time() - player.get_time_left().total_seconds()))}
Vidas restantes: {player.get_lives()}
Pistas restantes: {player.get_clues_count()}
Dificultad: {player.get_difficulty()}
""")
def lose_screen(player):
print("""
██▓███ ▓█████ ██▀███ ▓█████▄ ██▓ ██████ ▄▄▄█████▓▓█████
▓██░ ██▒▓█ ▀ ▓██ ▒ ██▒▒██▀ ██▌▓██▒▒██ ▒ ▓ ██▒ ▓▒▓█ ▀
▓██░ ██▓▒▒███ ▓██ ░▄█ ▒░██ █▌▒██▒░ ▓██▄ ▒ ▓██░ ▒░▒███
▒██▄█▓▒ ▒▒▓█ ▄ ▒██▀▀█▄ ░▓█▄ ▌░██░ ▒ ██▒░ ▓██▓ ░ ▒▓█ ▄
▒██▒ ░ ░░▒████▒░██▓ ▒██▒░▒████▓ ░██░▒██████▒▒ ▒██▒ ░ ░▒████▒
▒▓▒░ ░ ░░░ ▒░ ░░ ▒▓ ░▒▓░ ▒▒▓ ▒ ░▓ ▒ ▒▓▒ ▒ ░ ▒ ░░ ░░ ▒░ ░
░▒ ░ ░ ░ ░ ░▒ ░ ▒░ ░ ▒ ▒ ▒ ░░ ░▒ ░ ░ ░ ░ ░ ░
░░ ░ ░░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░
░
""")
if not (player.get_time_left() > datetime.timedelta()):
print("Se te acabó el tiempo")
elif not (player.get_lives() > 0):
print("Te quedaste sin vidas")
def set_statistics(player):
complete_time = player.get_time() - player.get_time_left().total_seconds()
with open("records.txt","a") as records:
records.write(player.get_username() + ",")
records.write(str(complete_time) + ",")
records.write(player.get_difficulty() + "\n")
def show_statistics():
"""Muestra las estadísticas de los usuarios que hayan jugado
Args:
[dic]: dic, diccionario con la información de usuarios registrados
Returns:
[Objeto clase "Player"]: Objeto en donde está toda la información del usuario durante la partida, ya instanciado.
"""
statistics=[]
try:
with open("records.txt") as u:
for line in u:
aux={}
aux["username"] = line.split(",")[0]
aux["time"] = line.split(",")[1]
aux["difficulty"] = line.split(",")[2].replace("\n","")
statistics.append(aux)
except:
pass
if len(statistics)==0:
print("Todavía no hay usuarios para mostrar estadisticas")
else:
print("TOP 5 Mejores tiempos: ")
order_list =sorted(statistics, key = lambda i: float(i['time']))
for i in range(5):
try:
print(f"""Pos.{i+1 } - {order_list[i]["username"]} TIEMPO: {order_list[i]["time"]} DIFICULTAD: {order_list[i]["difficulty"]}""")
except:
break
def get_instructions():
"""Muestra las instrucciones del juego.
"""
print("""
El juego consiste en diferentes cuartos, donde hay objetos y cada objeto tiene un acertijo a resolver.
Cada cuarto posee objetos, los cuales tienen consigo juegos asociados.
Cada vez que gana un juego obtiene una recompensa que le puede servir para resolver la problemática del juego.
Para ganar hace falta completar todos los juegos.
""")
def set_info_level():
"""Lee el archivo donde está la información de los niveles de dificultad y los coloca en un diccionario..
Returns:
[dic]: info_level, diccionario con toda la información de los niveles de dificultad.
"""
info_level={}
with open("lives_clues_time.txt","r") as info:
for line in info:
info_level[line.split(",")[0]] = {}
info_level[line.split(",")[0]]["lives"]=float(line.split(",")[1])
info_level[line.split(",")[0]]["clues"]=float(line.split(",")[2])
info_level[line.split(",")[0]]["time"]=float(line.split(",")[3].replace("\n",""))
return info_level
def difficulty_level(player):
"""Coloca la dificultad, seteando en la clase Player las vidas, pistas y tiempo que tendrá para completar el juego.
Args:
[Objeto clase "Player"]: Objeto en donde está toda la información del usuario durante la partida
"""
info_level=set_info_level()
while True:
try:
level=input(f"""Ingrese el nivel de dificultad en la que desea jugar:
(1) Fácil: {int(info_level["easy"]["lives"])} vidas y {int(info_level["easy"]["clues"])} pistas
(2) Medio: {int(info_level["medium"]["lives"])} vidas y {int(info_level["medium"]["clues"])} pistas
(3) Difícil: {int(info_level["hard"]["lives"])} vidas y {int(info_level["hard"]["clues"])} pistas
==> """)
if level=="1":
level="easy"
elif level=="2":
level="medium"
elif level=="3":
level="hard"
else:
raise Exception
break
except:
print("Seleccione una opción correcta.")
player.set_lives(info_level[level]["lives"])
player.set_clues_count(info_level[level]["clues"])
player.set_time((info_level[level]["time"]*60))
player.set_difficulty(level)
def validate_user(users):
"""Valida el usuario y contraseña de un usuario ya registrado.
Args:
[dic]: dic, diccionario con la información de usuarios registrados
Returns:
[Objeto clase "Player"]: Objeto en donde está toda la información del usuario durante la partida, ya instanciado.
"""
while True:
try:
username = input("Ingrese su nombre de usuario: ")
password = input("Ingrese su contraseña: ")
if username in users.keys():
if users[username]["password"]==password:
break
else:
raise Exception
else:
raise Exception
except:
print("Usuario o contraseña incorrectas")
print("Usted ha sido loggeado correctamente.")
return Player(username, users[username]["password"], users[username]["age"], users[username]["avatar"])
def avatar_selection():
"""Ofrece los avatares disponibles para que el usuario escoja uno.
Returns:
[str]: avatar, el avatar escogido por el usuario.
"""
avatars=["Scharifker","Eugenio Mendoza","Pelusa","Gandhi"]
while True:
try:
avatar=input("""Selecciona tu ávatar:
(1) Scharifker
(2) Eugenio Mendoza
(3) Pelusa
(4) Gandhi
==> """)
avatar=avatars[int(avatar)-1]
break
except:
print("El ávatar seleccionado no existe.")
return avatar
def validate_not_repeat(users,username):
"""Valida que el nombre de usuario no esté ya registrado
Args:
[dic]: dic, diccionario con la información de usuarios registrados
[str]: username, nombre de usuario propuesto por el usuario
Returns:
[Bool]: True, si el username no está registrado, False, si lo está.
"""
if username in users:
return False
else:
return True
def validate_username(username):
"""Valida que el nombre de usuario cumple con los requisitos los cuales son: contenga unicamente letras, numeros, puntos y guión bajo.
Args:
[str]: username, nombre de usuario propuesto por el usuario
Returns:
[Bool]: True, si el username es valida, False si no.
"""
flag = 0
while True:
if (len(username)<6):
flag = -1
break
elif not re.match('^[a-z0-9._]*$', username):
flag = -1
break
else:
return True
if flag ==-1:
return False
def validate_password(password):
"""Valida que la contraseña cumple con los requisitos los cuales son: tenga por lo menos 6 caracteres, no contenga ',' y contenga letras y números.
Args:
[str]: password, contraseña propuesta por el usuario
Returns:
[Bool]: True, si la contraseña es valida, False si no.
"""
flag = 0
while True:
if (len(password)<6):
flag = -1
break
elif not re.search("[a-z]", password):
flag = -1
break
elif not re.search("[0-9]", password):
flag = -1
break
if "," in password:
flag = -1
break
elif re.search("\s", password):
flag = -1
break
else:
flag = 0
return True
if flag ==-1:
return False
def register(users):
"""Registra a nuevos usuarios, validando que no estén ya registrados.
Args:
[dic]: users, con los usuarios ya registrados
Returns:
[Objeto clase "Player"]: Objeto en donde está toda la información del usuario durante la partida, aquí ya está instanciado.
"""
while True:
try:
username=input("Ingrese su nombre de usuario: ")
if not validate_not_repeat(users, username):
raise NameError
if not validate_username(username):
raise Exception
password=input("Ingrese su contraseña: ")
if not validate_password(password):
raise Exception
re_password=input("Repita nuevamente su contraseña: ")
if not (password == re_password):
raise Exception
break
except NameError:
print("Nombre de usuario ya registrado")
except:
print("Usuario o contraseña no permitido\nVerique que su nombre de usuario contenga unicamente letras, numeros, puntos y guión bajo.\nVerifique que su contraseña tenga por lo menos 6 caracteres, no contenga ',' y contenga letras y números. ")
while True:
try:
age = int(input("Ingrese su edad: "))
if not (age > 0):
raise Exception
break
except:
print("Dato no válido.")
avatar=avatar_selection()
with open("users.txt","a") as users:
users.write(username + ",")
users.write(password + ",")
users.write(str(age) + ",")
users.write(avatar + "\n")
return Player(username,password, age, avatar)
def menu(users):
"""Muestra las principales opciones para iniciar el juego, ver las intrucciones y ver records de quienes ya hayan jugado.
Args:
[dic]: users, con los usuarios ya registrados
Returns:
[Objeto clase "Player"]: Objeto en donde está toda la información del usuario durante la partida.
"""
while True:
while True:
try:
option=input(""" ---Menú---
(1) Comenzar nueva partida
(2) Ver las instrucciones
(3) Ver records
==> """)
if not (option=="1" or option=="2" or option=="3"):
raise Exception
break
except:
print("Escoja una opción correcta.")
if option=="1":
while True:
try:
option=input("""\n---¿Qué desea hacer?---
(1) Crear nuevo usuario
(2) Continuar con usuario ya creado
==> """)
if not (option=="1" or option=="2"):
raise Exception
break
except:
print("Escoja una opcion correcta")
if option=="1":
player=register(users)
elif option=="2":
player=validate_user(users)
difficulty_level(player)
return player
elif option=="2":
get_instructions()
elif option=="3":
show_statistics()
def intro():
"""Imprime la bienvenida del juego
"""
term = Terminal()
print(f"{term.home}{term.clear}")
print("Presione 'q' para empezar")
with term.cbreak():
val = ''
while val.lower() != "q":
val = term.inkey(timeout=2)
os.system("clear")
print("""
██████ ██ ███████ ███ ██ ██ ██ ███████ ███ ██ ██ ██████ ██████
██ ██ ██ ██ ████ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██
██████ ██ █████ ██ ██ ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ███████ ██ ████ ████ ███████ ██ ████ ██ ██████ ██████
█████
██ ██
███████
██ ██
██ ██
███████╗███████╗ ██████╗ █████╗ ██████╗ █████╗ ███╗ ███╗███████╗████████╗
██╔════╝██╔════╝██╔════╝██╔══██╗██╔══██╗██╔══██╗████╗ ████║██╔════╝╚══██╔══╝
█████╗ ███████╗██║ ███████║██████╔╝███████║██╔████╔██║█████╗ ██║
██╔══╝ ╚════██║██║ ██╔══██║██╔═══╝ ██╔══██║██║╚██╔╝██║██╔══╝ ██║
███████╗███████║╚██████╗██║ ██║██║ ██║ ██║██║ ╚═╝ ██║███████╗ ██║
╚══════╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝
""")
def set_users():
"""Coloca todos los users que ya están registrados en el archivo de texto en un diccionario.
Returns:
[dict]: users, con todos los usuarios registrados.
"""
users={}
try:
with open("users.txt") as u:
for line in u:
users[line.split(",")[0]] = {}
users[line.split(",")[0]]["password"]=line.split(",")[1]
users[line.split(",")[0]]["age"]=line.split(",")[2]
users[line.split(",")[0]]["avatar"]=line.split(",")[3].replace("\n","")
except:
pass
return users
def main():
"""Función principal de todo el programa.
"""
users=set_users()
intro()
player = menu(users)
if main_game.main_game(player):
os.system("clear")
set_statistics(player)
win_screen(player)
else:
os.system("clear")
lose_screen(player)
if __name__ == "__main__":
main()