Serie ficheros virtuales

 

 

 

 

RPG Ficheros virtuales

 

 

 

- El juego de la vida de Jhon H.Conway

 

 

- Introducción

 

- Servicios de SRJVIDA

 

- Programa interfaz

 

- Código fuente

- Código añadido para interacción lúdica

 

 

 ________

 

 

- Introducción

 

 

En el capítulo  A.II.2 El juego de la vida  del blog hermano  C Ficheros virtuales  de la  serie ficheros virtuales,  se presentaba un ejemplo implementado en lenguaje C de generación de evoluciones del Juego de la Vida de Jhon H.Conway.

 

Posteriormente se ha ido presentando la implementación en otros lenguajes y plataformas y ahora se presenta la versión iSeries mediante un programa de servicio en C, SRJVIDA, y un interfaz de pantalla en RPG, CCJVIDA. 

 

 

 ________



- Servicios de SRJVIDA

 

 

Se presenta a continuación la lista de servicios de SRJVIDA. Son de destacar SRJVIDA_OPEN, SRJVIDA_NEW y SRJVIDA_GEN que se encargan respectivamente de crear los ficheros virtuales de soporte y de crear una nueva población inicial y de generar una nueva generación poblacional. El resto de servicios permiten extraer y presentar los datos. Se muestra tanto la versión C como su traducción a RPG.

 

 

 

 

 

     short int SRJVIDA_CLRF(void);

 

 

 

     * Activa la visualización de una celda

 

     DSRJVIDA_CLRF     PR            10I 0                                      0/1 Error

 

 

 

 

 

      short int SRJVIDA_CLOSE(void);

 

 

      * Cierre general estilo PC

 

     DSRJVIDA_CLOSE    PR            10I 0                                      0/1 Error de proceso

 

 

 

 

 

 

      long SRJVIDA_GEN(void);

 

 

      * Rutina de nueva generación poblacional

 

     DSRJVIDA_GEN      PR                                                       NúmeroGeneración 0=E

 

 

 

 

 

 

      long SRJVIDA_NEW(long Nmax);

 

 

      * (Re)Genera una población inicial

 

     DSRJVIDA_NEW      PR            10I 0                                      TamañoPoblcInic 0=Er

     D P_Nmax                        10I 0 VALUE                                Dimensión Base    *I

 

 

 

 

 

 

      long SRJVIDA_NPOB(void);

 

 

      * Recupera el tamaño poblacional

 

     DSRJVIDA_NPOB     PR                                                       TamañPoblcActual0=Er

 

 

 

 

 

 

      short int SRJVIDA_OCUPADA(long i, long j);

 

 

      * Evalúa si una celda (i,j) está ocupada

 

     DSRJVIDA_OCUPADA  PR            10I 0                                      0/1 Celda ocupada

     D P_I                           10I 0 VALUE                                Coordenada I celda*I

     D P_J                           10I 0 VALUE                                Coordenada J celda*I

 

 

 

 

 

      short int SRJVIDA_READ(long indice, long *i, long *j, short int *a);

 

 

      * Lectura secuencial de ítem de cuadro

 

     DSRJVIDA_READ     PR            10I 0                                      0/1 Error de lectura

     D P_L                           10I 0 VALUE                                ÍndiceLectSecuenci*I

     D P_I                           10I 0                                      Coordenada I asoc *O

     D P_J                           10I 0                                      Coordenada J asoc *O

     D P_A                           10I 0                                      0/1 Activa:ocupada*O

 

 

 

 

 

 

      long SRJVIDA_REF(long Nmax, long *i01, long *j01,

                                  long *i02, long *j02,

                                  long *i1,  long *j1,

                                  long *i2,  long *j2);

 

 

      * Valores de referencia

 

     DSRJVIDA_REF      PR            10I 0                                      Tamaño R:I01.*.J02/2

     D P_NMAX                        10I 0 VALUE                                Dimensión base ref*I

      *

      * Referencias absolutas

     D P_I01                         10I 0                                      PrMinI - KSUM     *O

     D P_J01                         10I 0                                      PrMinJ - KSUM     *O

     D P_I02                         10I 0                                      PrFinI - KSUM+NMax*O

     D P_J02                         10I 0                                      PrFinJ - KSUM+NMax*O

      *

      * Referencias relativas

     D P_I1                          10I 0                                      ISUM - KSUM + 1   *O

     D P_J1                          10I 0                                      JSUM - KSUM + 1   *O

     D P_I2                          10I 0                                      I1 + Nmax - 1     *O

     D P_J2                          10I 0                                      J1 + Nmax - 1     *O

 

 

 

 

 

      long SRJVIDA_WRITE(long i, long j, short int a);

 

 

      * Graba o elimina un ítem de población

 

     DSRJVIDA_WRITE    PR            10I 0                                      PosiciónItem/0=Error

     D P_I                           10I 0 VALUE                                Coordenada I      *I

     D P_J                           10I 0 VALUE                                Coordenada J      *I

     D P_A                           10I 0 VALUE                                1=Activar 0=Borrar*I

 

 

 

 

 

 

      void SRJVIDA_00(short int holgura);

 

 

      * Cambia referencia a posición inicial de datos (0,0)

 

     DSRJVIDA_00       PR

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

    void SRJVIDA_I0(short int holgura);

 

 

      * Cambia referencia a posición inicial en j (i,0)

 

     DSRJVIDA_I0       PR

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

      void SRJVIDA_0J(short int holgura)

 

 

      * Cambia referencia a posición inicial en i (0,j)

 

     DSRJVIDA_0J       PR

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

      void SRJVIDA_99(long Nmax, short int holgura);

 

 

      * Cambia referencia a posición final de datos

 

     DSRJVIDA_99       PR

     D P_NMAX                        10I 0 VALUE                                Dimensión         *I

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

      void SRJVIDA_I9(long Nmax, short int holgura);

 

 

      * Cambia referencia a posición final de datos en j

 

     DSRJVIDA_I9       PR

     D P_NMAX                        10I 0 VALUE                                Dimensión         *I

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

      void SRJVIDA_9J(long Nmax, short int holgura);

 

 

      * Cambia referencia a posición final de datos en i

 

     DSRJVIDA_9J       PR

     D P_NMAX                        10I 0 VALUE                                Dimensión         *I

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

     void SRJVIDA_09(long Nmax, short int holgura);

 

 

     * Cambia referencia a posición extremo izquierda superior de datos (0,9)

 

     DSRJVIDA_09       PR

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

      void SRJVIDA_90(long Nmax, short int holgura);

 

 

      * Cambia referencia a posición extremo derecha inferior de datos (9,0)

 

     DSRJVIDA_90       PR

     D P_H                           10I 0 VALUE                                Holgura           *I

 

 

 

 

 

 

      void SRJVIDA_H(long Desp);

 

 

      * Desplazamiento de referencia horizontal

 

     DSRJVIDA_H        PR

     D P_Desp                        10I 0 VALUE                                Desplazamiento    *I

 

 

 

 

 

 

      void SRJVIDA_V(long Desp);

 

 

     * Desplazamiento de referencia vertical

 

     DSRJVIDA_V        PR

     D P_Desp                        10I 0 VALUE                                Desplazamiento    *I

 

 

 

 

 

 


