Consulta sobre uso y comportamiento de botones

Hola buenos días,

Me encuentro realizando el curso del Ministerio de Educación “Pensamiento Computacional e Introducción a la Programación con Pilas-Engine”. Actualmente estoy intentando hacer un juego tipo memoria o de unir respuestas correctas (pares) en Inglés. Pude hacer la introducción y crear los botones pero no puedo lograr hacer que al seleccionar dos botones correctos (hacer click en 2 botones), estos se eliminen o se marquen como completos. ¡Cualquier ayuda o sugerencia será bienvenida!

No puedo adjuntar lo que llevo hecho hasta el momento. Espero y se entienda mi consulta. Subo imágenes con el código.








Gracias,

Hola @daniptti !!!

Se me ocurrió una forma de hacerlo, creo que te puede servir:

En primer lugar, generé los botones con las palabras en distintas posiciones de la pantalla
(esto ya lo tenés hecho en tu versión por lo que pude ver en las capturas de pantallas). Luego, generé una lista llamada “pareja_de_botones”, en donde coloqué las parejas de botones (el DO con DID, y BUY con BOUGHT).

Por último, armé una función que se tiene que ejecutar cada vez que el usuario hace click sobre un botón. La idea es muy simple, cuando se pulsa un botón, la función intenta ver si el botón pulsado (y el anteriormente pulsado) son una pareja de botones. Si lo son, los elimina y aumenta el puntaje.

El resultado quedó así:

y el código:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

puntaje = pilas.actores.Puntaje(x=-200, y=100)

boton_did = pilas.interfaz.Boton("DID", x=100, y=100)
boton_do = pilas.interfaz.Boton("DO", x=0, y=0)

boton_bought = pilas.interfaz.Boton("BOUGHT", x=100, y=0)
boton_buy = pilas.interfaz.Boton("BUY", x=0, y=100)

parejas_de_botones = [
    [boton_did, boton_do],
    [boton_buy, boton_bought]
]


def son_botones_pareja(boton_1, boton_2):
    combinacion_1 = [boton_1, boton_2]
    combinacion_2 = [boton_2, boton_1]
    
    
    if combinacion_1 in parejas_de_botones:
        return True
        
    if combinacion_2 in parejas_de_botones:
        return True
        
    return False


ultimo_boton_pulsado = None


def cuando_pulsa_un_boton():
    global ultimo_boton_pulsado
    
    posicion_del_mouse = pilas.obtener_posicion_del_mouse()
    (x, y) = posicion_del_mouse
    
    # Obtiene el actor debajo del mouse, el [-1] sirve
    # para evitar que se detecte el fondo de pantalla como
    # el actor pulsado.
    actor_pulsado = pilas.obtener_actores_en(x, y)[-1]
    
    if actor_pulsado:
        
        if ultimo_boton_pulsado:
        
            if son_botones_pareja(ultimo_boton_pulsado, actor_pulsado):
                ultimo_boton_pulsado.eliminar()
                actor_pulsado.eliminar()
                puntaje.aumentar()
                pilas.avisar(actor_pulsado.texto + " y " + ultimo_boton_pulsado.texto)
    
        ultimo_boton_pulsado = actor_pulsado
    

# Conecta todos los botones a la funcion que
# elimina y suma puntos
boton_did.conectar(cuando_pulsa_un_boton)
boton_do.conectar(cuando_pulsa_un_boton)
boton_buy.conectar(cuando_pulsa_un_boton)
boton_bought.conectar(cuando_pulsa_un_boton)

pilas.ejecutar()

Avisanos si te sirve!, saludos!

Hola buenas noches,

Gracias por la respuesta! Seguí tu ejemplo tal cual me lo pasaste y cree el resto de los botones. Logré hacer que funcionara, lo guardé y cuando lo abrí de nuevo no funcionó más! Da error en el método ultimo_boton_pulsado. La verdad que ya no sé que puede ser, ¿será que al guardar el archivo se produce algún cambio?.

Cualquier asistencia se los agradeceré.

Saludos,

-------CÓDIGO--------

 # coding: utf-8
import pilasengine
import sys
sys.path.insert(0, "..")

pilas = pilasengine.iniciar()

fondo_inicial = pilas.fondos.Plano()
titulo=pilas.actores.Texto(u"Irregular Verbs")
titulo.color=pilas.colores.Color(245,0,154)


