Langston's Ant, animated for POSIX

From Public Wiki
Jump to navigation Jump to search

Synopsis

Performs a simulation of Langston's Ant as an animation for Linux, Un*x systems.

Notes

There are no borders, the map wraps edge to edge. Define statements have a 20x20 grid, 1000 steps and a delay of 20ms. The ANT always starts at, or near, the center. The ant defaults being oriented towards north as an initial condition.

Compilation

gcc -o Ant Ant.c

Code

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include <time.h>
  4 #include <errno.h> 
  5 #define X 20
  6 #define Y 20
  7 #define S 1000
  8 #define D 20   
  9 
 10 /* msleep(): Sleep for the requested number of milliseconds. */
 11 int msleep(long msec)
 12 {
 13 	struct timespec ts;
 14 	int res;
 15 
 16 	if (msec < 0)
 17 	{
 18 		errno = EINVAL;
 19 		return -1;
 20 	}
 21 
 22 	ts.tv_sec = msec / 1000;
 23 	ts.tv_nsec = (msec % 1000) * 1000000;
 24 
 25 	do
 26 	{
 27 		res = nanosleep(&ts, &ts);
 28 	}
 29 	while (res && errno == EINTR);
 30 	return res;
 31 }
 32 
 33 void main(void)
 34 {
 35 	char world[X][Y];
 36 	unsigned short x, y, c, d, h, s;
 37 	//init
 38 	x=X/2; y=Y/2; h=0;
 39 	for(c=0;c<Y;c++)
 40 	{
 41 		for(d=0;d<X;d++)
 42 		{
 43 			world[d][c] = '.';
 44 		}
 45 	}
 46 
 47 	//loop
 48 	for(s=0;s<S;s++)
 49 	{
 50 		#ifdef D
 51 		msleep(D);
 52 		#endif
 53 		printf("\e[1;1H\e[2J");
 54 		//print current state
 55 		printf("S=%d\n\n",s+1);
 56 		printf("%c", '/');
 57 		for(c=0;c<X;c++)
 58 		{
 59 			printf("%c", '-');
 60 		}
 61 		printf("%c\n", '\\');
 62 		for(c=0;c<Y;c++)
 63 		{
 64 			printf("%c", '|');
 65 			for(d=0;d<X;d++)
 66 			{
 67 				if(d==x && c==y)
 68 					printf("A");
 69 				else
 70 					printf("%c",world[d][c]);
 71 			}
 72 			printf("%c\n", '|');
 73 		}
 74 		printf("%c", '\\');
 75 		for(c=0;c<X;c++)
 76 		{
 77 			printf("%c", '-');
 78 		}
 79 		printf("/\n\n");
 80 		//turn logic
 81 		if(world[x][y]=='.')
 82 		{
 83 			h++; //CW
 84 			h = h % 4;
 85 			world[x][y]='*';
 86 		}
 87 		else
 88 		{	
 89 			h--; //CCW
 90 			h= h % 4;
 91 			world[x][y]='.';
 92 		}
 93 		//move forward
 94 		if(h==0)
 95 			{if(y==0) y=Y-1; else y--;}
 96 		if(h==2)
 97 			{if(y==Y-1) y=0; else y++;}
 98 		if(h==1)
 99 			{if(x==X-1) x=0; else x++;}
100 		if(h==3)
101 			{if(x==0) x=X-1; else x--;}
102 	}
103 
104 	//terminate
105 	printf("\nEOS \n");
106 	return;
107 }