找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 483102|回复: 0

Ada实际案例,生命游戏二,兰顿的蚂蚁

[复制链接]

该用户从未签到

发表于 2021-5-18 00:56:46 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这一次我们来看看另外一个生命游戏的一个例子,兰顿的蚂蚁。
兰顿的蚂蚁也是自动元胞机的一个玩法和体现,我们在这里通过一个简单的逻辑来实现代码的运行。
游戏的规则为
在平面上的正方形格被填上黑色或白色。在其中一格正方形有一只「蚂蚁」。它的头部朝向上下左右其中一方。
[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看到更大的图像。
有问题,可以私信。
回复

使用道具 举报

网站地图|页面地图|文字地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2024-5-20 08:27

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表