________

 

 


- Programa interfaz

 

  Se ha preparado el programa interfaz CCJVIDA que se encarga de presentar poblaciones iniciales de juegos de la vida e irlos evolucionando paulatinamente.

 

 

  La imagen del resultado que presenta CCJVIDA es del estilo que sigue

 

 

 

 

Por defecto la función AUTO (F11) viene activada y CCJVIDA va presentando sucesivas evoluciones poblacionales del juego de la vida en curso con una cadencia de una generación por segundo.

 

 

En el siguiente epígrafe se puede acceder al código fuente completo del programa interfaz.

 

En esencia, este consiste en una zona de datos donde una estructura iguala los campos de presentación con una serie de trabajo ELE(i,j) una carga inicial y un bucle de presentación de datos que se ejerce bajo autorrespuesta o bajo invocación manual.

 

Los mandatos disponibles son F3 salida, F5 nueva iteración, F7 generar una nueva población inicial (Invocando a SRJVIDA_NEW), y F11 que permite activar/desactivar el mecanismo de autorrespuesta donde se va llamando a la función de evolución generacional SRJVIDA_GEN.

 

También se ha establecido que cada cien veces se cree una nueva población inicial o cuando se observa una repetición del tamaño poblacional persistente.

   


________

 

 

- Código fuente

 

El código del interfaz de presentación CCJVIDA se encuentra en

 

 Archivo de pantalla CCDJVIDA: http://iseries.ficherosvirtuales.com/QDDSSRC/QDDSSRC.CCDJVIDA

 Código del programa CCJVIDA : http://iseries.ficherosvirtuales.com/QRPGLESRC/QRPGLESRC.CCJVIDA

 

 

 

 

Fuente de los servicios de SRJVIDA

 

   Prototipos de exportación RPG : http://iseries.ficherosvirtuales.com/QCOPYSRC/QCOPYSRC.PSRJVIDA

   Prototipos de exportación en C: http://iseries.ficherosvirtuales.com/QCSRC/QCSRC.SRJVIDAH

   Fuente principal en C . . . . : http://iseries.ficherosvirtuales.com/QCSRC/QCSRC.SRJVIDA

   Fuente de enlace  . . . . . . : http://iseries.ficherosvirtuales.com/QSRVSRC/QSRVSRC.SSRJVIDA

   Código adicional estructuras C: http://iseries.ficherosvirtuales.com/QCSRC/QCSRC.SRJVIDADS

 

 


________

 

 

 

- Código añadido para interacción lúdica

 

 

Utilizando las funciones SRJVIDA_OCUPADA y SRJVIDA_WRITE y el nuevo mandato F8, se pueden retocar las figuras de la pantalla a conveniencia. Gráficamente la nueva versión presenta la siguiente apariencia:

 

 

 

El código añadido para atender al nuevo mandato es el que sigue:

 

 

        // Cambiar estado de celda                  

 

        if *IN08;                                   

 

           *IN90 = PrFilCol(FILCOL:TTI:TTJ);       

           if TTI * TTJ > *ZEROS;                  

 

 

              // Ajustes (Se genera un cuadrado y se ajusta para presentar centrado en un rectángulo)

 

              TTI -= 4;                            

              TTJ -= 51;                           

 

 

              // Cambio                             

 

              TTA = SRJVIDA_OCUPADA(TTI:TTJ);      

              if TTA > *ZEROS;                     

                 TTResu = SRJVIDA_WRITE(TTI:TTJ:0);

              else;                                 

                TTResu = SRJVIDA_WRITE(TTI:TTJ:1);   

             endif;                                   

                                                      

                                                      

             // Recarga visualización en curso       

                                                       

             *IN90 = PrDsp();                        

                                                      

          endif;        

                            

         iter;

      endif;  

 

 

El código completo está disponible en los enlaces indicados en el epígrafe anterior


________