Ir al contenido principal

Crear un rompecabezas con Dragula.js

 Instalamos la librería de componentes:

<script src="https://gorosito.red/componentes"></script>

En el BODY agregamos un objeto de etiqueta para-arrastrar. Esto instalará automáticamente la librería Dragula.js de Bevacqua. Lo identificamos como idArrastra.

Adentro agregamos un DIVisor. Lo identificamos. Por ejemplo, como idNumeros.

<para-arrastrar eventos="fnEvento" id="idArrastra" >
    <div id="idNumeros"></div>
</para-arrastrar>

En el atributo eventos del objeto para-arrastrar ejecutará la función que le demos como valor cuando en Dragula.js soltamos un objeto arrastrable. Pero lo analizaremos más adelante.

Ahora, agregamos un SCRIPT. Este SCRIPT va a popular o poblar el DIVisor dentro del arrastrador. Agreguemos 9 ARTICLEs, como para lograr un rompecabezas de 9 piezas.

    [1,2,3,4,5,6,7,8,9]
        .sort( (a,b)=>Math.random()-0.5 )
        .forEach(
            function( $cadaNumero ) {
                idNumeros.innerHTML += `<article>${ $cadaNumero }</article>`;
            }
        )
    ;


Luego, creamos a la función fnEvento(). Según Dragula.js se le aplican tres parámetros: el objeto que se ha movido, el contenedor destino y el contenedor origen, respectivamente. 

Pero para nuestro caso haremos lo siguiente: Armamos una frase con los 9 números, según cada ARTICLE modificado, actualizado. Si coincide con la frase "123456789" quiere decir que ¡está ordenado!

    function fnEvento($item){
        var frase = "" ;
        [...idNumeros.children]
            .forEach(
                function( idCadaNumero ) {
                    frase += idCadaNumero.innerHTML.trim() ;
                }
            )
        ;
        if( frase == "123456789" ) {
            alert( "Ganador!" ) ;
            location.reload() ;
        }
        console.log(frase)
    }

Listo, ya tenemos un rompecabezas con Dragula.js.
Si querés algo de CSS, para que cada número se vea más interactivo:

#idNumeros { 
    width: 120px
    ; user-select: none 
}
#idNumeros article { 
    display: inline-block
    ; width: 40px
    ; height: 40px 
    ; background: linear-gradient(45deg,teal,purple);
}

Comentarios

Entradas populares de este blog

Probando ChatGPT - Mapa conceptual con Mermaid

 Había conversado con ChatGPT acerca de cuidado de las plantas e hidroponía. Luego de unos días me di cuenta que quizás también podría saber acerca de crear Mapas conceptuales. Salió lo siguiente; le falta un concepto para crear correctamente mapas conceptuales (la relación entre los conceptos), pero podría ser algo para ayudarnos a corregir mejor. El texto original era el que cito a continuación, pero le agregué explícitamente que me armara un "mapa conceptual" utilizando el lenguaje Mermaid, un lenguaje descriptivo que permite construir gráficos diversos, entre ellos Mapas conceptuales, generando un archivo SVG. ``` Hacé un mapa conceptual en lenguaje Mermaid con el siguiente texto, redactado anteriormente: "La hidroponía es un método de cultivo que se utiliza para cultivar plantas sin suelo utilizando una solución nutriente y agua. Algunas plantas pueden cultivarse con éxito mediante hidroponía, mientras que otras necesitan el suelo para crecer y prosperar. De las pl...

Conectar a Servidor Node.JS desde VB6 o VBA

El presente código sirve tanto para Visual Basic 6.0 (sí, todavía sirve, todavía sirve!) como para Visual Basic para Aplicaciones (Excel o VBA). ' Si estamos en Visual Basic para Aplicaciones agregar la referencia ' WinHTTP, en el menú Herramientas, Referencias, Microsoft WinHTTP Services Function Solicitar( _ ByVal URLBase As String _ , Optional ByVal Puerto As Integer = 80 _ , Optional ByVal Seccion As String = "" _ , Optional ByVal Metodo As String = "GET" _ ) As String On Error GoTo solucion #If VBA6 Then Dim objXML As New WinHttpRequest #ElseIf Win32 Then Dim objXML As Object Set objXML = CreateObject("MSXML2.ServerXMLHTTP") #End If objXML.Open Metodo, URLBase & ":" & Puerto & "/" & Seccion, False objXML.send If (objXML.Status = 404) Then Solicitar = "404 Error" Else Solicitar = objXML.responseText End If Se...