#dar las instrucciones del juego
def dar_instrucciones():
    tuna.decir(u"Match the infinitive and simple past forms\n of the following irregular verbs.")
    btn_ready = pilas.interfaz.Boton(u"Ready?")
    btn_ready.x = 0
    btn_ready.y = -150
    btn_yes.ocultar()
    btn_no.ocultar()
    #opcion_juega
    def crear_iniciar_juego():
        fondo_inicial.eliminar()
        fondo = pilas.fondos.FondoMozaico()
        tuna.eliminar()
        titulo.eliminar()
        btn_ready.eliminar()
        #BOTONES
        puntaje = pilas.actores.Puntaje(x=0, y=0)
        puntaje.color = pilas.colores.Color(0,0,255)
        
        boton_do = pilas.interfaz.Boton("DO", x=-126, y=170)
        boton_did = pilas.interfaz.Boton("DID", x=0, y=-80)
            
        boton_buy = pilas.interfaz.Boton("BUY", x=130, y=170)
        boton_bought = pilas.interfaz.Boton("BOUGHT", x=-126, y=-200)
        
        boton_fall = pilas.interfaz.Boton("FALL", x=-255, y=170)
        boton_fell = pilas.interfaz.Boton("FELL", x=130, y=-200)
            
        boton_get = pilas.interfaz.Boton("GET", x=-255, y=45)
        boton_got = pilas.interfaz.Boton("GOT", x=255, y=-80)
    
        boton_speak = pilas.interfaz.Boton("SPEAK", x=0, y=-200)
        boton_spoke = pilas.interfaz.Boton("SPOKE", x=0, y=45)

        boton_make = pilas.interfaz.Boton("MAKE", x=255, y=170)
        boton_made = pilas.interfaz.Boton("MADE", x=-255, y=-200)

        boton_run = pilas.interfaz.Boton("RUN", x=-126, y=-80)
        boton_ran = pilas.interfaz.Boton("RAN", x=255, y=-200)
    
        boton_write = pilas.interfaz.Boton("WRITE", x=-255, y=-80)
        boton_wrote = pilas.interfaz.Boton("WROTE", x=255, y=45)
    
        boton_drink = pilas.interfaz.Boton("DRINK", x=0, y=170)
        boton_drank = pilas.interfaz.Boton("DRANK", x=130, y=-80)

        boton_meet = pilas.interfaz.Boton("MEET", x=-126, y=45)
        boton_met = pilas.interfaz.Boton("MET", x=130, y=45)
  
        parejas_de_botones = [
            [boton_do, boton_did],
            [boton_buy, boton_bought],
            [boton_fall, boton_fell],
            [boton_get, boton_got],
            [boton_speak, boton_spoke],
            [boton_make, boton_made],
            [boton_run, boton_ran],
            [boton_write, boton_wrote],
            [boton_drink, boton_drank],
            [boton_meet, boton_met]
        ]


        def son_botones_pareja(boton_1, boton_2):
            combinacion_1 = [boton_1, boton_2]
            combinacion_2 = [boton_2, boton_1]    
    
            if combinacion_1 in parejas_de_botones:
                return True
        
            if combinacion_2 in parejas_de_botones:
                return True
        
            return False


        ultimo_boton_pulsado = None

        def cuando_pulsa_un_boton():
            global ultimo_boton_pulsado
    
            posicion_del_mouse = pilas.obtener_posicion_del_mouse()
            (x, y) = posicion_del_mouse
    
            # Obtiene el actor debajo del mouse, el [-1] sirve
            # para evitar que se detecte el fondo de pantalla como
            # el actor pulsado.
            actor_pulsado = pilas.obtener_actores_en(x, y)[-1]
    
            if actor_pulsado:
                
                if ultimo_boton_pulsado:
                    if son_botones_pareja(ultimo_boton_pulsado, actor_pulsado):
                        ultimo_boton_pulsado.eliminar()
                        actor_pulsado.eliminar()
                        puntaje.aumentar()
                        texto = pilas.actores.TextoInferior(actor_pulsado.texto + " y " + ultimo_boton_pulsado.texto)
                        texto.color = pilas.colores.azul
                        #pilas.avisar(actor_pulsado.texto + " y " + ultimo_boton_pulsado.texto)

            ultimo_boton_pulsado = actor_pulsado
    

        # Conecta todos los botones a la funcion que
        # elimina y suma puntos
        
            boton_do.conectar(cuando_pulsa_un_boton)
            boton_did.conectar(cuando_pulsa_un_boton)
            boton_buy.conectar(cuando_pulsa_un_boton)
            boton_bought.conectar(cuando_pulsa_un_boton)
            boton_fall.conectar(cuando_pulsa_un_boton)
            boton_fell.conectar(cuando_pulsa_un_boton)
            boton_get.conectar(cuando_pulsa_un_boton)
            boton_got.conectar(cuando_pulsa_un_boton)
            boton_speak.conectar(cuando_pulsa_un_boton)
            boton_spoke.conectar(cuando_pulsa_un_boton)
            boton_make.conectar(cuando_pulsa_un_boton)
            boton_made.conectar(cuando_pulsa_un_boton)
            boton_run.conectar(cuando_pulsa_un_boton)
            boton_ran.conectar(cuando_pulsa_un_boton)
            boton_write.conectar(cuando_pulsa_un_boton)
            boton_wrote.conectar(cuando_pulsa_un_boton)
            boton_drink.conectar(cuando_pulsa_un_boton)
            boton_drank.conectar(cuando_pulsa_un_boton)
            boton_meet.conectar(cuando_pulsa_un_boton)
            boton_met.conectar(cuando_pulsa_un_boton)
        
    btn_ready.conectar(crear_iniciar_juego)    
     
