首页 > 编程语言 >基于JAVA的康威生命游戏二次开发

基于JAVA的康威生命游戏二次开发

时间:2024-03-05 16:23:23浏览次数:27  
标签:JAVA 康威 int cols 细胞 LifeGame 方格子 二次开发 public

引言:

       康威生命游戏(Conway's Game of Life)是一种基于细胞自动机的零玩家游戏,由数学家约翰·康威(John Conway)于1970年创建。这个游戏并不是传统意义上的游戏,而是一种模拟生命演变的规则系统。康威生命游戏的“宇宙”是一个由无限的二维网格组成的平面,每个格子被称为一个“细胞”。每个细胞可以处于两种状态:存活或死亡。这些细胞根据一组简单的规则演变。

规则如下:

  1. 活细胞周围有2或3个活细胞时,它在下一代保持活跃。
  2. 活细胞周围有少于2个活细胞时,它在下一代死亡(因为孤立)。
  3. 活细胞周围有超过3个活细胞时,它在下一代死亡(因为过度拥挤)。
  4. 死细胞周围有3个活细胞时,它在下一代复活。
       这些简单的规则导致了复杂的模式和演变,有时候出现周期性、稳定的图案,有时候则呈现出随机性和混沌。康威生命游戏被广泛用于计算机科学和数学中,作为细胞自动机的经典示例,同时也因其简洁的规则而受到人们的喜爱。

代码概览

LifeGame.java
//创建一个类,继承自JFrame,表示窗口
public class LifeGame extends JFrame {

//定义方格子世界的行数和列数
	private static final int rows = 200;
	private static final int cols = 200;

//定义方格子世界的二维数组
	private int[][] world = new int[rows][cols];

//定义每个方格子的大小
	private static final int cellSize = 4;

//定义窗口的宽度和高度
	private static final int width = cols * cellSize;
	private static final int height = rows * cellSize;

//创建一个构造方法,初始化窗口和方格子世界
	public LifeGame() {
		// 调用父类的构造方法,设置窗口的标题
		super("生命游戏");

		// 设置窗口的大小和位置
		setSize(width, height);
		setLocationRelativeTo(null);

		// 设置窗口关闭时退出程序
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// 设置窗口不可调整大小
		setResizable(false);

		// 初始化方格子世界,随机给每个细胞赋值0或1
		Random random = new Random();
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				world[i][j] = random.nextInt(2);
			}
		}

		// 创建一个画布对象,用来绘制方格子世界
		Canvas canvas = new Canvas();

		// 将画布添加到窗口中,并使之可见
		add(canvas);
		setVisible(true);

		// 创建一个定时器对象,用来定时更新方格子世界并重绘画布
		Timer timer = new Timer(100, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 每隔100毫秒,调用update方法更新方格子世界,并重绘画布
				update();
				canvas.repaint();
			}
		});

		// 启动定时器
		timer.start();

	}
	
	

	// 定义一个方法,根据当前状态更新下一时刻的状态

	public void update() {
		// 创建一个新的二维数组,用来存储下一时刻的状态
		int[][] nextWorld = new int[rows][cols];

		// 遍历每个细胞,根据规则计算下一时刻的状态

		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				// 获取当前细胞的状态和周围八个细胞的存活数
				int state = world[i][j];
				int liveNeighbors = countLiveNeighbors(i, j);

				// 根据规则更新下一时刻的状态
				if (state == 0 && liveNeighbors == 3) {
					nextWorld[i][j] = 1;
				} else if (state == 1 && (liveNeighbors == 2 || liveNeighbors == 3)) {
					nextWorld[i][j] = 1;
				} else {
					nextWorld[i][j] = 0;
				}
			}
		}
		// 将新的二维数组赋值给原来的二维数组,完成更新
		world = nextWorld;
	}

	// 定义一个方法,计算某个细胞周围八个细胞的存活数
	public int countLiveNeighbors(int row, int col) {
		// 定义一个变量,用来记录存活数
		int liveCount = 0;

		// 遍历周围八个细胞,如果是存活状态,就增加存活数
		for (int i = row - 1; i <= row + 1; i++) {
			for (int j = col - 1; j <= col + 1; j++) {
				// 跳过自身和越界的情况
				if (i == row && j == col)
					continue;
				if (i < 0 || i >= rows || j < 0 || j >= cols)
					continue;

				// 获取周围细胞的状态
				int state = world[i][j];

				// 如果是存活状态,就增加存活数
				if (state == 1) {
					liveCount++;
				}
			}
		}

		// 返回存活数
		return liveCount;
	}

	// 创建一个内部类,继承自Jpanel,表示画布
	class Canvas extends JPanel {

		// 重写paint方法,在画布上绘制方格子世界的每个细胞
		@Override
		public void paint(Graphics g) {
			super.paint(g);

			// 遍历每个细胞,根据状态设置颜色,并填充矩形
			for (int i = 0; i < rows; i++) {
				for (int j = 0; j < cols; j++) {
					// 获取当前细胞的状态
					int state = world[i][j];

					// 根据状态设置颜色,死亡为白色,存活为黑色
					if (state == 0) {
						g.setColor(Color.WHITE);
					} else {
						g.setColor(Color.BLACK);
					}

					// 计算当前细胞在画布上的位置和大小,并填充矩形
					int x = j * cellSize;
					int y = i * cellSize;
					g.fillRect(x, y, cellSize, cellSize);
				}
			}

			// 在画布上画出方格子的边框线,颜色为灰色
			g.setColor(Color.GRAY);
			for (int i = 0; i <= rows; i++) {
				int y = i * cellSize;
				g.drawLine(0, y, width, y);
			}
			for (int j = 0; j <= cols; j++) {
				int x = j * cellSize;
				g.drawLine(x, 0, x, height);
			}
		}
	}
}
LifeGame_main.java
public class LifeGame_main {
	  public static void main(String[] args) {
		  LifeGame t1=new LifeGame();
		  System.out.print("结束");
	    }
}

