📄 lifegame.java
字号:
/**
* Title: Game of Life
* Copyright: Copyright (c) 2008
* Company: http://blog.sina.com.cn/dragondragon2
* @author 龙龙
* @version 1.0
*
*
*/
/*
* Conway 的 生命游戏 是一款模拟生物体在矩形网格中生存和死亡的游戏。从理论上来说,网格应该是
* 无边界的,但计算机模拟时可用内存是有限的,因此我们将限定网格“范围”的大小。每个网格元胞要么
* 住着一个活 着的生物体,要么空着。住有生物体的元胞是活的,而空元胞是死的。这款模拟游戏通过连
* 续的时间段或连续的几代来描述生物体的生死过程。
*
* 元胞的状态可以根据以下规则一代一代地变化:
* 一个元胞有八个邻居,分别从水平、垂直和对角方向包围此元胞。
*
* 如果一个元胞是活的,但它没有活着的邻居或只有一个活着的邻居,那么到了下一代该元胞将会饿死。
*
* 如果一个元胞是活的,且有四个或更多活着的邻居,那么到了下一代该元胞将因过度拥挤而死亡。
*
* 如果一个元胞是活的,且有二个或三个活着的邻居,那么到了下一代该元胞将继续活下去。
*
* 如果一个元胞是死的,且正好有三个活着的邻居,那么到了下一代该元胞将复活。所有其他死元胞到了
* 下一代仍将保持死亡状态。
*
* 所有出生和死亡都在同一时刻发生,因此快要死去的元胞可能会促使其相邻元胞出生,但无法通过缓解
* 拥挤程度来阻止其他元胞的死亡,即将出生的元胞也不能杀死或保护上一代活着的元胞。
*
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//生命游戏
public class LifeGame {
// GUI组件
JFrame jf;
// 存放细胞状态
boolean[][] st1;
// 显示细胞状态
JPanel[][] jp;
/**
* 构造器
*
* @param m
* 行数
* @param n
* 列数
*/
public LifeGame(int m, int n) {
// GUI组件初始化
jf = new JFrame("Life Game");
st1 = new boolean[m][n];
jp = new JPanel[m][n];
jf.setLayout(new GridLayout(m, n, 2, 2));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
jp[i][j] = new JPanel();
jp[i][j].setBackground(Color.WHITE);
jf.add(jp[i][j]);
}
}
jf.setSize(500, 600);
jf.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
randomized();
updata();
jf.setVisible(true);
}
/**
* 随机分配资源
*/
public void randomized() {
for (int i = 1; i < st1.length - 1; i++) {
for (int j = 1; j < st1[i].length - 1; j++) {
if (Math.random() > 0.5) {
st1[i][j] = true;
} else {
st1[i][j] = false;
}
}
}
}
/**
* 按照游戏规则获得下一代
*/
public void generation() {
for (int i = 1; i < st1.length - 1; i++) {
for (int j = 1; j < st1[i].length - 1; j++) {
int counter = 0;
if (jp[i - 1][j - 1].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][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 + 1].getBackground() == Color.BLUE) {
counter++;
}
if (jp[i][j].getBackground() == Color.BLUE) {
if (counter <= 1) {
st1[i][j] = false;
} else if (counter > 3) {
st1[i][j] = false;
}
} else {
if (counter == 3) {
st1[i][j] = true;
}
}
}
}
}
/**
* 更新显示图案
*/
public void updata() {
for (int i = 1; i < st1.length - 1; i++) {
for (int j = 1; j < st1[i].length - 1; j++) {
if (st1[i][j]) {
jp[i][j].setBackground(Color.BLUE);
} else {
jp[i][j].setBackground(Color.WHITE);
}
}
}
}
/**
* 主函数 Application
*
* @param args
*/
public static void main(String[] args) {
// 创建游戏对象
LifeGame lg = new LifeGame(80, 80);
// 进行初始化
lg.randomized();
// 更新显示
lg.updata();
while (true) {
// 取得下一代
lg.generation();
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
// 更新显示
lg.updata();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -