Saltar al contenido principal

6. Conway's Game of Life

Ver este tutorial en Google Docs external link Conway's Game of Life in StarLogo Nova

Descripcion

En esta actividad, implementaras el Game of Life de John Conway (tambien llamado "Life") en StarLogo Nova. La configuracion del juego Life es una cuadricula infinita donde inicialmente algunas celdas estan coloreadas (manteniendo el estado "viva"). Indicar cuales celdas estan vivas al inicio es la unica accion requerida del jugador, ya que el juego establece su siguiente etapa basandose en el estado previo de la cuadricula.

Reglas

La forma en que Life transiciona de etapa a etapa es actualizando cada celda de la cuadricula de acuerdo con las siguientes reglas:

  1. Supervivencia: Una celda viva con 2 o 3 vecinas vivas sobrevive en la siguiente etapa (una vecina es una celda que esta adyacente horizontal, vertical o diagonalmente)
  2. Subpoblacion: Una celda viva muere si tiene menos de 2 vecinas vivas
  3. Sobrepoblacion: Una celda viva con mas de 3 vecinas vivas muere
  4. Reproduccion: Una celda muerta con exactamente 3 vecinas vivas revive

Patches y Conway's Game of Life

Con las funciones de Patch en StarLogo Nova version 3, podemos implementar Life! Los Patches representan las cuadriculas que dividen el SpaceLand. El SpaceLand esta compuesto por 101x101 patches, y cada patch tiene coordenadas de -50 a 50 (inclusive), con el patch (0, 0) en el centro. Debido a que el SpaceLand tiene un numero finito de cuadriculas, pero Life funciona en una cuadricula infinita, haremos que las celdas vivas se envuelvan alrededor del SpaceLand (lo que creara patrones interesantes para las naves espaciales).


Parte 1: Configuracion Inicial de Patches

Objetivos: Establecer un subconjunto de Patches como vivos

Bloques de Codigo Utiles

BloqueCajonUso
Patch at x: y: blockEnvironmentObtiene el Patch en una coordenada especifica. Se puede usar al trabajar con traits.
set color blockTraitsCambia el trait de un agente, en este caso cambia el color.
reset terrain blockEnvironmentRestablece los traits de Patch: se puede elegir entre restablecer color, altura, traits personalizados o todo.

Codigo de Setup

En la pagina World, programa algunos patches para que esten vivos una vez que se presione setup. Una configuracion sugerida es una columna vertical de 5 patches. Para otros disenos interesantes, consulta las Sugerencias de Configuracion Inicial al final de este tutorial.

Setup code for initial patch configuration

Verifica tu Progreso!

Cuando hagas clic en setup, veras la barra vertical. Si activas el modo de edicion de terreno, puedes contar y confirmar que su altura es de 5 patches.

Vertical bar of 5 patches

Parte 2: Contando Celdas Vecinas Vivas

Objetivos: Aprender a usar variables al determinar celdas vecinas y contar celdas vivas

Pasos

  • Crear variables para cada patch vecino
  • Establecer las variables con las coordenadas correctas, teniendo en cuenta las coordenadas de los bordes
  • Contar el numero de vecinas vivas

Bloques de Codigo Utiles

BloqueCajonUso
var blockVariablesInicializa una variable con un valor dado.
set variable blockVariablesActualiza la variable a un nuevo valor. La variable se elige de un menu desplegable, por lo que para poder actualizarla, necesita ser inicializada primero.
value of blockVariablesDevuelve el valor de una variable dada.
info

Las variables solo existen dentro del bloque de codigo en el que se declaran.

1. Contar Celdas Vivas

Para contar continuamente el numero de celdas vivas que rodean una celda determinada, podemos usar el bloque de deteccion contando el numero de patches que estan vivos (color = black) dentro de 1.5 pasos, y asignarlo a una variable live_cells. Los patches solo se cuentan en esta area si el centro del patch esta dentro de un radio de 1.5 (1.5 pasos contara todos los patches adyacentes).

Count live cells code

2. Manejar el Envolvimiento de Bordes (Eje X)

Para hacer la cuadricula "infinita", los patches en los bordes se envuelven y cuentan las celdas vivas en el borde opuesto tambien. Para hacer esto, si un patch tiene una x de -50 o 50 (esta en el borde izquierdo o derecho), haz que cree un breed contador que establezca su x en el lado opuesto y en el borde extremo del mapa (x=-50.5 o 50.5). Luego incrementa live_cells por la cantidad de patches vivos contados por el breed contador dentro de 1.4 pasos (1.5 pasos contaria innecesariamente un patch extra).

