⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lifegame.java

📁 java编写的小游戏
💻 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 + -