Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:z88dk:z88dklife [09-08-2007 12:31] – sromero | cursos:z88dk:z88dklife [24-02-2020 19:24] (actual) – falvarez | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | Publicado originalmente en [[https:// | ||
====== 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, | 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, | ||
+ | |||
+ | |||
===== El Juego de la Vida ===== | ===== El Juego de la Vida ===== | ||
Línea 14: | Línea 17: | ||
- | < | + | //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, | + | //Desde su publicación, |
- | + | ||
- | La vida tiene una variedad de patrones reconocidos que provienen de determinadas posiciones iniciales. Poco después de la publicación, | + | //La vida tiene una variedad de patrones reconocidos que provienen de determinadas posiciones iniciales. Poco después de la publicación, |
- | + | ||
- | Cabe decir que el "Juego de la Vida" causó furor en 1970, hasta el punto en que se convirtió en el divertimento de muchos " | + | //Cabe decir que el "Juego de la Vida" causó furor en 1970, hasta el punto en que se convirtió en el divertimento de muchos " |
- | </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", | 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", | ||
- | Células vivas en la cuadrícula | + | |
- | Células vivas en la cuadrícula | + | {{ cursos: |
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 " | 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 " | ||
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 ' | 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 ' | ||
- | ===== Función Crear_Generación_Aleatoria() ===== | + | ===== Crear_Gen_Aleatoria() ===== |
Línea 192: | Línea 194: | ||
* **printf( " | * **printf( " | ||
- | ===== 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, | Con los bits indicandos anteriormente, | ||
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), | 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), | ||
- | ===== 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: |
- | Simulaciones en nuestro Spectrum | + | |
- | Simulaciones en nuestro Spectrum | + | |
- | Simulaciones en nuestro Spectrum | + | {{ cursos: |
Cada vez que pulsemos ' | Cada vez que pulsemos ' | ||
- | ====== 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: |
- | 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> | + | < |
/* | /* | ||
| | ||
Línea 685: | Línea 692: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | |||
Línea 690: | Línea 699: | ||
- | * [[|Archivos fuente del ejemplo propuesto] | + | * [[https:// |
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||