Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构

在学习大学JAVA课程的时候,对面向对象GUI非常感兴趣。

有一天,在图书馆借的一本JAVA书上看到了关于生命游戏这个计算机游戏的介绍,感觉这个零玩家游戏很有意思。在这里给大家简要介绍一下啥是生命游戏。(以下介绍摘自百度百科)

 

生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。实际中,你可以设定周围活细胞的数目怎样时才适宜该细胞的生存。如果这个数目设定过低,世界中的大部分细胞会因为找不到太多的活的邻居而死去,直到整个世界都没有生命;如果这个数目设定过高,世界中又会被生命充满而没有什么变化。实际中,这个数目一般选取2或者3;这样整个生命世界才不至于太过荒凉或拥挤,而是一种动态的平衡。这样的话,游戏的规则就是:当一个方格周围有2或3个活细胞时,方格中的活细胞在下一个时刻继续存活;即使这个时刻方格中没有活细胞,在下一个时刻也会“诞生”活细胞。在这个游戏中,还可以设定一些更加复杂的规则,例如当前方格的状况不仅由父一代决定,而且还考虑祖父一代的情况。你还可以作为这个世界的上帝,随意设定某个方格细胞的死活,以观察对世界的影响。

在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。

这个游戏被许多计算机程序实现了。Unix世界中的许多Hacker喜欢玩这个游戏,他们用字符代表一个细胞,在一个计算机屏幕上进行演化。著名的GNUEmacs编辑器中就包括这样一个小游戏。

 

但美中不足的是这本书上给的参考代码,操作实在有些复杂

 

Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第1张图片Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第2张图片

 

活细胞需要一个一个输入,而且只有10*10的棋盘大小,这就非常讨厌了,当时又很好奇这个细胞组成的分布到底会怎样变化,要是可以有个面向对象的程序,通过鼠标点击就可以把死细胞变成活细胞就好了。于是就有了用GUI设计这个小游戏的想法。

用了一个星期的课余时间,边写代码边学习,一开始其实连事件监听都不太熟练,通过不断的搜索学习,完成了最初的产品

Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第3张图片

当时就想找地方分享一下,于是就把它发表到了 最代码 上面。发表成功后还特地发了个QQ空间庆祝一下。

Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第4张图片

Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第5张图片

短暂的开心之后,也发现了很多问题

1、棋盘大小依然是10*10,用户不能自行决定棋盘大小

2、棋盘大了的话,每个框框里面的圆圈会让密集恐惧症的人头皮发麻

3、可玩性太差,点了几个细胞之后就没兴趣玩下去了

4、缺乏帮助按钮,用户刚拿到了不知道怎么玩

然后的几天,就是在不断想办法怎么把它再完善一点。中间遇到过不少问题,不过最终都还是解决了

Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第6张图片日常。。。

然后最终滴成品是这样的,特地加了一些经典的生命结构细胞结构预设,以增加可玩性

Java swing 写的 生命游戏 小游戏,预设了 滑翔机 飞船等经典结构_第7张图片

但是还是存在一些问题:

1、通过点击可以将死细胞变成活细胞,但是如果点错了,就要重新点。如果可以通过点击将活细胞变成死细胞就更好了

2、预设的几个东西在棋盘的位置是固定的,如果用户能通过鼠标操作把它们放在棋盘的各个位置就更好了(比如让两个不同方向的滑翔机对撞)

3、用户没办法保存自己发现的活细胞形状,如果能添加个功能把目前的棋盘保存为预设就更好了

但这些东西以目前的我的能力还没办法解决,不是我不想去学习解决,只是在通过写这个小游戏的过程中,我发现自己所欠缺的能力还是太多了。

这个按钮的背景颜色怎么设置,不会,百度一下

怎么消除按钮之间的间距,不会,百度一下

这个事件监听怎么做,不会,百度一下

……

这样学习的方法,虽然见效很快,但是还是缺乏系统的知识体系。所以我打算从头开始学习巩固Java的知识,等到我有足够的知识储备后,再重新回头看这个初出茅庐的小游戏,这些问题就能迎刃而解了。

通过这906行的代码,我体会到了java的乐趣,发现自己学习Java的热情,也发现了自己很多的不足,Java的世界还很大,还需要继续的学习。