Edge wrapping code for X axis

3. Manejar el Envolvimiento de Bordes (Eje Y)

Luego repite los mismos pasos pero sustituyendo x por y.

4. Manejar el Envolvimiento de Esquinas

Si el patch es uno de los 4 patches de esquina, haz que sume 1 a live_cells si el patch en la esquina opuesta diagonalmente esta vivo.

Corner wrapping code

Codigo Completo de la Parte 2

Aqui esta el codigo completo para contar celdas vecinas vivas, incluyendo toda la logica de envolvimiento de bordes y esquinas:

Complete Part 2 code

Parte 3: Aplicar las Reglas del Game of Life y Establecer Traits Personalizados

Ahora que tenemos el conteo de celdas vivas, podemos proceder a aplicar las reglas para los Patches.

1. Aplicar las Reglas del Game of Life

Debido a que esencialmente cambiamos los patches uno por uno, cambiar inmediatamente los colores de la celda interferiria con el conteo de vecinas vivas para otros patches. Por lo tanto, tendremos dos traits personalizados que recuerdan si el patch cambiara su color.

En la pagina Patch, crea dos traits personalizados:

  • dies -- contendra el valor True si un patch esta vivo y morira en la siguiente etapa
  • lives -- sera True cuando un patch muerto cobra vida

Si tanto dies como lives son False, significa que el patch mantiene su estado en la siguiente etapa.

Custom traits setup

Regla de Muerte

Un patch vivo morira si: hay menos de 2 vecinas vivas (subpoblacion), o mas de 3 vecinas vivas (sobrepoblacion).

Death rule code

Regla de Nacimiento

Un patch muerto cobrara vida si hay exactamente 3 vecinas vivas (reproduccion).

Birth rule code

2. Actualizar Todos los Patches

Agrega un bloque yield para dar suficiente tiempo a que todos los patches se actualicen. Ahora, verifica los traits personalizados y actualiza los colores de los patches de acuerdo a ellos.

Update patches code

Para restablecer los traits personalizados, establece su valor a False al inicio del ciclo.

Reset traits code

Verifica tu Progreso!

Activa el boton run. Si comenzaste con la columna vertical, veras la siguiente progresion. Para otras configuraciones, verifica que el programa este funcionando correctamente comparandolo en conwaylife.com.

Fase 1

Phase 1

Fase 2

Phase 2

Fase 3

Phase 3

Fase 4

Phase 4

Fase 5

Phase 5

Fase 6

Phase 6

Fase 7

Phase 7

Fase 8

Phase 8

Sugerencias de Configuracion Inicial

El Game of Life ha atraido mucho interes a lo largo de los anos debido a la multitud de configuraciones iniciales interesantes que producen disenos aun mas interesantes. Hay algunos tipos que puedes probar en StarLogo Nova y ver como se desarrollan con el tiempo.

Vidas Estables

Formas que mantienen su estructura a lo largo del juego.

PatronRepresentacionCoordenadas de Patch
BlockBlock(0, 0), (1, 0), (0, 1), (1, 1)
BeehiveBeehive(0, 1), (0, -1), (1, 0), (-1, 1), (-1, -1), (-2, 0)
CrossCross(1, 0), (-1, 0), (0, 1), (0, -1)

Osciladores

Disenos que eventualmente repiten la misma forma, en un ciclo.

PatronRepresentacionCoordenadas de Patch
BlinkerBlinker(0, 1), (0, 0), (0, -1)
BeaconBeacon(-2, 2), (-1, 2), (-2, 1), (-1, 1), (0, 0), (1, 0), (0, -1), (1, -1)

Un patron que regresa a su forma inicial despues de un periodo, mientras se desliza por la cuadricula diagonalmente.

PatronRepresentacionCoordenadas de Patch
GliderGlider(0, -1), (-1, 0), (1, -1), (1, 0), (1, 1)

Configuracion Inicial Aleatoria

Prueba inicializar con patrones aleatorios y observa como cambia el terreno con el tiempo.

Random setup code
Random setup result

Copyright 2024 MIT Scheller Teacher Education Program. Distribuido bajo la licencia Creative Commons CC BY-NC 4.0.