吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 948|回复: 1
收起左侧

[C&C++ 原创] 兰顿蚂蚁的EGE实现

[复制链接]
jin3530 发表于 2023-10-24 21:05
本帖最后由 jin3530 于 2023-10-24 21:08 编辑

兰顿蚂蚁(英语:Langton's ant)是细胞自动机的例子。它由克里斯托夫·兰顿在1986年提出,它由黑白格子和一只“蚂蚁”构成,是一个二维图灵机。兰顿蚂蚁拥有非常简单的逻辑和复杂的表现。在2000年兰顿蚂蚁的图灵完备性被证明。兰顿蚂蚁的想法后来被推广,比如使用多种颜色。
释义:

在平面上的正方形格被填上黑色或白色。在其中一格正方形有一只“蚂蚁”。它的头部朝向上下左右其中一方。

若蚂蚁在黑格,右转90度,将该格改为白格,向前移一步;

若蚂蚁在白格,左转90度,将该格改为黑格,向前移一步。

很多时,蚂蚁刚刚开始时留下的路线都会有接近对称、像是会重复。但不论起始状态如何,蚂蚁的路线必然是无限长的。



[C++] 纯文本查看 复制代码
#include <graphics.h>
#include <math.h>
void drawR(int x, int y, bool p, int g = 10) {
        color_t c = EGEACOLOR(0xFF, DARKGRAY);
        if (!p) c = EGEACOLOR(0xFF, WHITE);
        setfillcolor(c);
        ege_fillrect(x * g, y * g, g, g);
        setlinewidth(0.5);
        setcolor(EGEACOLOR(0x24, BLACK));
        ege_rectangle(x * g, y * g, g, g);
}
void walk(int &r, bool s, int &x, int &y) {
        if (s)
                r = (r + 1) % 4;
        else
                r = (r + 3) % 4;
        x += round(sin(r * 3.1415926 / 2));
        y += round(cos(r * 3.1415926 / 2));
}
int main(int argc, char *argv[]) {
        int width = 600;
        int height = 600;
        int n = 6;
        
        if (argc > 3) {
                n = atoi(argv[1]);
                width = atoi(argv[2]);
                height = atoi(argv[3]);
        }
        bool data[1000][1000];
        memset(data, false, 1000 * 1000);
        setcaption("兰顿蚂蚁");
        initgraph(width, height, INIT_RENDERMANUAL);
        setbkcolor(EGERGB(0xFF, 0xFF, 0xFF));
        //ege_enable_aa(true);
        setfont(48, 0, "宋体");
        setcolor(EGEARGB(0x80, 0x30, 0x30, 0x30));
        outtextxy(150, 200, "按任意键开始");

        getch();
        cleardevice();
        for (int i = 0; i < height / n; i++) { //行
                for (int j = 0; j < width / n; j++) { //列
                        drawR(j, i, 0, n);
                }
        }
        int x = width / 2 / n, y = height / 2 / n;
        int r = 0;
        while (!(x > width / n || y > height / n || x < 0 || y < 0)) {
                data[x][y] = !data[x][y];
                drawR(x, y, data[x][y], n);
                walk(r, data[x][y], x, y);
                Sleep(1);
        }
        while (is_run()) {
                //TODO
        }
        closegraph();
        return 0;
}

屏幕截图 2023-10-24 210713.png

anti.zip

363.26 KB, 下载次数: 2, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
bury咩 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

tomliu 发表于 2023-10-25 08:43
好算法, 看了好久才看懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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