主要构成部分

1. 窗口:LifeGame类,继承自JFrame,负责展示游戏底层的方格字世界
2. 画布:LifeGame类的子类,继承自JPanel,负责根据计算结果为方格填色,以展示游戏的内容
3. 方格:在LifeGame类中以二维数组的形式存储,根据游戏规则

游戏演示

![](/i/l/?n=24&i=blog/3397826/202403/3397826-20240305161900686-1869174034.png)

源代码缺陷

1. 游戏更新时间过快,用户可能无法跟上方块的变化
2. 部分注释错误

二次开发

1. 减缓了画布的更新时间
2. 修改了部分注释,使程序更易懂

标签:JAVA,康威,int,cols,细胞,LifeGame,方格子,二次开发,public
From: https://www.cnblogs.com/fenqiii/p/18054131

相关文章

  • linux下的java部署
    jar命令简介java部署jar包可以使用java-jar命令,比如:java-jardemo.jar执行上述命令后,JAR包中的程序将在Linux系统中运行。注:在运行JAR包之前,确保你的JAR文件是可执行的,并且包含了正确的类和依赖项。如果JAR包依赖于其他库或配置文件,确保它们也在正确的位置可用。......
  • Java数组
    Java数组数组是一种容器,可以用来存储同种类型的多个值。数组的定义两种形式int[]arrayintarray[]数组的初始化在内存中为数组开辟空间,并将数据存入容器的过程。静态初始化//完整格式int[]array=newint[]{11,22,33};//简化格式int[]array={11,22,33};......
  • Java学习笔记——第六天
    案例练习案例一:买飞机票需求用户购买机票时,机票原价会按照是淡季还是旺季,是头等舱还是经济舱的情况进行相应的优惠,优惠方案如下:5-10月为旺季,头等舱9折,经济舱8.5折;11月到来年4月为淡季,头等舱7折,经济舱6.5折,请开发程序计算出用户当前机票的优惠价。分析方法是否需要接收数据?......
  • JAVA项目 贪吃蛇游戏二次开发
    基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。原代码地址:https://gitee.com/jay_musu/games-and-tools.gitpackagecom.snake.view;importjava.awt.Color;importjava.awt.EventQueue;importjava.awt.Font;importjava.awt......
  • java 异常初识
    什么是异常◆实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等◆软件程序在运行过程中,非......
  • JAVA基础--JavaDos生成文档
    JavaDos生成文档法一:通过命令行生成信息输入(例子)/***@authorAAA*@version1.0*@since1.8*/publicclassDos{Stringname;/***@authorAAA*@paramname*@return*@throwsException*///方法前输入/**则会自......
  • javaweb04-maven&web入门
    maven依赖管理:管理项目依赖的jar包,避免版本冲突统一项目结构:提供标准统一的项目结构标准的项目构建:标准跨平台的自动化项目构建方式maven坐标groupid:定义当前项目隶属组织名称artifactid:定义当前项目名称version:定义当前项目版本号依赖依赖传递排除依赖<exclusion>......
  • javaweb03-前端工程
    Ajax异步的Javascript和XML数据交换异步交互:在不重载页面的情况下,与服务器交换数据并更新部分网页Axios入门前后端分离开发需求分析->接口定义->前后端并行开发->测试->前后端联调开发YAPI接口管理平台前端工程化规范化、标准化前端开发环境准备vue-cli脚手架Vu......
  • JAVA基础--包机制
    JAVA包机制(使用IntellijIDEA)语法格式注意:该语句位于第一行,不可删除或改变位置packagepkg1[.pag2[.pag3...]];packagecom.baidu.www;命名规则一般利用公司域名倒置作为包名例如:www.baidu.com,包名写为:com.baidu.www导入包为了能够使用某一包内的成员,需要在Java程序中明......
  • JAVA学习笔记--运算符
    运算符注意:()的优先级最高,因此可以多打一些()提高代码的可读性!!算术运算符:+、-、*、/、%(模:取余)、++(自增)、--(自减)publicclassDemo1{publicstaticvoidmain(String[]args){inta=10;intb=20;System.out.println(a+b);......