cursos:z88dk:z88dklife

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:z88dk:z88dklife [09-08-2007 12:32] sromerocursos:z88dk:z88dklife [24-02-2020 19:24] (actual) falvarez
Línea 1: Línea 1:
 +Publicado originalmente en [[https://magazinezx.speccy.org/10/z88dk.html|MagazineZX número 10]] (noviembre 2004)
  
 ====== El juego de la vida de John Conway ====== ====== El juego de la vida de John Conway ======
Línea 28: Línea 29:
  
 El Juego de la Vida se basa en una matriz de un tamaño determinado (como por ejemplo, 50x50, ó 32x32), que podríamos considerar nuestro "caldo de cultivo", en la cual mueren y se crean células. De forma efectiva, una célula es un 1 en una posición determinada de la cuadrícula mientras que un "espacio vacío" se representa mediante un cero. El Juego de la Vida se basa en una matriz de un tamaño determinado (como por ejemplo, 50x50, ó 32x32), que podríamos considerar nuestro "caldo de cultivo", en la cual mueren y se crean células. De forma efectiva, una célula es un 1 en una posición determinada de la cuadrícula mientras que un "espacio vacío" se representa mediante un cero.
-Células vivas en la cuadrícula + 
-Células vivas en la cuadrícula+{{ cursos:z88dk:z88dk_cuadric.png |Células vivas en la cuadrícula}} 
  
 El Juego de la Vida no requiere interacción por parte del usuario: a partir de un estado inicial (células diseminadas por el caldo de cultivo) se aplican una serie de reglas y se obtiene una nueva generación de células en dicho "caldo". Esta nueva generación será la entrada para volver a aplicar las reglas, y así sucesivamente. El Juego de la Vida no requiere interacción por parte del usuario: a partir de un estado inicial (células diseminadas por el caldo de cultivo) se aplican una serie de reglas y se obtiene una nueva generación de células en dicho "caldo". Esta nueva generación será la entrada para volver a aplicar las reglas, y así sucesivamente.
Línea 83: Línea 85:
 Con esto, el programa principal realizaría la impresión en pantalla de la generación actual de células (para que podamos ver la evolución visualmente) mediante la función Dibujar_Generación_Actual(). Tras esto, se calcularía la siguiente generación de células aplicando las reglas anteriormente explicadas, dentro de la función Calcular_Siguiente_Generacion() . Si en cualquier momento se pulsa la tecla 'r' (en nuestro programa) se modificará de nuevo el tablero aleatoriamente para añadir nuevas células y que en el siguiente paso del bucle comience de nuevo la simulación. Con esto, el programa principal realizaría la impresión en pantalla de la generación actual de células (para que podamos ver la evolución visualmente) mediante la función Dibujar_Generación_Actual(). Tras esto, se calcularía la siguiente generación de células aplicando las reglas anteriormente explicadas, dentro de la función Calcular_Siguiente_Generacion() . Si en cualquier momento se pulsa la tecla 'r' (en nuestro programa) se modificará de nuevo el tablero aleatoriamente para añadir nuevas células y que en el siguiente paso del bucle comience de nuevo la simulación.
  
-===== Función Crear_Generación_Aleatoria() =====+===== Crear_Gen_Aleatoria() =====
  
  
Línea 192: Línea 194:
     * **printf( "\x1B[%u;%uH",(21),(1))**: Este comando es el equivalente ANSI de gotoxy(x,y), es decir, posiciona el cursor en la posición (1,21) de pantalla para que el próximo printf comience a trazar las letras en esa posición. En este caso lo utilizamos para posicionar en cursor en la parte baja de la pantalla, donde escribimos el título del programa posteriormente.     * **printf( "\x1B[%u;%uH",(21),(1))**: Este comando es el equivalente ANSI de gotoxy(x,y), es decir, posiciona el cursor en la posición (1,21) de pantalla para que el próximo printf comience a trazar las letras en esa posición. En este caso lo utilizamos para posicionar en cursor en la parte baja de la pantalla, donde escribimos el título del programa posteriormente.
  
-===== La función Dibujar_Generación_Actual() =====+ 
 +===== Dibujar_Gen_Actual() =====
  
  
Línea 246: Línea 249:
  
 ^ Valor ^ Color ^ ^ Valor ^ Color ^
-| 0. - negro |  +| 0 negro |  
-| 1. - azul | +| 1 azul | 
-| 2. - rojo | +| 2 rojo | 
-| 3. - púrpura o magenta | +| 3 púrpura o magenta | 
-| 4. - verde | +| 4 verde | 
-| 5. - cyan | +| 5 cyan | 
-| 6. - amarillo | +| 6 amarillo | 
-| 7. - blanco |+| 7 blanco |
  
 Con los bits indicandos anteriormente, un atributo se construiría con el siguiente código: Con los bits indicandos anteriormente, un atributo se construiría con el siguiente código:
Línea 273: Línea 276:
 De este modo podemos activar y desactivar cuadros completos de pantalla modificando su tinta y papel. Este método es mucho más rápido para nuestro programa que dibujar los 8x8 pixels de cada carácter para dibujar o apagar las células (una sóla escritura en memoria modifica el estado de 64 píxeles simultáneamente), y puede servirnos de ejemplo para mostrar cómo modificar los atributos. De este modo podemos activar y desactivar cuadros completos de pantalla modificando su tinta y papel. Este método es mucho más rápido para nuestro programa que dibujar los 8x8 pixels de cada carácter para dibujar o apagar las células (una sóla escritura en memoria modifica el estado de 64 píxeles simultáneamente), y puede servirnos de ejemplo para mostrar cómo modificar los atributos.
  
-===== La función Calcular_Siguiente_Generación() =====+===== Calcular_Siguiente_Gen() =====
  
  
Línea 365: Línea 368:
 Si ejecutamos el programa en nuestro Spectrum (o en un emulador) veremos la evolución de las células en tiempo real en nuestra pantalla: Si ejecutamos el programa en nuestro Spectrum (o en un emulador) veremos la evolución de las células en tiempo real en nuestra pantalla:
  
-Simulaciones en nuestro Spectrum +{{ cursos:z88dk:z88dk_zxlife1.png |Simulaciones en nuestro Spectrum}} 
-Simulaciones en nuestro Spectrum + 
-Simulaciones en nuestro Spectrum + 
-Simulaciones en nuestro Spectrum+{{ cursos:z88dk:z88dk_zxlife2.png |Simulaciones en nuestro Spectrum}} 
  
 Cada vez que pulsemos 'r' se generará una nueva "remesa" de células para volver a aplicar el algoritmo y ver su evolución. Cada vez que pulsemos 'r' se generará una nueva "remesa" de células para volver a aplicar el algoritmo y ver su evolución.
  
-====== Optimizaciones del Juego de la Vida ======+ 
 +===== Optimizaciones del Juego de la Vida =====
  
  
Línea 406: Línea 411:
 Esto es así porque como podemos ver en la siguiente figura, podemos obtener las 8 células vecinal a partir de un mismo offset calculado: Esto es así porque como podemos ver en la siguiente figura, podemos obtener las 8 células vecinal a partir de un mismo offset calculado:
  
-Offset de las 8 células vecinas de una dada +{{ cursos:z88dk:z88dk_offsets.png |Offset de las 8 células vecinas de una dada}} 
-Offset de las 8 células vecinas de una dada+
  
 El código resultante de la optimización sería el siguiente: El código resultante de la optimización sería el siguiente:
Línea 488: Línea 493:
  
 En el fichero comprimido que acompaña a este artículo están almacenadas las 2 versiones de zxlife: la versión 1 (zxlife.c y zxlife.tap) que es la versión original del programa, y la versión 2 (zxlife2.c y zxlife2.tap) que es la versión optimizada con los cambios que hemos explicado en esta sección. En el fichero comprimido que acompaña a este artículo están almacenadas las 2 versiones de zxlife: la versión 1 (zxlife.c y zxlife.tap) que es la versión original del programa, y la versión 2 (zxlife2.c y zxlife2.tap) que es la versión optimizada con los cambios que hemos explicado en esta sección.
 +
  
 ===== En conclusión ===== ===== En conclusión =====
Línea 495: Línea 501:
  
 En las próximas entregas comenzaremos a hablar de gráficos en el Spectrum, de forma que podamos comenzar a aplicar nuestros conocimientos de z88dk para hacer ya cosas visibles (gráficamente) en nuestro Spectrum. En las próximas entregas comenzaremos a hablar de gráficos en el Spectrum, de forma que podamos comenzar a aplicar nuestros conocimientos de z88dk para hacer ya cosas visibles (gráficamente) en nuestro Spectrum.
 +
  
  
Línea 501: Línea 508:
  
  
-</code>+<code c>
 /* /*
   ZX-Life  -> Implementacion de ejemplo en C-z88dk del   ZX-Life  -> Implementacion de ejemplo en C-z88dk del
Línea 685: Línea 692:
 } }
 </code> </code>
 +
 +
  
  
Línea 690: Línea 699:
  
  
-    * [[|Archivos fuente del ejemplo propuesto]+    * [[https://magazinezx.speccy.org/10/src/zxlife.zip|Archivos fuente del ejemplo propuesto]]
     * [[http://es.wikipedia.org/wiki/Juego_de_la_vida|El juego de la Vida en la Wikipedia]]     * [[http://es.wikipedia.org/wiki/Juego_de_la_vida|El juego de la Vida en la Wikipedia]]
     * [[http://www.collidoscope.com/cgolve/|Color Game Of Life Visual Exhibition]]     * [[http://www.collidoscope.com/cgolve/|Color Game Of Life Visual Exhibition]]
     * [[http://www.math.com/students/wonders/life/life.html|What is the Game of Life?]]     * [[http://www.math.com/students/wonders/life/life.html|What is the Game of Life?]]
  
  • cursos/z88dk/z88dklife.1186662779.txt.gz
  • Última modificación: 09-08-2007 12:32
  • por sromero