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