Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.21 KB | None | 0 0
  1. viva="#"
  2. muerta="."
  3. adyacentes1=2
  4. adyacentes2=3
  5. radio_x=1
  6. """
  7. Conway's Game of Life
  8. ---------------------
  9.  
  10. https://es.wikipedia.org/wiki/Juego_de_la_vida
  11.  
  12. El "tablero de juego" es una malla formada por cuadrados ("células") que se
  13. extiende por el infinito en todas las direcciones. Cada célula tiene 8 células
  14. vecinas, que son las que están próximas a ella, incluidas las diagonales. Las
  15. células tienen dos estados: están "vivas" o "muertas" (o "encendidas" y
  16. "apagadas"). El estado de la malla evoluciona a lo largo de unidades de tiempo
  17. discretas (se podría decir que por turnos). El estado de todas las células se
  18. tiene en cuenta para calcular el estado de las mismas al turno siguiente.
  19. Todas las células se actualizan simultáneamente.
  20.  
  21. Las transiciones dependen del número de células vecinas vivas:
  22.  
  23. * Una célula muerta con exactamente 3 células vecinas vivas "nace" (al turno
  24. siguiente estará viva).
  25. * Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso
  26. muere o permanece muerta (por "soledad" o "superpoblación").
  27. """
  28.  
  29. def main():
  30. """
  31. Función principal del programa. Crea el estado inicial de Game of LIfe
  32. y muestra la simulación paso a paso mientras que el usuaio presione
  33. Enter.
  34. """
  35. life = life_crear([
  36. '..........',
  37. '..........',
  38. '..........',
  39. '.....#....',
  40. '......#...',
  41. '....###...',
  42. '..........',
  43. '..........',
  44. ])
  45. while True:
  46. for linea in life_mostrar(life):
  47. print(linea)
  48. print()
  49. input("Presione Enter para continuar, CTRL+C para terminar")
  50. print()
  51. life = life_siguiente(life)
  52.  
  53. def life_crear(mapa):
  54. """
  55. Crea el estado inicial de Game of life a partir de una disposición
  56. representada con los caracteres '.' y '#'.
  57.  
  58. `mapa` debe ser una lista de cadenas, donde cada cadena representa una
  59. fila del tablero, y cada caracter puede ser '.' (vacío) o '#' (célula).
  60. Todas las filas deben tener la misma cantidad decaracteres.
  61.  
  62. Devuelve el estado del juego, que es una lista de listas donde cada
  63. sublista representa una fila, y cada elemento de la fila es False (vacío)
  64. o True (célula).
  65. """
  66. life=[]
  67. for fila in mapa:
  68. fila_acumulador=[]
  69. for c in fila:
  70. fila_acumulador.append(c==viva)
  71. (life.append(fila_acumulador))
  72. return life
  73. def pruebas_life_crear():
  74. """Prueba el correcto funcionamiento de life_crear()."""
  75. # Para cada prueba se utiliza la instrucción `assert <condición>`, que
  76. # evalúa que la <condición> sea verdadera, y lanza un error en caso
  77. # contrario.
  78. assert life_crear([]) == []
  79. assert life_crear(['.']) == [[False]]
  80. assert life_crear(['#']) == [[True]]
  81. assert life_crear(['#.', '.#']) == [[True, False], [False, True]]
  82.  
  83. def life_mostrar(life):
  84. """
  85. Crea una representación del estado del juego para mostrar en pantalla.
  86.  
  87. Recibe el estado del juego (inicialmente creado con life_crear()) y
  88. devuelve una lista de cadenas con la representación del tablero para
  89. mostrar en la pantalla. Cada una de las cadenas representa una fila
  90. y cada caracter debe ser '.' (vacío) o '#' (célula).
  91. """
  92. lista_final=[]
  93. for fila in life:
  94. cadena=""
  95. for elemento in fila:
  96. cadena+=viva if elemento else muerta
  97. lista_final.append(cadena)
  98. return lista_final
  99. def pruebas_life_mostrar():
  100. """Prueba el correcto funcionamiento de life_mostrar()."""
  101. assert life_mostrar([]) == []
  102. assert life_mostrar([[False]]) == ['.']
  103. assert life_mostrar([[True]]) == ['#']
  104. assert life_mostrar([[True, False], [False, True]]) == ['#.', '.#']
  105.  
  106. def cant_adyacentes(life, f, c):
  107. """
  108. Calcula la cantidad de células adyacentes a la celda en la fila `f` y la
  109. columna `c`.
  110.  
  111. Importante: El "tablero" se considera "infinito": las celdas del borde
  112. izquierdo están conectadas a la izquierda con las celdas del borde
  113. derecho, y viceversa. Las celdas del borde superior están conectadas hacia
  114. arriba con las celdas del borde inferior, y viceversa.
  115. """
  116. contador=0
  117. cant_filas=len(life)
  118. cant_columnas=len(life[0])
  119. for x in range(f - radio_x ,f + radio_x+1):
  120. for i in range(c - radio_x,c + radio_x+1):
  121. if life[x%cant_filas][i%cant_columnas] and (x,i)!=(f,c):
  122. contador+=1
  123. return (contador)
  124. def pruebas_cant_adyacentes():
  125. """Prueba el correcto funcionamiento de cant_adyacentes()."""
  126. assert cant_adyacentes(life_crear(['.']), 0, 0) == 0
  127. assert cant_adyacentes(life_crear(['..', '..']), 0, 0) == 0
  128. assert cant_adyacentes(life_crear(['..', '..']), 0, 1) == 0
  129. assert cant_adyacentes(life_crear(['##', '..']), 0, 0) == 2
  130. assert cant_adyacentes(life_crear(['##', '..']), 0, 1) == 2
  131. assert cant_adyacentes(life_crear(['#.', '.#']), 0, 0) == 4
  132. assert cant_adyacentes(life_crear(['##', '##']), 0, 0) == 8
  133. assert cant_adyacentes(life_crear(['.#.', '#.#', '.#.']), 1, 1) == 4
  134. assert cant_adyacentes(life_crear(['.#.', '..#', '.#.']), 1, 1) == 3
  135.  
  136. def celda_siguiente(life, f, c):
  137. """
  138. Calcula el estado siguiente de la celda ubicada en la fila `f` y la
  139. columna `c`.
  140.  
  141. Devuelve True si en la celda (f, c) habrá una célula en la siguiente
  142. iteración, o False si la celda quedará vacía.
  143. """
  144. celda=life[f][c]
  145. n=cant_adyacentes(life,f,c)
  146. if not celda and n==adyacentes2:
  147. return True
  148. return celda and (n==adyacentes1 or n==adyacentes2)
  149. def pruebas_celda_siguiente():
  150. """Prueba el correcto funcionamiento de celda_siguiente()."""
  151. assert celda_siguiente(life_crear(['.']), 0, 0) == False
  152. assert celda_siguiente(life_crear(['..', '..']), 0, 0) == False
  153. assert celda_siguiente(life_crear(['..', '..']), 0, 1) == False
  154. assert celda_siguiente(life_crear(['##', '..']), 0, 0) == True
  155. assert celda_siguiente(life_crear(['##', '..']), 0, 1) == True
  156. assert celda_siguiente(life_crear(['#.', '.#']), 0, 0) == False
  157. assert celda_siguiente(life_crear(['##', '##']), 0, 0) == False
  158. assert celda_siguiente(life_crear(['.#.', '#.#', '.#.']), 1, 1) == False
  159. assert celda_siguiente(life_crear(['.#.', '..#', '.#.']), 1, 1) == True
  160.  
  161. def life_siguiente(life):
  162. """
  163. Calcula el siguiente estado del juego.
  164.  
  165. Recibe el estado actual del juego (lista de listas de False/True) y
  166. devuelve un _nuevo_ estado que representa la siguiente iteración según las
  167. reglas del juego.
  168.  
  169. Importante: El "tablero" se considera "infinito": las celdas del borde
  170. izquierdo están conectadas a la izquierda con las celdas del borde
  171. derecho, y viceversa. Las celdas del borde superior están conectadas hacia
  172. arriba con las celdas del borde inferior, y viceversa.
  173. """
  174. siguiente = []
  175. for f in range(len(life)):
  176. fila = []
  177. for c in range(len(life[0])):
  178. fila.append(celda_siguiente(life, f, c))
  179. siguiente.append(fila)
  180. return siguiente
  181. def pruebas():
  182. """Ejecuta todas las pruebas"""
  183. pruebas_life_crear()
  184. pruebas_life_mostrar()
  185. pruebas_cant_adyacentes()
  186. pruebas_celda_siguiente()
  187.  
  188. pruebas()
  189. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement