在研究元胞自动机理论过程中,Conway发明生命游戏(Game of Life、GoL),在1970s风靡一时。
这是0人游戏,即按照初始的设置,游戏自动演化。在类似围棋的棋盘中,每一个格子可以是空格或者存在一个生命/细胞/Cell;每一个格子有8个相邻的格子(正上方、正下方、右侧、左侧、左上方、右上方、左下方以及右下方),相邻的格子中存活的生命数量称为其邻居(neighbor)数。在世代交替时,所有的格子根据其邻居数,诞生新生命、Cell保持存活或者Cell死亡。生命演化规则:B3/S23
- 一个生命如果恰好有2个或3个邻居,它会存活到下一个世代;否则,会因为孤独或拥挤而死亡。
- 一个空格,如果恰好有3个邻居,则诞生一个新生命。
在介绍数组期间,介绍了《5.3.5 案例:生命游戏》。在学习了图形显示技术后,《编程导论(Java)·9.5 案例:GoL》再次给出更美观的实现。
最简单的game of life演示程序
参考《5.3.5 案例:生命游戏》。
1.游戏世界
游戏世界是一个char[][]二维数组,用字符*表示存在细胞,而空格表示该格子没有细胞。在控制台中输出world数据。
package dataStructures.array;
public class simpleGOL{
private final int HEIGHT=15;//二维游戏世界的大小。HEIGHT*WIDTH 个字符
private final int WIDTH =60;
private char[][] world = new char[HEIGHT][WIDTH];
private final char Y ='*'; //用字符*代表一个细胞
private final char No = ' ';
/**
* 构造器。使用预定义的数据初始化world.
*/
simpleGOL(){
world[3][4] = world[3][5] = world[3][6] =Y;
//glider
world[10][4] = world[10][5] = world[10][6] = world[11][6] = world[12][5] = Y;
}
/**
* 在控制台中输出world数据
*/
private void print(){
for (int height = 0; height < HEIGHT; height++) {
for (int width = 0;width < WIDTH; width++) {
char c = ( world[height][width] == Y) ? Y: No ;
System.out.print(c);
}
System.out.println("");
}
System.out.println("");
}
}
2.nextWorld()
生命游戏的核心是在当前world数据基础上,计算出下一代的world数据。为此,需扫描当代world的每一个格子,计算其邻居的数量,以条件语句表达生命演化规则,设定新一代world的数据。
助手方法getNeighbors(int row,int col),计算指定坐标位置(x,y)或(row,col)格子邻居的数量;
cellState(int y,int x),返回指定坐标(x,y)的格子中细胞状况值&#x