2013年9月10日 星期二

[C/C++ 演算法]- 生命遊戲

[C/C++ 演算法]- 生命遊戲



剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。


拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/LifeGame.htm









#include <stdio.h> 
#define ROW 10
#define COLUMN 10

void
produce(int[][COLUMN], int[][COLUMN]);
void
print(int[][COLUMN]);
void
copy(int[][COLUMN], int[][COLUMN]);
int
neighbors(int[][COLUMN], int, int);
int
isDifferent(int[][COLUMN], int[][COLUMN]);

int
main() {
int
current[ROW][COLUMN] = {
{
0, 1, 0, 1, 0, 0, 0, 0, 1, 1},
{
0, 1, 0, 1, 0, 0, 0, 0, 1, 1},
{
0, 1, 0, 1, 0, 0, 0, 0, 1, 1},
{
0, 1, 1, 1, 0, 0, 1, 0, 1, 1},
{
0, 1, 1, 1, 0, 1, 0, 0, 1, 1},
{
0, 1, 0, 1, 1, 0, 0, 1, 1, 1},
{
0, 1, 0, 1, 0, 1, 0, 0, 1, 1},
{
0, 1, 0, 1, 0, 0, 1, 0, 1, 1},
{
0, 1, 0, 1, 0, 1, 0, 1, 1, 1},
{
0, 1, 0, 1, 1, 0, 0, 0, 1, 1}
};

int
next[ROW][COLUMN] = {0};

print(current);
produce(current, next);
while
(isDifferent(current, next)) {
copy(next, current);
print(current);
produce(current, next);
}


return
0;
}



void
produce(int current[][COLUMN], int next[][COLUMN]) {
int
row;
for
(row = 0; row < ROW; row++) {
int
column;
for
(column = 0; column < COLUMN; column++) {
switch
(neighbors(current, row, column)) {
case
0: case 1: case 4:
next[row][column] = 0; break;
case
2:
next[row][column] = current[row][column]; break;
case
3:
next[row][column] = 1;
}
}
}
}


int
neighbors(int current[][COLUMN], int row, int column) {
int
dirs[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1},
{
1, 0}, {1, -1}, {0, -1}, {-1, -1}};
int
count, i;
for
(count = 0, i = 0; i < 8 && count < 4; i++) {
int
r = row + dirs[i][0];
int
c = column + dirs[i][1];
if
(r > -1 && r < ROW && c > -1 && c < COLUMN && current[r][c]) {
count++;
}
}

return
count;
}


void
print(int current[][COLUMN]) {
printf("Status...\n");
int
row;
for
(row = 0; row < ROW; row++) {
int
column;
for
(column = 0; column < COLUMN; column++) {
putchar(current[row][column] ? '*' : '~');
}

puts("");
}
}


void
copy(int from[][COLUMN], int to[][COLUMN]) {
int
row;
for
(row = 0; row < ROW; row++) {
int
column;
for
(column = 0; column < COLUMN; column++) {
to[row][column] = from[row][column];
from[row][column] = 0;
}
}
}


int
isDifferent(int current[][COLUMN], int next[][COLUMN]) {
int
row;
for
(row = 0; row < ROW; row++) {
int
column;
for
(column = 0; column < COLUMN; column++) {
if
(current[row][column] != next[row][column]) {
return
1;
}
}
}

return
0;
}


沒有留言:

張貼留言