当前位置:   article > 正文

Python最简单康威生命游戏Numpy_python大网格的生命游戏

python大网格的生命游戏

康威生命游戏其实很简单,如果不用花里胡哨的那么多函数调用,或者定义类的要求,最简单运用numpy的应该就是这种了。

一.  整体思路

首先,要清楚知道程序分为几个部分,我们需要熟悉规则,想要达到的效果就是细胞在不断死亡和活过来,也就是运用numpy,创建一个方阵,通过它的规则使其不断地迭代,直到最终稳定下来。

其次,我们还需要一个窗口去展示这个迭代的过程,这里运用的是pygame这个包,这个包可以设计窗口的大小,所编写程序的名字等等。

最后整合到一起去,完整的展示出整体过程。

游戏规则
当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态。
当周围有2个或3个存活细胞时, 网格保持原样。
当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态。
当周围有3个存活细胞时,空白网格变成存活细胞。

二.  具体编写

1.设计窗口大小以及把其分为网格

首先确定窗口的大小是600×600,X,Y是网格的数量,这取决于你自己创建的矩阵的大小,这里是50×50的矩阵,矩阵里的元素就是占这里的一个网格的大小,后面就说是一个cell的大小。

其次确定大小后,细胞如何展示,这里通过定义颜色的RGB的值,来给细胞上色。如下所示,我们定义了活着的状态和死亡的状态,以便后面用到。

  1. ALIVE = (124, 252, 0) # 括号里就是RGB的值,可以自己查找想要的颜色的值 绿色
  2. DEAD = (0, 0, 0) # 黑色
  3. SCREEN_WIDTH = 600
  4. SCREEN_HEIGHT = 600
  5. X = 50 # X方向的网格数量
  6. Y = 50 # Y方向的网格数量
  7. CELL_WIDTH = SCREEN_WIDTH / X
  8. CELL_HEIGHT = SCREEN_HEIGHT / Y

2.  导入模块

  1. import pygame,sys, random
  2. import numpy as np

3.  初始化矩阵

创建一个矩阵,遍历每一个元素,设置随机数,默认在0~1的随机数,ran即为概率也就是细胞的密度。

  1. def initialization():
  2. matrix = np.full((50, 50), 0)
  3. for i in range(50):
  4. for j in range(50):
  5. ran = random.random()
  6. if ran > 0.6:
  7. matrix[i][j] = 1
  8. else:
  9. pass
  10. return matrix

4.迭代矩阵

创建一个新的矩阵,在原有矩阵的基础上,增加一个边界,也就是行和列都加两行。并将其作为一个存放数据的内存,将原矩阵元素复制过来,保证边框没有元素。由于规则是细胞的8个邻居,但是边界的细胞并没有那么多,所以新建的矩阵加了行和列,尽管令其为0,但是也使规则适用于所有细胞,使程序更加完整。

  1. def evolution(matrix):
  2. new_matrix = np.full((52, 52), 0)
  3. num = 0
  4. for i in range(50):
  5. for j in range(50):
  6. new_matrix[i+1][j+1] = matrix[i][j]
  7. for i in range(1,51):
  8. for j in range(1,51):
  9. num = new_matrix[i-1][j-1]+new_matrix[i-1][j]+new_matrix[i-1][j+1]+new_matrix[i][j-1]+new_matrix[i][j+1]+new_matrix[i+1][j-1]+\
  10. new_matrix[i+1][j]+new_matrix[i+1][j+1]
  11. if new_matrix[i][j] == 0: # 若原细胞为死亡状态
  12. if num == 3:
  13. matrix[i-1][j-1] = 1
  14. else: # 若原细胞为存活状态
  15. if num == 2 or num == 3:
  16. matrix[i-1][j-1] = 1
  17. else:
  18. matrix[i-1][j-1] = 0
  19. return matrix

另外,也可以直接令其边界的细胞为0,也就是展示的时候,边界细胞始终是死的,也就是这样

  1. def nextmultiply(arr): #下一代繁衍
  2. newarr = [([0] * width) for n in range(high)]
  3. for i in range(high):
  4. for j in range(width):
  5. num=0
  6. if (i==0 or i==high-1) or (j==0 or j==width-1):
  7. newarr[i][j]=0
  8. else:
  9. num=arr[i-1][j-1]+arr[i-1][j]+arr[i-1][j+1]+arr[i][j-1]+arr[i][j+1]+arr[i+1][j-1]+arr[i+1][j]+arr[i+1][j+1] # 可以的
  10. if arr[i][j]==0: #若原细胞为死亡状态
  11. if num==3:
  12. newarr[i][j]=1
  13. else: #若原细胞为存活状态
  14. if num==2 or num==3:
  15. newarr[i][j]=1
  16. else:
  17. newarr[i][j]=0
  18. return newarr