期待学成归来更新这篇博客的那一天。

最后分享一下这个小游戏吧

http://www.zuidaima.com/share/3958389148666880.htm

或者懒得注册的朋友们加下我的QQ:981387728

才发现CSDN可以直接放代码...:

package 生命游戏;

import java.awt.BorderLayout;

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;




public class 生命游戏002 extends JFrame implements ActionListener{
	private Container contentPane;
	private JButton btn1;
	private JButton btn2;
	private JButton btn3;
	private JLabel label1;
	private int row=15;
	private int col=15;
	private int [][]a;
	private JPanel p,p1,p2,p3,p4;
	private int num=0;
	private JButton[][] btns;
	private int number[][];
	
	
	
	public 生命游戏002(String title){
		super(title);
		setLocation(100,50);
	    contentPane = getContentPane();
        setSize(277,397);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		a=new int[row+2][col+2];
		number=new int[row+2][col+2];
		initGUI();
		
	}
	public void initGUI(){
	     p4=new JPanel();
			JMenuBar menuBar=new JMenuBar();
			JMenu menu1=new JMenu("游戏");
			JMenu menu2=new JMenu("预设");
			JMenuItem mi1=new JMenuItem("15*15");
			JMenuItem mi2 = new JMenuItem("50*20");
			JMenuItem mi3 =new JMenuItem("100*50");
			JMenuItem mj1=new JMenuItem("滑翔机");
			JMenuItem mj11=new JMenuItem("轻型飞船");
			JMenuItem mj12=new JMenuItem("中型飞船");
			JMenuItem mj13=new JMenuItem("重型飞船");
			JMenuItem mj2=new JMenuItem("烟花");
			JMenuItem mj6=new JMenuItem("凤凰1号");
			JMenuItem mj5=new JMenuItem("十五步");
			JMenuItem mj3=new JMenuItem("蝴蝶");
			JMenuItem mj51=new JMenuItem("60P5H2V0飞船");
			JMenuItem mj4=new JMenuItem("滑翔机枪");
			
			mi1.addActionListener(this);
			menu1.add(mi1);
			mi2.addActionListener(this);
			menu1.add(mi2);
			mi3.addActionListener(this);
			menu1.add(mi3);
			mj1.addActionListener(this);
			menu2.add(mj1);
			mj11.addActionListener(this);
			menu2.add(mj11);
			mj12.addActionListener(this);
			menu2.add(mj12);
			mj13.addActionListener(this);
			menu2.add(mj13);
			mj2.addActionListener(this);
			menu2.add(mj2);
			mj6.addActionListener(this);
			menu2.add(mj6);
			mj5.addActionListener(this);
			menu2.add(mj5);
			mj3.addActionListener(this);
			menu2.add(mj3);
			mj51.addActionListener(this);
			menu2.add(mj51);
			mj4.addActionListener(this);
			menu2.add(mj4);
			menuBar.add(menu1);
			menuBar.add(menu2);
			p4.add(menuBar);
	  p1=new JPanel();

		btn1=new JButton("点我不要停");
		btn1.addActionListener(this);
		btn2=new JButton("重来");
		btn2.addActionListener(this);
		btn3=new JButton("帮助");
		btn3.addActionListener(this);
		label1=new JLabel("目前共有"+num+"个活细胞");
		btns=new JButton[row][col];
		p1.add(btn3);
		p1.add(btn1);
		p1.add(btn2);
		p3=new JPanel();
		p3.add(label1);
		p=new JPanel();
		p.setLayout(new BorderLayout());
		contentPane.add(p);
		p.add(p4,BorderLayout.NORTH);
		p.add(p1,BorderLayout.CENTER);
		p.add(p3,BorderLayout.SOUTH);
	  p2=new JPanel();
	    p2.setLayout(new GridLayout(row,col,0,0));
	    for(int i=0;i=row||y<0||y>=col){continue;}
		              			if(a[z][y]==1)
		            			number[i][j]++;
		            		}
		            	}
		            	//如果自身是活细胞的话,number需要-1
		            	if(a[i][j]==1)
		            		number[i][j]--;
		            }
		        }
						//周围活细胞的个数在上下限内,则变为活细胞,否则变成死细胞
		               	for(int i=0;i

 

你可能感兴趣的:(心路历程)