|
这一次我们来看看另外一个生命游戏的一个例子,兰顿的蚂蚁。
兰顿的蚂蚁也是自动元胞机的一个玩法和体现,我们在这里通过一个简单的逻辑来实现代码的运行。
游戏的规则为
在平面上的正方形格被填上黑色或白色。在其中一格正方形有一只「蚂蚁」。它的头部朝向上下左右其中一方。
[list,
[*,若蚂蚁在白格,右转90度,将该格改为黑格,向前移一步;
[*,若蚂蚁在黑格,左转90度,将该格改为白格,向前移一步。
[/list,在这里我们可以先考虑一个最开始的情况,及一只蚂蚁最开始的行动情况。
一只蚂蚁的最开始情况按照规则的描述,我们的蚂蚁在白色的格子上,向右转90度,将自身的格子改成黑色,然后向前走一格。
第二步的情况我们接着继续跟着规则走下去。
接下来就是装备用另外一个规则第二个规则的条件达成如图所视完整的视频可以在B战上找到,这里只是做一个演示。
现在我们来分析我们的规则如何简化为我们的编程的代码。
我们考虑到这个蚂蚁状态可以简单从上帝视角归类为“上”,“下”,“左”,“右”四个方位。
蚂蚁的行动轨迹——黑白的变化就是bool的一种体现。
蚂蚁的位置就是整个地图上的一个坐标。
抽象的绘图代码的详细解释:
type direction is (up] down, right, left);
来对应我们之前设置的方向。
Type Matrix Is Array (Integer Range <>, Integer Range <>) Of Boolean;
Map : Matrix(1..41,1..41) := (others => (others => False));
设置好我们的地图,并且全部设置为白色,以达成游戏的初始化。
蚂蚁运动的procedure因为我们的蚂蚁运动只和当前的方向和所在位置的“1&0”有关,并且,我们的运动会改变蚂蚁的方向和所处位置,所以我们的位置和方向的input必须是in out,读写一起使用。
我们以up,“向上”为例子在ada的if中只能用bool型,但是我们一开始设置的Matrix 就是只有bool,只要给上I,J就能返回bool,所以直接使用,先转弯,然后再移动。我们可以不必要按照规则给定的语言来编程,我们发现蚂蚁在黑白方块上的表现是相反的,所以我们可以在case语句里每个单独的运行中加上两个if else就能解决变换。我们因为白色在变成黑色后是一个“1”及“有”,再用这个bool去决定方向,个人觉得会快一点。
图像的输出看过前面内容的同学就应该可以很简单的看懂。
定义初始位置和方向主程序跑起来总体情况
全部代码各位再跑的时候记得把现实window拉大一点。
大概这样然后点上边的一个三角形,就是在扫把和小虫子(bug),中间的那个。
总共运行时间大概是4分钟,当I,J的其中一个不在1~41(见Map的matrix定义栏)中间范围的时候,Ada会自动是为超过数值可处理的范围,自动停机。
最终结果大家也可以改变map定义的范围大小,并且用再Buiild:=>Run:=>Custm:=>点击external window看到更大的图像。
有问题,可以私信。 |
|