动态分配的二维数组。并用它实现Game of Life。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
struct twod//two dimension
{
int* p;
int X, Y;//数组p[X][Y]
twod(int xsize, int ysize)
{
if (xsize <= 0 || ysize <= 0)throw(-1);
X = xsize, Y = ysize;
p = new(int[xsize * ysize])();
}
~twod(void)
{
delete[]p;
}
int& at(int x, int y)
{
if (x < 0 || y < 0 || x >= X || y >= Y)throw(-1);
return p[x * Y + y];
}
int& cat(int x, int y)//circle at
{
return p[(((x % X) + X) % X) * Y + (((y % Y) + Y) % Y)];
}
int* operator[](int x)//使用时没有y检测。
{
if (x < 0 || x >= X)throw(-1);
return p + x * Y;
}
int& operator()(int x)
{
return p[x];
}
};
char buffer[200 * 150]{};
int main()
{
twod cell(100, 100);
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
{
cell[x][y] = rand() % 2;
}
for (;;)
{
time_t from = clock();
//从(0,0)打印:
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { 0,0 });
int cur = 0;
for (int x = 0; x < 100; x++, buffer[cur++] = '\n')
for (int y = 0; y < 100; y++)
{
if (cell[x][y] == 1)
buffer[cur++] = (char)((unsigned short)'█' >> 8), buffer[cur++] = (char)((unsigned short)'█' & 0xff);
else buffer[cur++] = ' ', buffer[cur++] = ' ';
}
buffer[cur] = '\0';
puts(buffer);
//计算一个循环:用到了[],(),cat。
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
{
int sum = 0;
for (int i = -1; i <= 1; i++)
for (int j = -1; j <= 1; j++)
{
sum += (cell.cat(x + i, y + j) & 1);
}
sum -= cell[x][y];
sum == 2 ? cell[x][y] |= ((cell[x][y] & 1) << 1) : sum == 3 ? cell[x][y] |= (1 << 1) : 0;//gol的规则。
}
for (int x = 0; x < 100 * 100; x++)
cell(x) >>= 1;
time_t to = clock();
if (to - from < 20)
{
Sleep(20 - (DWORD)(to - from));
}
}
}