元胞自動機之蘭頓螞蟻——c++實現
阿新 • • 發佈:2019-01-06
描述:
在平面上的正方形格被填上黑色或白色。在其中一格正方形有一隻“螞蟻”。它的頭部朝向上下左右其中一方。
若螞蟻在黑格,右轉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");
}
結果截圖: