java实现生命游戏(2维元胞自动机)

之前的程序会有严重的画面闪烁问题,现在的版本解决了这个问题。

我在B站上做的视频演示:https://b23.tv/5DBy9C

用java做动态图形界面的话,如果将图形画在jframe上,当刷新频率较高是就会出现这个问题,如果大家要解决这个问题需要将图形画在jpanel上面(jpanel底层解决了这个问题)。

1、规则为经典b2/s23规则

   方块有颜色代表细胞存活,没有颜色代表细胞死亡

  • 少于2个邻居的点,在下一回合死去。模拟生命较少的情况。
  • 在周围邻居数量是2和3时,下一回合保持不变
  • 在周围邻居数量大于3时,下一回合死去,模拟生命拥挤的情况。
  • 当一个空白的点,周围的邻居数量是3个是, 下一回合将会产生一个新的点。模拟繁殖

2、实现建议鼠标缩放

3、实现rule初始坐标信息导入

4、内置3种模型   星门  高斯帕  振荡器

高斯帕滑翔机枪

星门

振荡器集合

导入功能


下面是实现的主要代码

package com.lzl.frame;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Myjpan extends JPanel {
	//初始方格长度
	volatile int buchang = 10;
	
	volatile boolean b = false;
	//记录窗口大小变化后上一次的窗口大小,窗体大小变化后重新排列
	volatile int w1;
	volatile int h1;
	//储存活细胞坐标的集合
	volatile List<ZuoBiao> list = new ArrayList<ZuoBiao>();
	//储存死亡的活细胞集合
	volatile List<ZuoBiao> list2 = new ArrayList<ZuoBiao>();
	//rule坐标信息读取后先存放在这里
	volatile List<ZuoBiao> list3 = new ArrayList<ZuoBiao>();
	//左右下内边距
	int xx = 0;
	//上边距
	int yy = 0;
	//数组大小与方格数相同  记录细胞状态  活为1 死为0
	volatile int[][] a;
	//每过多少毫秒演化一次
	volatile int sudu = 1000;
	volatile boolean r1 = false;
	volatile String rule = "";

	
	
	JButton jb = new JButton();
	JButton jb3 = new JButton("加快");
	JButton jb2 = new JButton("自动");
	JButton jb4 = new JButton("随机");
	JButton jb5 = new JButton("初始化");
	JButton jb6 = new JButton("导入");
	JFrame jFrame = new JFrame();
	//下拉框
	JComboBox<String> jc = new JComboBox<>(new String[] { "无", "星门", "震荡循环集合", "高斯帕滑翔机" });

	public Myjpan() {
		
		jFrame.setBounds(300, 300, 600, 520);
		jFrame.add(this);
		
		w1 = jFrame.getWidth();
		h1 = jFrame.getHeight();
		//设置窗口关闭
		jFrame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			};

		});
		jFrame.setVisible(true);
		jFrame.setLayout(null);
		//添加窗口监听
		jFrame.addComponentListener(new ComponentListener() {

			@Override
			public void componentShown(ComponentEvent e) {
				// TODO Auto-generated method stub

			}
			//窗口发生该变时调用
			@Override
			public void componentResized(ComponentEvent e) {
				// TODO Auto-generated method stub
				//判断窗口变大变小
				if (w1 < e.getComponent().getWidth() || h1 < e.getComponent().getHeight()) {
					//计算出变化后的网格长宽
					int whi = e.getComponent().getWidth() - xx * 2;
					int hei = (e.getComponent().getHeight() - xx - yy);
					//计算变化后的网格数
					whi = (whi - whi % buchang) / buchang;
					hei = (hei - hei % buchang) / buchang;
					//简历对应新窗体大小的数组
					int[][] b = new int[whi][hei];
					//初始化数组
					initArray(b);
					
					for (int i = 0; i < list.size(); i++) {
						//将活细胞坐标设置为适应新窗体大小的坐标,并设置该位置的状态
						ZuoBiao z = list.get(i);
						z.setX(z.getX() + whi / 2 - a.length);
						z.setY(z.getY() + hei / 2 - a[0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值