jin3530 发表于 2023-10-24 21:05

兰顿蚂蚁的EGE实现

本帖最后由 jin3530 于 2023-10-24 21:08 编辑

兰顿蚂蚁(英语:Langton's ant)是细胞自动机的例子。它由克里斯托夫·兰顿在1986年提出,它由黑白格子和一只“蚂蚁”构成,是一个二维图灵机。兰顿蚂蚁拥有非常简单的逻辑和复杂的表现。在2000年兰顿蚂蚁的图灵完备性被证明。兰顿蚂蚁的想法后来被推广,比如使用多种颜色。
释义:
在平面上的正方形格被填上黑色或白色。在其中一格正方形有一只“蚂蚁”。它的头部朝向上下左右其中一方。
若蚂蚁在黑格,右转90度,将该格改为白格,向前移一步;
若蚂蚁在白格,左转90度,将该格改为黑格,向前移一步。
很多时,蚂蚁刚刚开始时留下的路线都会有接近对称、像是会重复。但不论起始状态如何,蚂蚁的路线必然是无限长的。


#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);
                width = atoi(argv);
                height = atoi(argv);
      }
      bool data;
      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 = !data;
                drawR(x, y, data, n);
                walk(r, data, x, y);
                Sleep(1);
      }
      while (is_run()) {
                //TODO
      }
      closegraph();
      return 0;
}

tomliu 发表于 2023-10-25 08:43

好算法, 看了好久才看懂
页: [1]
查看完整版本: 兰顿蚂蚁的EGE实现