147 lines
5.8 KiB
Python
147 lines
5.8 KiB
Python
"""
|
|
Implementacion juego colgado usando estados
|
|
"""
|
|
import random
|
|
from telegram import ReplyKeyboardMarkup
|
|
from palabras import instrumentos, verbos, alfabeto
|
|
from anim_colgado import anim
|
|
from constantes import BOTONES
|
|
|
|
class EstadoSelec:
|
|
"""
|
|
Seleciona lista de palabras
|
|
"""
|
|
def accion(self, msg, user_data):
|
|
user_data.vidas = 0
|
|
user_data.tipo_palabra = ""
|
|
user_data.palabra_juego = ""
|
|
user_data.letras_palabra = set()
|
|
user_data.letras_usadas = set()
|
|
teclado = ReplyKeyboardMarkup([["verbos"], ["instrumentos"]], one_time_keyboard=True)
|
|
self.next = EstadoJugar()
|
|
info = "Inciando juego 🤹 \n\n - - \'El Colgado\' - -\n\nElige la palabra a encontrar:\n Verbos o Instrumentos Musicales."
|
|
ret = {
|
|
"msg": info,
|
|
"reply_markup": teclado
|
|
}
|
|
return ret
|
|
|
|
class EstadoJugar:
|
|
"""
|
|
Asignación variables de juego
|
|
"""
|
|
def accion(self, msg, user_data):
|
|
if msg == "verbos" or msg == "instrumentos":
|
|
user_data.tipo_palabra = msg
|
|
user_data.vidas = 6
|
|
palabra = get_palabra(msg)
|
|
user_data.palabra_juego = palabra
|
|
user_data.letras_palabra = set(palabra)
|
|
lista_palabra = [letra if letra in user_data.letras_usadas else '_' for letra in user_data.palabra_juego]
|
|
if user_data.tipo_palabra == "instrumentos":
|
|
palabra_en_pantalla = '\nInstrumento Musical: ' + ' '.join(lista_palabra)
|
|
elif user_data.tipo_palabra == "verbos":
|
|
palabra_en_pantalla = '\nVerbo : ' + ' '.join(lista_palabra)
|
|
estatus = '\nIntentos restantes ['+ str(user_data.vidas) +']'+' - Letras usadas: '+''.join(user_data.letras_usadas)
|
|
info = anim[6] + estatus + palabra_en_pantalla + "\nEnviame una letra"
|
|
self.next = EstadoValidaLetra()
|
|
teclado = ReplyKeyboardMarkup(BOTONES, one_time_keyboard=True)
|
|
ret = {
|
|
"msg": info,
|
|
"reply_markup": teclado
|
|
}
|
|
else:
|
|
teclado = ReplyKeyboardMarkup([["verbos"], ["instrumentos"]], one_time_keyboard=True)
|
|
self.next = EstadoJugar()
|
|
ret = {
|
|
"msg": f"\'{msg}\' no es una opción válida.\nEscoge Verbos o Instrumentos Musicales",
|
|
"reply_markup": teclado
|
|
}
|
|
return ret
|
|
|
|
class EstadoValidaLetra:
|
|
def accion(self, msg, user_data):
|
|
resp = msg
|
|
resultado = ""
|
|
final = ""
|
|
if len(user_data.letras_palabra) > 0 and user_data.vidas > 0:
|
|
self.next = EstadoValidaLetra()
|
|
invalida = False
|
|
letra_user = resp.upper()
|
|
if letra_user in alfabeto - user_data.letras_usadas:
|
|
user_data.letras_usadas.add(letra_user)
|
|
if letra_user in user_data.letras_palabra:
|
|
user_data.letras_palabra.remove(letra_user)
|
|
else:
|
|
user_data.vidas -= 1
|
|
resultado = f'\n\'{letra_user}\' no es parte del nombre'
|
|
invalida = True
|
|
elif letra_user in user_data.letras_usadas:
|
|
resultado = '\nYa usaste esta letra, prueba con otra'
|
|
invalida = True
|
|
else:
|
|
resultado = '\nCaracter inválido'
|
|
invalida = True
|
|
if invalida:
|
|
self.next = EstadoValidaLetra()
|
|
final = "\nEnviame una letra"
|
|
if user_data.vidas == 0:
|
|
final = '\n\n--- Perdiste 😓️ \n--- la palabra era ' + user_data.palabra_juego.upper() + '\n (enviame un msg para continuar)'
|
|
self.next = EstadoFinal()
|
|
elif len(user_data.letras_palabra) == 0:
|
|
final = '\n\n--- 🎊️🎉️ Felicitaciones 🎊️🎉️ \n--- encontraste la palabra\n'+ '\n (enviame un msg para continuar)'
|
|
self.next = EstadoFinal()
|
|
lista_palabra = [letra if letra in user_data.letras_usadas else '_' for letra in user_data.palabra_juego]
|
|
if user_data.tipo_palabra == "instrumentos":
|
|
palabra_en_pantalla = '\nInstrumento Musical: ' + ' '.join(lista_palabra)
|
|
elif user_data.tipo_palabra == "verbos":
|
|
palabra_en_pantalla = '\nVerbo : ' + ' '.join(lista_palabra)
|
|
estatus = '\nIntentos restantes ['+ str(user_data.vidas) +']'+' - Letras usadas: '+''.join(user_data.letras_usadas)
|
|
info = resultado + anim[user_data.vidas] + estatus + palabra_en_pantalla + final
|
|
#botones = [[letra.upper()] for letra in alfabeto - user_data.letras_usadas]
|
|
teclado = ReplyKeyboardMarkup(BOTONES, one_time_keyboard=True)
|
|
ret = {
|
|
"msg": info,
|
|
"reply_markup": teclado
|
|
}
|
|
return ret
|
|
|
|
|
|
class EstadoFinal:
|
|
"""
|
|
Fin del juego
|
|
"""
|
|
def accion(self, msg, user_data):
|
|
teclado = ReplyKeyboardMarkup([["Jugar"]], one_time_keyboard=True)
|
|
self.next = EstadoSalto()
|
|
ret = {
|
|
"msg": "Quieres volver a jugar?",
|
|
"reply_markup": teclado
|
|
}
|
|
return ret
|
|
|
|
|
|
class EstadoSalto:
|
|
"""
|
|
Registra respuesta y salta a otro estado.
|
|
"""
|
|
def accion(self, msg, user_data):
|
|
if msg == "Jugar":
|
|
estado = EstadoSelec()
|
|
else:
|
|
estado = EstadoFinal()
|
|
ret = estado.accion(msg, user_data)
|
|
self.next = estado.next
|
|
return ret
|
|
|
|
def get_palabra(tipo_palabra):
|
|
""" Selecciona un string de la lista pasada como argumento """
|
|
if tipo_palabra == "verbos":
|
|
palabra = random.choice(verbos)
|
|
elif tipo_palabra == "instrumentos":
|
|
palabra = random.choice(instrumentos)
|
|
while '_' in palabra or ' ' in palabra:
|
|
palabra = random.choice(instrumentos)
|
|
tipo_palabra = "instrumentos"
|
|
return palabra.upper()
|