兰顿蚂蚁的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;
}
好算法, 看了好久才看懂
页:
[1]