import sys


class Nodo:

    def __init__(self, pregunta_o_artista, es_artista=False):
        self.contenido = pregunta_o_artista
        self.es_artista = es_artista
        self.si = None
        self.no = None


def construir_arbol_inicial():
    """Crea la estructura inicial de preguntas y artistas."""
    raiz = Nodo("¿Es un cantante o grupo musical?")

    # Rama SI (Músicos)
    música = Nodo("¿Canta principalmente en español?")
    música.si = Nodo("Bad Bunny", es_artista=True)
    música.no = Nodo("Taylor Swift", es_artista=True)

    # Rama NO (No músicos: Actores, Pintores, etc.)
    no_música = Nodo("¿Es conocido principalmente por actuar en películas?")
    no_música.si = Nodo("Leonardo DiCaprio", es_artista=True)
    no_música.no = Nodo("Leonardo da Vinci", es_artista=True)

    raiz.si = música
    raiz.no = no_música

    return raiz


def obtener_respuesta_valida(pregunta):
    """Pide al usuario una respuesta clara de sí o no."""
    while True:
        respuesta = (
            input(f"{pregunta} (s/n): ").strip().lower()
        )  # Corregido: .lower() es un método
        if respuesta in ["s", "si", "sí"]:
            return True
        elif respuesta in ["n", "no"]:
            return False
        print("Por favor, responde con 's' para Sí o 'n' para No.")


def jugar_y_aprender(nodo_actual):
    """Recorre el árbol de preguntas y aprende nuevos artistas si falla."""
    # Si llegamos a una hoja del árbol (un artista concreto)
    if nodo_actual.es_artista:
        es_correcto = obtener_respuesta_valida(
            f"¿Estás pensando en **{nodo_actual.contenido}**?"
        )

        if es_correcto:
            print("\n¡Adiviné! Soy genial. 😎")
        else:
            print("\n¡Me ganaste! No sé en quién estabas pensando. 🤯")
            nuevo_artista = input("¿En qué artista estabas pensando?: ").strip()
            nueva_pregunta = input(
                f"Escribe una pregunta que dé como respuesta 'SÍ' para {nuevo_artista} "
                f"y 'NO' para {nodo_actual.contenido}:\n> "
            ).strip()

            # El nodo actual pasa a ser la nueva pregunta
            artista_anterior = nodo_actual.contenido
            nodo_actual.contenido = nueva_pregunta
            nodo_actual.es_artista = False

            # Se agregan los dos caminos: el nuevo artista (Sí) y el antiguo (No)
            nodo_actual.si = Nodo(nuevo_artista, es_artista=True)
            nodo_actual.no = Nodo(artista_anterior, es_artista=True)

            print(f"\n¡Gracias! He aprendido a identificar a {nuevo_artista}.")
        return

    # Si todavía no es un artista, sigue haciendo preguntas
    respuesta = obtener_respuesta_valida(nodo_actual.contenido)

    if respuesta:
        jugar_y_aprender(nodo_actual.si)
    else:
        jugar_y_aprender(nodo_actual.no)


def main():
    print("=" * 50)
    print("      ¡BIENVENIDO AL ADIVINADOR DE ARTISTAS!")
    print("  Piensa en un artista y responder a mis preguntas.")
    print("=" * 50)

    arbol_base = construir_arbol_inicial()

    while True:
        print("\n--- NUEVA PARTIDA ---")
        jugar_y_aprender(arbol_base)

        otra_vez = obtener_respuesta_valida("\n¿Quieres jugar otra vez?")
        if not otra_vez:
            print("\n¡Gracias por jugar! Hasta la próxima. 👋")
            break


if __name__ == "__main__":
    main()

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: