Mostrando entradas con la etiqueta puzzle. Mostrar todas las entradas
Mostrando entradas con la etiqueta puzzle. Mostrar todas las entradas

jueves, 16 de julio de 2020

SDL - Tetris - Puzzle - Antiguos programas


SDL
Tetris - Puzzle
Antiguos programas

He estado revisando mis antiguos programas, y entre los más programados por mi, está el tetris.
Cuando salió en las máquinas recreativas el tetris,  comprobé  que la mecánica del juego era muy sencilla y fácil de programar. 
El juego era sencillo pero muy adictivo, y eso me cautivó.
Era finales de los años 80, y el lenguaje predominante era el Basic, por lo que la primera versión de realizó con GWBasic.
Los gráficos no eran demasiado vistosos, el standard CGA no daba para mucho en modo gráfico, pero se hacía lo que se podía.


Tetris realizado con GWBasic, y en modo CGA (DOS).
Para probarlo recomiendo dosBox, y rebajar la velocidad con CRT+F11 .

Cuando ya dispuse de una tarjeta VGA, volví a realizar el tetris en Turbo C con el modo 13 , 320x240 y 256 colores.
Era bastante vistoso y mucho más portable debido a realizarlo en C.

Tetris realizado en Turbo C en modo 13 (DOS)
El modo 13 fue el modo de video más utilizado en la creación de juegos, era muy fácil de programar y solo ocupaba 64K.

Los programas para DOS se quedan un poco muertos en el tiempo, y para reanimarlos algo, debemos emplear una librería que consiga hacerlos perdurar en el tiempo. Para este fin, la mejor librería es SDL, está en la mayoría de plataformas, Windows, Linux, Mac, etc...
Con esta librería conseguimos que los programas sobrevivan eternamente.

Tetris realizado con la librería SDL formato 320x240.

Está programado en Linux y con la librería SDL. Si pulsamos F1 pasamos a pantalla completa, pero perdemos detalle, por lo que programé otro tetris con resolución de 640x480.

Tetris programado en C y con la librería SDL resolución 640x480. Linux

Y para terminar este puzzle que había realizado en Linux y con la librería SVGA, una librería que se quedo anticuada y necesitaba permisos root.
Vuelvo a realizar el puzzle, pero en este caso utilizo SDL que es actual y funciona bien.

Puzzle con SDL resolución 640x480. (Linux)


PROGRAMAS

Este es un retorno al pasado, es un modo de revivir programas antiguos realizados por mi.
No descarto hacer nuevas revisiones de otros programas, hay muchos en discos viejos. ;)


Saludos.
Juan Galaz
 

miércoles, 13 de mayo de 2020

JAVA - PUZZLE


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 operadores en Java.
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

domingo, 10 de mayo de 2020

GAMBAS (VB Linux) PUZZLE


GAMBAS
(VB Linux)

PUZZLE

Un puzzle parecido había realizado hace años para XWIN , también lo había portado a SDL , en está ocasión lo realizo en Gambas.
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.
Empiezas con 1500 segundos 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 Gambas


PUZZLE Source             

Saludos.
Juan Galaz


Bibliografía.

PUZZLE SDL

viernes, 8 de febrero de 2019

Puzzle SDL

Puzzle
SDL

Un puzzle parecido había realizado hace años para XWIN , con la librería SDL es mas fácil programar, además de poderse compilar para Windows.
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.
Empiezas con 1500 segundos que se irán disminuyendo según pase el tiempo.
Con el botón derecho del ratón se mueven las piezas.
Con el botón central nos muestra las piezas mal colocadas.
Con el botón derecho te muestra la imagen  original.
Está realizado bajo Linux, pero también está compilado para Windows, es la ventaja de utilizar la librería SDL.
Durante el juego, pulsando F2 pasamos a pantalla completa.



PROGRAMA

Saludos.
Juan Galaz