Langton蚂蚁——简单的元胞自动机(2)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 17:50   11   0

参考书目《元胞自动机理论研究及其仿真应用》科学出版社

Langton蚂蚁
演化规则
1)若蚂蚁处于黑格,则左转90度,将格子涂白
2)若蚂蚁处于白格,则右转90度,将格子涂黑

#include "stdafx.h"

#include <windows.h> 
#include<graphics.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>

int main()
{
 int orgData[100][100];
 int i, j, times;
 int GraphDriver = DETECT, GraphMode;
 int x, y, r;
 int tx, ty;
 for (i = 0; i < 100; i++)
  for (j = 0; j < 100; j++)
   orgData[i][j] = 0;
 initgraph(&GraphDriver, &GraphMode, "");//显示初始化
 setcolor(WHITE);
 rectangle(270, 190, 370, 290);
 x = 50;
 y = 50;//蚂蚁初始位置
 r = 1;//初始运动方向
 orgData[x][y] = 1;
 putpixel(x + 270, y + 190, WHITE);
 for (times = 1; times < 20000; times++)
 {
  Sleep(2);
  switch (r)
  { //1表示向上
  case(1):tx = x;
   ty = y - 1;
   break;
   //2表示向左
  case(2):tx = x - 1;
   ty = y;
   break;
   //3表示向下
  case(3):tx = x;
   ty = y + 1;
   break;
   //4表示向右
  case(4):tx = x + 1;
   ty = y;
   break;
  default:tx = x;
   ty = y;
  }
  //循环边界处理
  if (tx >= 0)
   if (tx < 100)
    x = tx;
   else x = tx - 100;
  else x = tx + 100;
  if (ty >= 0)
   if (ty < 100)
    y = ty;
   else y = ty - 100;
  else y = ty + 100;

  //处于白格左转涂黑
  if (orgData[x][y] == 0)
  {
   orgData[x][y] = 1;
   putpixel(x + 270, y + 190, BLACK);
   r = r % 4 + 1;
  }
  //处于黑格右转图白
  else
  {
   orgData[x][y] = 0;
   putpixel(x + 270, y + 190, WHITE);
   r = (r + 2) % 4 + 1;
  }
 }
 return 0;
}

注:代码摘自参考书目

笔者为方便观察,加入了Sleep函数

#include "stdafx.h"

#include <windows.h> 
#include<graphics.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>

int main()
{
 int orgData[100][100];
 int i, j, times;
 int GraphDriver = DETECT, GraphMode;
 int x, y, r;
 int tx, ty;
 for (i = 0; i < 100; i++)
  for (j = 0; j < 100; j++)
   orgData[i][j] = 0;
 initgraph(&GraphDriver, &GraphMode, "");//显示初始化
 setcolor(WHITE);
 rectangle(270, 190, 370, 290);
 x = 50;
 y = 50;//蚂蚁初始位置
 r = 1;//初始运动方向
 orgData[x][y] = 1;
 putpixel(x + 270, y + 190, WHITE);
 for (times = 1; times < 20000; times++)
 {
  Sleep(2);
  switch (r)
  { //1表示向上
  case(1):tx = x;
   ty = y - 1;
   break;
   //2表示向左
  case(2):tx = x - 1;
   ty = y;
   break;
   //3表示向下
  case(3):tx = x;
   ty = y + 1;
   break;
   //4表示向右
  case(4):tx = x + 1;
   ty = y;
   break;
  default:tx = x;
   ty = y;
  }
  //循环边界处理
  if (tx >= 0)
   if (tx < 100)
    x = tx;
   else x = tx - 100;
  else x = tx + 100;
  if (ty >= 0)
   if (ty < 100)
    y = ty;
   else y = ty - 100;
  else y = ty + 100;

  //处于白格左转涂黑
  if (orgData[x][y] == 0)
  {
   orgData[x][y] = 1;
   putpixel(x + 270, y + 190, BLACK);
   r = r % 4 + 1;
  }
  //处于黑格右转图白
  else
  {
   orgData[x][y] = 0;
   putpixel(x + 270, y + 190, WHITE);
   r = (r + 2) % 4 + 1;
  }
 }
 return 0;
}

注:代码摘自参考书目

笔者为方便观察,加入了Sleep函数

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP