元胞自动机之兰顿蚂蚁——c++实现

描述:
在平面上的正方形格被填上黑色或白色。在其中一格正方形有一只“蚂蚁”。它的头部朝向上下左右其中一方。
若蚂蚁在黑格,右转90度,将该格改为白格,向前移一步;
若蚂蚁在白格,左转90度,将该格改为黑格,向前移一步。

实现:
显示方面依旧使用了easyX
由于不可能让蚂蚁无限走下去,人为地规定了步数20000步,当然也可以自己修改。并且人为规定它要在200*200的矩形中走并处理边界。

源代码:

#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>

int main()
{
    int orgData[200][200];//记录当前元胞空间状态
    int times;//用于下面的循环控制
    int GraphDriver = 480, GraphMode = 400;
    int x, y, r;//r取1.2.3.4分别代表四个运动方向
    int tx, ty;//tx和ty是下一步蚂蚁要走的位置

    //初始化,开始时空间状态均为0(白为0,黑为1
    for (int i = 0; i < 200; i++)
        for (int j = 0; j < 200; j++)
            orgData[i][j] = 0;

    //初始化显示窗口
    initgraph(GraphDriver, GraphMode);

    //将所有的点都初始化为白色(不知道为什么在这里使用setbkcolor无用)
    for (int i = 0; i < 200; i++)
        for (int j = 0; j < 200; j++)
            putpixel(i, j, WHITE);

    //x,y为初始时刻蚂蚁的坐标
    x = 100;
    y = 100;
    //初始运动方向向下
    r = 3;

    //设置初始位置
    orgData[x][y] = 1;
    putpixel(x, y, BLACK);

    //这里规定步数
    for (times = 1; times < 20000; times++)
    {
        //1代表向上,2代表向左,3代表向下,4代表向右
        switch (r)
        {
        case 1:
            tx = x;
            ty = y - 1;
            break;
        case 2:
            tx = x - 1;
            ty = y;
            break;
        case 3:
            tx = x;
            ty = y + 1;
            break;
        case 4:
            tx = x + 1;
            ty = y;
            break;
        default:
            tx = x;
            ty = y;
        }

        //用tx和ty给x、y赋值并处理循环边界(因为可能为超出那个200*200的格子,而且不处理边界的话下面赋值可能会出问题,数组xy超出边界
        if (tx >= 0)
            if (tx < 200)
                x = tx;
            else
                x = tx - 200;
        else
            x = tx + 200;

        if (ty >= 0)
            if (ty < 200)
                y = ty;
            else
                y = ty - 200;
        else
            y = ty + 200;

        if (orgData[x][y] == 0)//为白则涂黑左转
        {
            orgData[x][y] = 1;
            putpixel(x, y, BLACK);
            r = r % 4 + 1;
        }
        else//为黑则涂白右转
        {
            orgData[x][y] = 0;
            putpixel(x, y, WHITE);
            r = (r + 2) % 4 + 1;
        }
    }
    system("pause");
}

结果截图:
这里写图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值