1. 程式人生 > >元胞自動機之蘭頓螞蟻——c++實現

元胞自動機之蘭頓螞蟻——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"); }

結果截圖:
這裡寫圖片描述