#opcion no juega
def no_juega():
    tuna.decir(u"Bye, see you later!")
    tuna.eliminar()
    btn_yes.eliminar()
    btn_no.eliminar()
    titulo.eliminar()
    fondo_inicial.eliminar()

tuna=pilas.actores.Aceituna()
tuna.escala=2
tuna.y=100
tuna.decir(u"Wanna play a game?")
#YES
btn_yes = pilas.interfaz.Boton(u"YES")
btn_yes.x = -100
btn_yes.y = -60
btn_yes.conectar(dar_instrucciones)
#NO
btn_no = pilas.interfaz.Boton(u"NO")
btn_no.x = 100
btn_no.y = -60
btn_no.conectar(no_juega)

pilas.ejecutar()

Hola @daniptti!!

Ahí lo pude resolver, aparentemente la variable global tenía que estar al principio del archivo, y también vi que había algunos problemas de identación:

# coding: utf-8
import pilasengine
import sys
sys.path.insert(0, "..")

pilas = pilasengine.iniciar()

fondo_inicial = pilas.fondos.Plano()
titulo=pilas.actores.Texto(u"Irregular Verbs")
titulo.color=pilas.colores.Color(245,0,154)

ultimo_boton_pulsado = None

#dar las instrucciones del juego
def dar_instrucciones():
    tuna.decir(u"Match the infinitive and simple past forms\n of the following irregular verbs.")
    btn_ready = pilas.interfaz.Boton(u"Ready?")
    btn_ready.x = 0
    btn_ready.y = -150
    btn_yes.ocultar()
    btn_no.ocultar()
    #opcion_juega
    def crear_iniciar_juego():
        fondo_inicial.eliminar()
        fondo = pilas.fondos.FondoMozaico()
        tuna.eliminar()
        titulo.eliminar()
        btn_ready.eliminar()
        #BOTONES
        puntaje = pilas.actores.Puntaje(x=0, y=0)
        puntaje.color = pilas.colores.Color(0,0,255)
        
        boton_do = pilas.interfaz.Boton("DO", x=-126, y=170)
        boton_did = pilas.interfaz.Boton("DID", x=0, y=-80)
            
        boton_buy = pilas.interfaz.Boton("BUY", x=130, y=170)
        boton_bought = pilas.interfaz.Boton("BOUGHT", x=-126, y=-200)
        
        boton_fall = pilas.interfaz.Boton("FALL", x=-255, y=170)
        boton_fell = pilas.interfaz.Boton("FELL", x=130, y=-200)
            
        boton_get = pilas.interfaz.Boton("GET", x=-255, y=45)
        boton_got = pilas.interfaz.Boton("GOT", x=255, y=-80)
    
        boton_speak = pilas.interfaz.Boton("SPEAK", x=0, y=-200)
        boton_spoke = pilas.interfaz.Boton("SPOKE", x=0, y=45)

        boton_make = pilas.interfaz.Boton("MAKE", x=255, y=170)
        boton_made = pilas.interfaz.Boton("MADE", x=-255, y=-200)

        boton_run = pilas.interfaz.Boton("RUN", x=-126, y=-80)
        boton_ran = pilas.interfaz.Boton("RAN", x=255, y=-200)
    
        boton_write = pilas.interfaz.Boton("WRITE", x=-255, y=-80)
        boton_wrote = pilas.interfaz.Boton("WROTE", x=255, y=45)
    
        boton_drink = pilas.interfaz.Boton("DRINK", x=0, y=170)
        boton_drank = pilas.interfaz.Boton("DRANK", x=130, y=-80)

        boton_meet = pilas.interfaz.Boton("MEET", x=-126, y=45)
        boton_met = pilas.interfaz.Boton("MET", x=130, y=45)
  
        parejas_de_botones = [
            [boton_do, boton_did],
            [boton_buy, boton_bought],
            [boton_fall, boton_fell],
            [boton_get, boton_got],
            [boton_speak, boton_spoke],
            [boton_make, boton_made],
            [boton_run, boton_ran],
            [boton_write, boton_wrote],
            [boton_drink, boton_drank],
            [boton_meet, boton_met]
        ]


        def son_botones_pareja(boton_1, boton_2):
            combinacion_1 = [boton_1, boton_2]
            combinacion_2 = [boton_2, boton_1]    
    
            if combinacion_1 in parejas_de_botones:
                return True
        
            if combinacion_2 in parejas_de_botones:
                return True
        
            return False




        def cuando_pulsa_un_boton():
            global ultimo_boton_pulsado
    
            posicion_del_mouse = pilas.obtener_posicion_del_mouse()
            (x, y) = posicion_del_mouse
    
            # Obtiene el actor debajo del mouse, el [-1] sirve
            # para evitar que se detecte el fondo de pantalla como
            # el actor pulsado.
            actor_pulsado = pilas.obtener_actores_en(x, y)[-1]
    
            if actor_pulsado:
                
                if ultimo_boton_pulsado:
                    if son_botones_pareja(ultimo_boton_pulsado, actor_pulsado):
                        ultimo_boton_pulsado.eliminar()
                        actor_pulsado.eliminar()
                        puntaje.aumentar()
                        texto = pilas.actores.TextoInferior(actor_pulsado.texto + " y " + ultimo_boton_pulsado.texto)
                        texto.color = pilas.colores.azul
                        #pilas.avisar(actor_pulsado.texto + " y " + ultimo_boton_pulsado.texto)

            ultimo_boton_pulsado = actor_pulsado
    

        # Conecta todos los botones a la funcion que
        # elimina y suma puntos
        
        boton_do.conectar(cuando_pulsa_un_boton)
        boton_did.conectar(cuando_pulsa_un_boton)
        boton_buy.conectar(cuando_pulsa_un_boton)
        boton_bought.conectar(cuando_pulsa_un_boton)
        boton_fall.conectar(cuando_pulsa_un_boton)
        boton_fell.conectar(cuando_pulsa_un_boton)
        boton_get.conectar(cuando_pulsa_un_boton)
        boton_got.conectar(cuando_pulsa_un_boton)
        boton_speak.conectar(cuando_pulsa_un_boton)
        boton_spoke.conectar(cuando_pulsa_un_boton)
        boton_make.conectar(cuando_pulsa_un_boton)
        boton_made.conectar(cuando_pulsa_un_boton)
        boton_run.conectar(cuando_pulsa_un_boton)
        boton_ran.conectar(cuando_pulsa_un_boton)
        boton_write.conectar(cuando_pulsa_un_boton)
        boton_wrote.conectar(cuando_pulsa_un_boton)
        boton_drink.conectar(cuando_pulsa_un_boton)
        boton_drank.conectar(cuando_pulsa_un_boton)
        boton_meet.conectar(cuando_pulsa_un_boton)
        boton_met.conectar(cuando_pulsa_un_boton)
        
    btn_ready.conectar(crear_iniciar_juego)    
     
#opcion no juega
def no_juega():
    tuna.decir(u"Bye, see you later!")
    tuna.eliminar()
    btn_yes.eliminar()
    btn_no.eliminar()
    titulo.eliminar()
    fondo_inicial.eliminar()

tuna=pilas.actores.Aceituna()
tuna.escala=2
tuna.y=100
tuna.decir(u"Wanna play a game?")
#YES
btn_yes = pilas.interfaz.Boton(u"YES")
btn_yes.x = -100
btn_yes.y = -60
btn_yes.conectar(dar_instrucciones)
#NO
btn_no = pilas.interfaz.Boton(u"NO")
btn_no.x = 100
btn_no.y = -60
btn_no.conectar(no_juega)

pilas.ejecutar()

Para ver exactamente lo que cambié, podrías usar un sitio tipo https://www.diffchecker.com/ y pegar los dos códigos.

Saludos!

Muchas gracias por tu ayuda! Saludos!