当前位置:   article > 正文

【趣味】【python元胞自动机】【附赠HTML版本】_python 元胞自动机

python 元胞自动机

1.代码

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import matplotlib.animation as animation
  4. # 定义细胞的状态常量
  5. ALIVE = 1
  6. DEAD = 0
  7. # 定义网格的大小和细胞的初始状态
  8. grid_size = 100
  9. init_config = np.random.choice([ALIVE, DEAD], size=(grid_size, grid_size))
  10. # 定义细胞自动机的规则
  11. def get_new_state(grid, i, j):
  12. # 获取相邻细胞的状态
  13. neighbors = grid[max(i - 1, 0):min(i + 2, grid_size), max(j - 1, 0):min(j + 2, grid_size)]
  14. # 计算相邻活细胞的数量
  15. alive_neighbors = np.count_nonzero(neighbors) - grid[i, j]
  16. # 更新细胞状态
  17. if grid[i, j] == ALIVE and 2 <= alive_neighbors <= 3:
  18. return ALIVE
  19. elif grid[i, j] == DEAD and alive_neighbors == 3:
  20. return ALIVE
  21. else:
  22. return DEAD
  23. # 初始化细胞状态
  24. grid = init_config
  25. # 初始化可视化
  26. fig, ax = plt.subplots()
  27. im = ax.imshow(grid, cmap='Greys', interpolation='nearest')
  28. # 更新细胞状态的回调函数
  29. def update(frameNum, grid, im):
  30. new_grid = np.zeros((grid_size, grid_size))
  31. for i in range(grid_size):
  32. for j in range(grid_size):
  33. new_grid[i, j] = get_new_state(grid, i, j)
  34. im.set_data(new_grid)
  35. grid[:] = new_grid[:]
  36. return im,
  37. # 使用 FuncAnimation 实现动画
  38. ani = animation.FuncAnimation(fig, update, fargs=(grid, im), frames=100, interval=50, blit=True)
  39. plt.show()

这段代码实现了一个生命游戏的动画,生命游戏是一种细胞自动机,它由一个二维的网格和一些简单的规则组成。这些规则决定了每个细胞在下一次迭代中是否存活或死亡。

在这段代码中,首先定义了细胞的状态常量,然后生成了一个随机的初始配置。接着定义了一个函数来计算每个细胞的新状态。这个函数会获取相邻细胞的状态,并根据规则计算新的状态。然后在主函数中初始化了细胞状态和可视化,并使用 FuncAnimation 实现了动画。在动画中,每一帧都会调用 update 函数来更新细胞的状态,并将更新后的状态显示在可视化中。

2.HTML

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>元胞自动机</title>
  5. </head>
  6. <body style="background-color: #d8d8d8;">
  7. <canvas id="canvas"></canvas>
  8. <script>
  9. const canvas = document.getElementById('canvas');
  10. const ctx = canvas.getContext('2d');
  11. const width = 576;
  12. const height = 864;
  13. canvas.width = width;
  14. canvas.height = height;
  15. let cells = [];
  16. for (let i = 0; i < width; i++) {
  17. cells[i] = [];
  18. }
  19. for (let i = 0; i < width; i++) {
  20. for (let j = 0; j < height; j++) {
  21. cells[i][j] = Math.floor(Math.random() * 2);
  22. }
  23. }
  24. function update() {
  25. let newCells = [];
  26. for (let i = 0; i < width; i++) {
  27. newCells[i] = [];
  28. }
  29. for (let i = 0; i < width; i++) {
  30. for (let j = 0; j < height; j++) {
  31. const neighbors = countNeighbors(cells, i, j);
  32. if (cells[i][j] === 0 && neighbors === 3) {
  33. newCells[i][j] = 1;
  34. } else if (cells[i][j] === 1 && (neighbors < 2 || neighbors > 3)) {
  35. newCells[i][j] = 0;
  36. } else {
  37. newCells[i][j] = cells[i][j];
  38. }
  39. }
  40. }
  41. cells = newCells;
  42. }
  43. function countNeighbors(cells, x, y) {
  44. let count = 0;
  45. for (let i = -1; i <= 1; i++) {
  46. for (let j = -1; j <= 1; j++) {
  47. const row = (x + i + width) % width;
  48. const col = (y + j + height) % height;
  49. if (cells[row][col] === 1) {
  50. count++;
  51. }
  52. }
  53. }
  54. return count;
  55. }
  56. function render() {
  57. ctx.clearRect(0, 0, width, height);
  58. for (let i = 0; i < width; i++) {
  59. for (let j = 0; j < height; j++) {
  60. if (cells[i][j] === 1) {
  61. ctx.fillStyle = 'black';
  62. } else {
  63. ctx.fillStyle = '#79c995';
  64. }
  65. ctx.fillRect(i, j, 1, 1);
  66. }
  67. }
  68. }
  69. setInterval(function () {
  70. update();
  71. render();
  72. }, 100);
  73. </script>
  74. </body>
  75. </html>

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

闽ICP备14008679号