Página principal
JAVA
PUZZLE

Un puzzle parecido había realizado hace años para XWIN , también lo había portado a SDL , hace poco lo porté Gambas(VB Linux).
Este puzzle tiene 3 niveles dependiendo del tamaño de la cuadrícula.
Nivel 1. - 4x4
Nivel 2. - 6x6
Nivel 3. -10x10
Cada nivel tiene su propia tabla de puntos.
Dependiendo del nivel empiezas con unos puntos que se irán disminuyendo según pasa el tiempo.
Con el botón izquierdo del ratón se mueven las piezas.


Juego funcionando.

El juego es simple, pero maneja muchas rutinas para aprender a programar.
Carga imágenes jpg, trocea imágenes, utiliza TIMER, carga sonidos, lee y escribe ficheros.
Es un programa para aprender a programar Java.

Antes de nada hay que explicar que Java no es el mejor entorno para realizar juegos, por lo que portar el juego desde SDL no ha sido lo más placentero.
En unas líneas explico mi principales problemas en el desarrollo.

Uno de lo que me volvió loco durante 2 horas fue esto:
        lienzo.drawImage (imagen1,xo,yo,xo+w,yo+h,  xi,yi,xi+w,yi+h,jPanel1);
Pensaréis ¿que problema puede tener esto?. El problema es la sobrecarga de funciones en Java(sobrecarga de métodos).
Dependiendo del tipo de argumentos que se la pasa a una función, interpreta realizar una función u otra.
En mi caso interpretaba en la compilación la opción incorrecta y producía mal funcionamiento del programa.
Después de muchas pruebas, decidí pasar los parámetros limpios, sin operaciones.
        int a,b,c,d;       
        a=xi+w; b=yi+h; c=xo+w; d=yo+h;
        lienzo.drawImage (imagen1,xo,yo,c,d,  xi,yi,a,b,jPanel1);

Solucionado.    :)

Tiempos de espera Wait().
Algunos os aconsejan utilizar:   Thread.sleep(1);
Esto produce muchos problemas en el tiempo de espera.
Lo mejor es utilizar:      System.currentTimeMillis();
La rutina empleada por mi es:
  void miWait(int z)
    {
       long Time0 = System.currentTimeMillis();
        Time0+=z;
        while(Time0>System.currentTimeMillis())
        {
           // System.out.println("WAIT2="+System.currentTimeMillis());
        }
    }

   
El siguiente problema que me surgió es  repaint()
El repaint en Windows 7, Windows 10, WindowsXP y Linux funciona diferente de un sistema a otro.
Al final he tenido que realizar mi propio repaint:
 public void paint (Graphics g)
        {   
            super.paint(g);         
            if(game==1)
                printPantaH();
            else
                pantallaInit();
            //System.out.println("REPINTAR");
         }


Este punto no es un problema de Java, es digamos que no hace fácil como maneja ficheros sencillos.
Para el manejo de ficheros en C las bibliotecas están muy estandarizadas.
Si quieres mejorar la velocidad en la lectura/escritura de fichero puedes crear muchas rutinas útiles.
En Java pueden utilizar muchas formas, visita la página https://www.baeldung.com/java-write-to-file .
Para usar ficheros simples de puntuaciones he utilizado la forma más fácil que he encontrado.
 void load_puntos()
   {
     int z;
     String tmp;
            try {
             File myObj = new File(ficheroPuntos);
             Scanner myReader = new Scanner(myObj);      
             for(z=0;z<5;z++)
                {
                    nombresMax[z]=myReader.nextLine();
                    tmp=myReader.nextLine();
                    puntosMax[z]=Integer.valueOf(tmp);
                }
             myReader.close();
           }
            catch (FileNotFoundException e) {
             System.out.println("An error occurred.");
           }
   }


Creo que en Java todo es bastante lioso, muchas clases y muchas funciones que hace complicado cosas simples.
O tienes mucha memoria y mucha práctica en Java, o te ves mirando ayudas continuamente.
Pero claro esto es una opinión de un programador de C , C++ y Basic.

Está desarrollado en Debian 10 con netbeans, y probado en Windows7.

PUZZLE netbeans             

PUZZLE_ejecutable

Saludos.
Juan Galaz


Bibliografía.

PUZZLE SDL
PUZZLE Gambas
https://www.baeldung.com/java-write-to-file