5.  除此之外,还需要使用pygame,一般固定格式

  1. if __name__ == "__main__": # 当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行
  2. # pygame初始化的相关内容
  3. pygame.init() # 使用pygame之前必须初始化
  4. screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 创建游戏的主窗口对象
  5. screen.fill(DEAD) # 使屏幕全变成黑色,初始化屏幕
  6. pygame.display.set_caption("康威生命游戏") # 设置窗口的标题,即游戏名称
  7. framerate = pygame.time.Clock() # 创建一个Clock对象,用于操作时间
  8. for event in pygame.event.get(): # 判断用户是否点了"X"关闭按钮,并执行if代码段
  9. if event.type == pygame.QUIT:
  10. pygame.quit() # 卸载所有模块
  11. sys.exit() # 终止程序,确保退出程序
  12. pygame.display.update() # 对显示窗口进行更新,默认窗口全部重绘 pygame.display.update():刷新主窗口内容
  13. framerate.tick(10) # 设置每秒10帧

6.  最后整体代码如下:

  1. ALIVE = (124, 252, 0) # 绿色
  2. DEAD = (0, 0, 0) # 黑色
  3. SCREEN_WIDTH = 600
  4. SCREEN_HEIGHT = 600
  5. X = 50 # X方向的网格数量
  6. Y = 50 # Y方向的网格数量
  7. CELL_WIDTH = SCREEN_WIDTH / X
  8. CELL_HEIGHT = SCREEN_HEIGHT / Y
  9. import pygame,sys, random
  10. import numpy as np
  11. def initialization():
  12. matrix = np.full((50, 50), 0)
  13. for i in range(50):
  14. for j in range(50):
  15. ran = random.random()
  16. if ran > 0.6:
  17. matrix[i][j] = 1
  18. else:
  19. pass
  20. return matrix
  21. def evolution(matrix):
  22. new_matrix = np.full((52, 52), 0)
  23. num = 0
  24. for i in range(50):
  25. for j in range(50):
  26. new_matrix[i+1][j+1] = matrix[i][j]
  27. for i in range(1,51):
  28. for j in range(1,51):
  29. num = new_matrix[i-1][j-1]+new_matrix[i-1][j]+new_matrix[i-1][j+1]+new_matrix[i][j-1]+new_matrix[i][j+1]+new_matrix[i+1][j-1]+\
  30. new_matrix[i+1][j]+new_matrix[i+1][j+1]
  31. if new_matrix[i][j] == 0: # 若原细胞为死亡状态
  32. if num == 3:
  33. matrix[i-1][j-1] = 1
  34. else: # 若原细胞为存活状态
  35. if num == 2 or num == 3:
  36. matrix[i-1][j-1] = 1
  37. else:
  38. matrix[i-1][j-1] = 0
  39. return matrix
  40. if __name__ == "__main__": # 当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行
  41. # pygame初始化的相关内容
  42. pygame.init() # 使用pygame之前必须初始化
  43. screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 创建游戏的主窗口对象
  44. screen.fill(DEAD) # 使屏幕全变成黑色,初始化屏幕
  45. pygame.display.set_caption("康威生命游戏") # 设置窗口的标题,即游戏名称
  46. framerate = pygame.time.Clock() # 创建一个Clock对象,用于操作时间
  47. # 主函数
  48. matrix = initialization() # 初始化
  49. while True: # 循环获取事件,监听事件状态
  50. screen.fill(DEAD) # 使屏幕全变成黑色,初始化屏幕
  51. for i in range(Y): # 遍历矩阵,并上色
  52. for j in range(X):
  53. if matrix[i][j] == 1:
  54. pygame.draw.rect(screen, ALIVE, (i * CELL_WIDTH, j * CELL_HEIGHT, CELL_WIDTH, CELL_HEIGHT))
  55. else:
  56. pygame.draw.rect(screen, DEAD, (i * CELL_WIDTH, j * CELL_HEIGHT, CELL_WIDTH, CELL_HEIGHT))
  57. for event in pygame.event.get(): # 判断用户是否点了"X"关闭按钮,并执行if代码段
  58. if event.type == pygame.QUIT:
  59. pygame.quit() # 卸载所有模块
  60. sys.exit() # 终止程序,确保退出程序
  61. matrix = evolution(matrix)
  62. pygame.display.update() # 对显示窗口进行更新,默认窗口全部重绘 pygame.display.update():刷新主窗口内容
  63. framerate.tick(10) # 设置每秒10帧


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/111456
推荐阅读
相关标签
  

闽ICP备14008679号