BotsTelegram_Python/02-colgado_bot/estados_colgado.py

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()