How to resolve the algorithm 15 puzzle game step by step in the Amazing Hopper programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm 15 puzzle game step by step in the Amazing Hopper programming language

Table of Contents

Problem Statement

Implement the Fifteen Puzzle Game.

The   15-puzzle   is also known as:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm 15 puzzle game step by step in the Amazing Hopper programming language

Source code in the amazing programming language

#include 

#define FILATABLA            5
#define COLUMNATABLA         10
#define Imprimelamatriz      Gosub 'Pone la matriz'
#define Imprimelascasillas   Gosub 'Pone las casillas'
#define Imprimeelíndiceen(_X_,_Y_)  Set '_X_,_Y_',  Gosub 'Pone el índice'

Main
   Set break

   Void (casilla, índice, números)
   Link gosub( Crea una casilla, Crea el índice, Crea la matriz de números )
   
   Cls
   x=4, y=4, Tok sep '""', Gosub 'Imprime escenario'
   
  /* INICIA EL JUEGO */
   SW = 1, GANADOR = 0
   c=0, cero x=4, cero y=4
   
   Loop
       Let ( c:=Getch )
       Switch ( c )
           Case 'KRIGHT'  { #( y < 4 ) do{ ++y }, Exit }
           Case 'KDOWN'   { #( x < 4 ) do{ ++x }, Exit }
           Case 'KLEFT'   { #( y > 1 ) do{ --y }, Exit }
           Case 'KUP'     { #( x > 1 ) do{ --x }, Exit }
           Case 'KRETURN' { If ( Gosub 'Chequear si movimiento es válido' )
                               Gosub 'Mover las casillas'
                            End If
                            Exit
                          }
           Case 'KESCAPE' { SW=0 }
       End switch
       
       Gosub 'Imprime escenario'
       Break if ( Gosub 'Verificar puzzle resuelto' --- Backup to 'GANADOR' )
   Back if 'SW' is not zero

  /* FIN DEL JUEGO */
   If ( GANADOR )
       Locate (18,15), Printnl("LO RESOLVISTE!")
   End If
   Locate (19,1), Prnl
End

Subrutines

/* CHEQUEO DE MOVIMIENTO */

Define ( Verificar puzzle resuelto )
   ret = 0
   Clr all marks
   Tnúmeros=números
   Redim (Tnúmeros,0), N = 0, Let ( N := Length(Tnúmeros) Minus (1))
   i=1
   Iterator ( ++i, Less equal ( i, N ) And( Not(ret) ), \
           Let ( ret := Bit xor(i, [i] Get 'Tnúmeros') ) )
   Clr all marks
   Clear 'Tnúmeros'

Return 'Not (ret); And( Equals(i, Plus one(N)) ) '

Define ( Chequear si movimiento es válido )
Return 'Only one ( Equals (x, cero x), Equals(y, cero y ) )'

Define ( Mover las casillas )
   If ( Equals (y, cero y) )
      If ( Less (x, cero x) )      // mueve hacia abajo
         Loop for ( i = cero x, #( i >= x ) , --i )
             If ( Greater ( i, 1 ) )
                 [{i} Minus(1), y] Get 'números', [i,y] Put 'números'
             Else
                 [{i} Plus(1), y] Get 'números', [i,y] Put 'números'
             End If
         Next
      Else                         // por defecto: mueve hacia arriba
         Loop for ( i = cero x, #( i <= x ) , ++i )
             If ( Less ( i, 4 ) )
                 [{i} Plus(1), y] Get 'números', [i,y] Put 'números'
             Else
                 [i,y] Get 'números', [{i} Minus(1),y] Put 'números'
             End If
         Next
      End If
      [x,y] Set '0', Put 'números'
      Set 'x', Move to 'cero x'
   Else                           // por defecto: está en la misma fila  
      If ( Less ( y, cero y ) )   // mueve hacia la derecha
         Loop for ( i = cero y, #( i >= y ) , --i )
             If ( Greater ( i, 1) )
                 [x, {i} Minus(1)] Get 'números', [x,i] Put 'números'
             Else
                 [x, y] Get 'números', [x, {i} Plus(1)] Put 'números'
             End If
         Next
      Else                        // por defecto: mueve hacia la izquierda
         Loop for ( i = cero y, #( i <= y ) , ++i )
             If ( Less ( i, 4 ) )
                 [x, {i} Plus(1)] Get 'números', [x,i] Put 'números'
             Else
                 [x,i] Get 'números', [x,{i} Minus(1)] Put 'números'
             End If
         Next
      End If
      [x,y] Set '0', Put 'números'
      Set 'y', Move to 'cero y'
   End If
   Clr all marks
Return

/* DESPLIEGUE DE CUADRITOS Y NUMEROS */

Define ( Imprime escenario )
   Imprime las casillas
   Imprime el índice en 'x,y'
   Imprime la matriz
Return

Define ( Pone la matriz )
   i=4, col = COLUMNA TABLA, celda=""
   Clr all marks
   py=1
   Loop
      j=4, fil = FILA TABLA, px=1
      Loop
         Locate 'Plus one(fil), Plus two (col)' 
         Printnl( Get if ([px,py] Get 'números' ---Backup to (celda)---, celda, "  ") )
         fil += 3 
         --j, ++px
      Back if (j) is not zero
      col += 6, --i, ++py
   Back if (i) is not zero
Return

Define ( Pone las casillas )
   i=4, col = COLUMNA TABLA
   Clr all marks
   Loop
      j=4, fil = FILA TABLA
      Loop
         Set 'fil, col', Gosub 'Pone un cuadrito'
         fil += 3, --j
      Back if (j) is not zero
      col += 6, --i
   Back if (i) is not zero
Return

Define (Pone un cuadrito, fil, col)
   Locate 'fil, col', Print table 'casilla'
Return

Define ( Pone el índice, fil, col )
   /* 5+(fil-1)*3 fila
      10+(col-1)*6 col */
   Clr all marks
   Locate 'Minus one(fil) Mul by (3) Plus (FILA TABLA), Minus one(col) Mulby(6) Plus(COLUMNA TABLA)' 
   Print table 'índice'
Return

/* CONFIGURACION DEL JUEGO */

Define ( Crea la matriz de números )
   Sequence ( 0, 1, 16, números )
   Gosub 'Barajar el array'
   Redim ( números, 4,4 )
Return

/* algoritmo de Fisher-Yates */
Define ( Barajar el array )
  N = 0, Let ( N := Length(números) )
  R = 0, aux = 0
  Loop
     Let (R := Ceil(Rand(N)))
     Let (aux := [R] Get 'números' )
     [N] Get 'números', [R] Put 'números'
     Set 'aux', [N] Put 'números'
     --N
  Back if 'N' is positive
  If ( [16] Get 'números' ---Backup to 'aux'---, Not (Is zero?) )
     [aScan(1,0,números)] Set 'aux', Put 'números'
     [16] Set '0', Put 'números'
  End If
Return

Define ( Crea una casilla )
   Set 'Utf8(Chr(218)),Utf8(Chr(196)),Utf8(Chr(196)),Utf8(Chr(196)),Utf8(Chr(196)),Utf8(Chr(191))', Apnd row 'casilla'
   Set 'Utf8(Chr(179))," "," "," "," ",Utf8(Chr(179))', Apnd row 'casilla'
   Set 'Utf8(Chr(192)),Utf8(Chr(196)),Utf8(Chr(196)),Utf8(Chr(196)),Utf8(Chr(196)),Utf8(Chr(217))', Apnd row 'casilla'
Return

Define ( Crea el índice )
   Set 'Utf8(Chr(220)),Utf8(Chr(220)),Utf8(Chr(220)),Utf8(Chr(220)),Utf8(Chr(220)),Utf8(Chr(220))', Apnd row 'índice'
   Set 'Utf8(Chr(219))," "," "," "," ",Utf8(Chr(219))', Apnd row 'índice'
   Set 'Utf8(Chr(223)),Utf8(Chr(223)),Utf8(Chr(223)),Utf8(Chr(223)),Utf8(Chr(223)),Utf8(Chr(223))', Apnd row 'índice'
Return

  

You may also check:How to resolve the algorithm Pick random element step by step in the Insitux programming language
You may also check:How to resolve the algorithm Speech synthesis step by step in the Zoomscript programming language
You may also check:How to resolve the algorithm Metronome step by step in the Common Lisp programming language
You may also check:How to resolve the algorithm Show ASCII table step by step in the Visual Basic .NET programming language
You may also check:How to resolve the algorithm Benford's law step by step in the XPL0 programming language