生命游戏

  • 格式:doc
  • 大小:74.50 KB
  • 文档页数:6

说明生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包
括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。

拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一次状态将死亡。

稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。

复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。

解法生命游戏的规则可简化为以下,并使用CASE比对即可使用程式实作:
邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。

邻居个数为2时,则该细胞下次状态为复活。

邻居个数为3时,则该细胞下次状态为稳定
Java代码:
package test;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameLife {
public static int MAXCOL = 25;
public static int MAXROW = 25;
public static int DEAD = 0;
public static int ALIVE = 1;
JFrame jf;
JPanel[][] jp;
boolean[][] str;
public static void main(String[] args){
GameLife gl = new GameLife(80,80);
gl.randomized();
gl.update();
while(true){
try {
gl.generation();
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
gl.update();
}
}
//获取下一代
public void generation(){
for(int i=1;i<str.length-1;i++){
for(int j=1;j<str[i].length-1;j++){
int Counter = 0;
if(jp[i-1][j-1].getBackground()==Color.BLUE){ Counter++;
}
if(jp[i][j-1].getBackground()==Color.BLUE){
Counter++;
}
if(jp[i+1][j-1].getBackground()==Color.BLUE){ Counter++;
}
if(jp[i+1][j].getBackground()==Color.BLUE){
Counter++;
}
if(jp[i-1][j].getBackground()==Color.BLUE){
Counter++;
}
if(jp[i-1][j+1].getBackground()==Color.BLUE){ Counter++;
}
if(jp[i][j+1].getBackground()==Color.BLUE){
Counter++;
}
if(jp[i+1][j+1].getBackground()==Color.BLUE){ Counter++;
}
/*
if(jp[i][j].getBackground()==Color.BLUE){
if(Counter<2||Counter>3){
str[i][j] = false;
}
}
else{
if(Counter==3){
str[i][j] = true;
}
}
*/
switch (Counter) {
case 0:
case 1:
case 4:
case 5:
case 6:
case 7:
case 8:
str[i][j]=false;
break;
case 2:
str[i][j] = str[i][j];
break;
case 3:
str[i][j] = true;
break;
default:
break;
}
}
}
}
//游戏对象创建函数
public GameLife(int x,int y){ //此处的x,y分别表示面板的格子的数量为x*y
jf = new JFrame("Game of Life");
str = new boolean[x][y];
jp = new JPanel[x][y];
jf.setLayout(new GridLayout(x, y, 2, 2)); //设置面板的默认大小和格子的宽度
for(int col=0;col<x;col++){
for(int row=0;row<y;row++){
jp[col][row] = new JPanel();
jp[col][row].setBackground(Color.white);
jf.add(jp[col][row]);
}
}
jf.setSize(600,700);
jf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event){
System.exit(0);
}
});
randomized();
update();
jf.setVisible(true);
}
private void update() {
// TODO Auto-generated method stub
for(int i=1;i<str.length-1;i++){
for(int j=1;j<str[i].length-1;j++){
if(str[i][j]){
jp[i][j].setBackground(Color.BLUE);
}
else{
jp[i][j].setBackground(Color.WHITE);
}
}
}
}
/*
* 这是一个产生随机数的函数,随机产生细胞
*/
public void randomized() {
// TODO Auto-generated method stub
for(int i=1;i<str.length-1;i++){
for(int j=1;j<str[i].length-1;j++){
if(Math.random()>0.5){ //这里的取值会直接影响面板上细胞数量的多少
str[i][j] = true;
}
else{
str[i][j] = false;
}
}
}
}
}
执行结果:。