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:31] 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 ======
  
 Hasta el momento hemos aprendido a instalar y compilar programas con z88dk, utilizando para ellos ejemplos prácticos basados en la creación de una Aventura Conversacional de Texto. En nuestros anteriores números, y gracias a los ejemplos de aventuras conversacionales, hemos descubierto cómo z88dk nos permite utilizar las diferentes funciones estándar de ANSI C para realizar nuestros pequeños programas. Hasta el momento hemos aprendido a instalar y compilar programas con z88dk, utilizando para ellos ejemplos prácticos basados en la creación de una Aventura Conversacional de Texto. En nuestros anteriores números, y gracias a los ejemplos de aventuras conversacionales, hemos descubierto cómo z88dk nos permite utilizar las diferentes funciones estándar de ANSI C para realizar nuestros pequeños programas.
 +
 +
  
 ===== El Juego de la Vida ===== ===== El Juego de la Vida =====
Línea 14: Línea 17:
  
  
-<code> +//El juego de la vida es un autómata celular diseñado por el matemático británico John Horton Conway en 1970. Es el mejor ejemplo de un autómata celular. Hizo su primera aparición pública en el número de octubre de 1970 de la revista Scientific American, en la columna de juegos matemáticos de Martin Gardner. Desde un punto de vista teórico, es interesante porque es equivalente a una máquina universal de Turing, es decir, todo lo que se puede computar algorítmicamente se puede computar en el juego de la vida.//
-El juego de la vida es un autómata celular diseñado por el matemático británico John Horton Conway en 1970. Es el mejor ejemplo de un autómata celular. Hizo su primera aparición pública en el número de octubre de 1970 de la revista Scientific American, en la columna de juegos matemáticos de Martin Gardner. Desde un punto de vista teórico, es interesante porque es equivalente a una máquina universal de Turing, es decir, todo lo que se puede computar algorítmicamente se puede computar en el juego de la vida.+
  
-Desde su publicación, ha atraído mucho interés debido a la gran variabilidad de la evolución de los patrones. La vida es un ejemplo de emergencia y autoorganización. Es interesante para los científicos, matemáticos, economistas y otros observar cómo patrones complejos pueden provenir de la implementación de reglas muy sencillas. +//Desde su publicación, ha atraído mucho interés debido a la gran variabilidad de la evolución de los patrones. La vida es un ejemplo de emergencia y autoorganización. Es interesante para los científicos, matemáticos, economistas y otros observar cómo patrones complejos pueden provenir de la implementación de reglas muy sencillas.// 
-  + 
-La vida tiene una variedad de patrones reconocidos que provienen de determinadas posiciones iniciales. Poco después de la publicación, se descubrieron el pentominó R y el planeador (en inglés glider), lo que atrajo un mayor interés hacia el juego. Contribuyó a su popularidad el hecho de que se publicó justo cuando se estaba lanzando al mercado una nueva generación de miniordenadores baratos, lo que significaba que se podía jugar durante horas en máquinas que, por otro lado, no se utilizarían por la noche. Para muchos aficionados, el juego de la vida sólo era un desafío de programación y una manera divertida de usar ciclos de la CPU. Para otros, sin embargo, el juego adquirió más connotaciones filosóficas. Desarrolló un seguimiento casi fanático a lo largo de los años 1970 hasta mediados de los 80. +//La vida tiene una variedad de patrones reconocidos que provienen de determinadas posiciones iniciales. Poco después de la publicación, se descubrieron el pentominó R y el planeador (en inglés glider), lo que atrajo un mayor interés hacia el juego. Contribuyó a su popularidad el hecho de que se publicó justo cuando se estaba lanzando al mercado una nueva generación de miniordenadores baratos, lo que significaba que se podía jugar durante horas en máquinas que, por otro lado, no se utilizarían por la noche. Para muchos aficionados, el juego de la vida sólo era un desafío de programación y una manera divertida de usar ciclos de la CPU. Para otros, sin embargo, el juego adquirió más connotaciones filosóficas. Desarrolló un seguimiento casi fanático a lo largo de los años 1970 hasta mediados de los 80.// 
-  + 
-Cabe decir que el "Juego de la Vida" causó furor en 1970, hasta el punto en que se convirtió en el divertimento de muchos "hackers programadores" la implementación del Juego de la Vida en los potentes mainframes de Universidades y Centros de Cálculo. Hoy en día sigue siendo un buen ejercicio de programación para aquellos que empiezan a dar clases de Informática, ya que la programación es muy sencilla y no requiere grandes conocimientos del lenguaje de programación utilizado. +//Cabe decir que el "Juego de la Vida" causó furor en 1970, hasta el punto en que se convirtió en el divertimento de muchos "hackers programadores" la implementación del Juego de la Vida en los potentes mainframes de Universidades y Centros de Cálculo. Hoy en día sigue siendo un buen ejercicio de programación para aquellos que empiezan a dar clases de Informática, ya que la programación es muy sencilla y no requiere grandes conocimientos del lenguaje de programación utilizado.//
-</code>+
  
 ===== Reglas básicas de El Juego de la Vida ===== ===== Reglas básicas de El Juego de la Vida =====
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.1186662669.txt.gz
  • Última modificación: 09-08-2007 12:31
  • por sromero