游戏"生活"
这是一个元胞自动机,一个没有玩家的游戏,其中用户创建一个初始状态,然后只看它的发展。 在游戏中,您可以创建具有图灵完整性的进程,这允许您实现任何图灵机。
规则
- 在一个空的细胞中,有三个活细胞相邻,生命开始了。
- 如果一个活细胞有两个或三个活的邻居,那么这个细胞继续存活。
- 如果活着的邻居少于两个或三个以上,细胞就会死亡。
实现的算法
安装和连接库。
如果需要安装库,请为install参数分配一个值。
In [ ]:
Pkg.add(["Animations"])
In [ ]:
install = 1;
if install == 1
using Pkg
Pkg.add("Animations")
end
连接库。
In [ ]:
using Plots
using FileIO
using Images
using Animations
算法参数的初始化。
In [ ]:
# 世界的大小
x = 350;
y = 350;
# 创造世界
World = falses(x, y);
World[3:end-2, 3:end-2] .= true;
# 辅助参数的初始化
runGame = true; # 启动/停止世界处理循环的条件
count_steps = 0; # 循环中步数的计数器
num_step = 1000; # 循环步数
处理和可视化世界的循环。
In [ ]:
@gif while runGame
global World, runGame, x, y, count_steps, num_step; # 将变量声明为全局变量。
# 渲染世界。
heatmap(World, size=(x,y), aspect_ratio=:equal, cbar=:none, axis=nothing, border=:none, c = :blues)
# 世界的新状态的初始化。
WorldNew = falses(x, y);
# 处理世界上的每一个细胞。
for i in 2:x-1
for j in 2:y-1
p = World[i, j]
Near = World[(i-1):(i+1), (j-1):(j+1)] # 突出显示细胞环境。
Near[2, 2] = false # 被处理的细胞的穿刺。
NearSum = sum(Near) # 环境中细胞数的计算。
# 基于如上所述的规则进行进一步的细胞发育的处理。
if p
if (NearSum == 2) || (NearSum == 3)
p = true
else
p = false
end
else
if NearSum == 3
p = true
end
end
# 将处理过的细胞保存到一个新的世界状态。
WorldNew[i, j] = p
end
end
# 从处理周期检查退出条件。
if count_steps > num_step
runGame = false
end
# 步进计数器
count_steps += 1
# 为循环的下一次迭代保存新的世界状态。
World = WorldNew
end
Out[0]:
结论
基于这个例子的实现结果,我们向您展示了Engee在动力学中显示算法操作的能力,也展示了在周期内监视状态的能力,并展示了如何将这些结果可视化。
