Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- viva="#"
- muerta="."
- adyacentes1=2
- adyacentes2=3
- radio_x=1
- """
- Conway's Game of Life
- ---------------------
- https://es.wikipedia.org/wiki/Juego_de_la_vida
- El "tablero de juego" es una malla formada por cuadrados ("células") que se
- extiende por el infinito en todas las direcciones. Cada célula tiene 8 células
- vecinas, que son las que están próximas a ella, incluidas las diagonales. Las
- células tienen dos estados: están "vivas" o "muertas" (o "encendidas" y
- "apagadas"). El estado de la malla evoluciona a lo largo de unidades de tiempo
- discretas (se podría decir que por turnos). El estado de todas las células se
- tiene en cuenta para calcular el estado de las mismas al turno siguiente.
- Todas las células se actualizan simultáneamente.
- Las transiciones dependen del número de células vecinas vivas:
- * Una célula muerta con exactamente 3 células vecinas vivas "nace" (al turno
- siguiente estará viva).
- * Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso
- muere o permanece muerta (por "soledad" o "superpoblación").
- """
- def main():
- """
- Función principal del programa. Crea el estado inicial de Game of LIfe
- y muestra la simulación paso a paso mientras que el usuaio presione
- Enter.
- """
- life = life_crear([
- '..........',
- '..........',
- '..........',
- '.....#....',
- '......#...',
- '....###...',
- '..........',
- '..........',
- ])
- while True:
- for linea in life_mostrar(life):
- print(linea)
- print()
- input("Presione Enter para continuar, CTRL+C para terminar")
- print()
- life = life_siguiente(life)
- def life_crear(mapa):
- """
- Crea el estado inicial de Game of life a partir de una disposición
- representada con los caracteres '.' y '#'.
- `mapa` debe ser una lista de cadenas, donde cada cadena representa una
- fila del tablero, y cada caracter puede ser '.' (vacío) o '#' (célula).
- Todas las filas deben tener la misma cantidad decaracteres.
- Devuelve el estado del juego, que es una lista de listas donde cada
- sublista representa una fila, y cada elemento de la fila es False (vacío)
- o True (célula).
- """
- life=[]
- for fila in mapa:
- fila_acumulador=[]
- for c in fila:
- fila_acumulador.append(c==viva)
- (life.append(fila_acumulador))
- return life
- def pruebas_life_crear():
- """Prueba el correcto funcionamiento de life_crear()."""
- # Para cada prueba se utiliza la instrucción `assert <condición>`, que
- # evalúa que la <condición> sea verdadera, y lanza un error en caso
- # contrario.
- assert life_crear([]) == []
- assert life_crear(['.']) == [[False]]
- assert life_crear(['#']) == [[True]]
- assert life_crear(['#.', '.#']) == [[True, False], [False, True]]
- def life_mostrar(life):
- """
- Crea una representación del estado del juego para mostrar en pantalla.
- Recibe el estado del juego (inicialmente creado con life_crear()) y
- devuelve una lista de cadenas con la representación del tablero para
- mostrar en la pantalla. Cada una de las cadenas representa una fila
- y cada caracter debe ser '.' (vacío) o '#' (célula).
- """
- lista_final=[]
- for fila in life:
- cadena=""
- for elemento in fila:
- cadena+=viva if elemento else muerta
- lista_final.append(cadena)
- return lista_final
- def pruebas_life_mostrar():
- """Prueba el correcto funcionamiento de life_mostrar()."""
- assert life_mostrar([]) == []
- assert life_mostrar([[False]]) == ['.']
- assert life_mostrar([[True]]) == ['#']
- assert life_mostrar([[True, False], [False, True]]) == ['#.', '.#']
- def cant_adyacentes(life, f, c):
- """
- Calcula la cantidad de células adyacentes a la celda en la fila `f` y la
- columna `c`.
- Importante: El "tablero" se considera "infinito": las celdas del borde
- izquierdo están conectadas a la izquierda con las celdas del borde
- derecho, y viceversa. Las celdas del borde superior están conectadas hacia
- arriba con las celdas del borde inferior, y viceversa.
- """
- contador=0
- cant_filas=len(life)
- cant_columnas=len(life[0])
- for x in range(f - radio_x ,f + radio_x+1):
- for i in range(c - radio_x,c + radio_x+1):
- if life[x%cant_filas][i%cant_columnas] and (x,i)!=(f,c):
- contador+=1
- return (contador)
- def pruebas_cant_adyacentes():
- """Prueba el correcto funcionamiento de cant_adyacentes()."""
- assert cant_adyacentes(life_crear(['.']), 0, 0) == 0
- assert cant_adyacentes(life_crear(['..', '..']), 0, 0) == 0
- assert cant_adyacentes(life_crear(['..', '..']), 0, 1) == 0
- assert cant_adyacentes(life_crear(['##', '..']), 0, 0) == 2
- assert cant_adyacentes(life_crear(['##', '..']), 0, 1) == 2
- assert cant_adyacentes(life_crear(['#.', '.#']), 0, 0) == 4
- assert cant_adyacentes(life_crear(['##', '##']), 0, 0) == 8
- assert cant_adyacentes(life_crear(['.#.', '#.#', '.#.']), 1, 1) == 4
- assert cant_adyacentes(life_crear(['.#.', '..#', '.#.']), 1, 1) == 3
- def celda_siguiente(life, f, c):
- """
- Calcula el estado siguiente de la celda ubicada en la fila `f` y la
- columna `c`.
- Devuelve True si en la celda (f, c) habrá una célula en la siguiente
- iteración, o False si la celda quedará vacía.
- """
- celda=life[f][c]
- n=cant_adyacentes(life,f,c)
- if not celda and n==adyacentes2:
- return True
- return celda and (n==adyacentes1 or n==adyacentes2)
- def pruebas_celda_siguiente():
- """Prueba el correcto funcionamiento de celda_siguiente()."""
- assert celda_siguiente(life_crear(['.']), 0, 0) == False
- assert celda_siguiente(life_crear(['..', '..']), 0, 0) == False
- assert celda_siguiente(life_crear(['..', '..']), 0, 1) == False
- assert celda_siguiente(life_crear(['##', '..']), 0, 0) == True
- assert celda_siguiente(life_crear(['##', '..']), 0, 1) == True
- assert celda_siguiente(life_crear(['#.', '.#']), 0, 0) == False
- assert celda_siguiente(life_crear(['##', '##']), 0, 0) == False
- assert celda_siguiente(life_crear(['.#.', '#.#', '.#.']), 1, 1) == False
- assert celda_siguiente(life_crear(['.#.', '..#', '.#.']), 1, 1) == True
- def life_siguiente(life):
- """
- Calcula el siguiente estado del juego.
- Recibe el estado actual del juego (lista de listas de False/True) y
- devuelve un _nuevo_ estado que representa la siguiente iteración según las
- reglas del juego.
- Importante: El "tablero" se considera "infinito": las celdas del borde
- izquierdo están conectadas a la izquierda con las celdas del borde
- derecho, y viceversa. Las celdas del borde superior están conectadas hacia
- arriba con las celdas del borde inferior, y viceversa.
- """
- siguiente = []
- for f in range(len(life)):
- fila = []
- for c in range(len(life[0])):
- fila.append(celda_siguiente(life, f, c))
- siguiente.append(fila)
- return siguiente
- def pruebas():
- """Ejecuta todas las pruebas"""
- pruebas_life_crear()
- pruebas_life_mostrar()
- pruebas_cant_adyacentes()
- pruebas_celda_siguiente()
- pruebas()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement