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