LifeGame

LifeGame

用例说明&用例图

用例图

用例名: 设置细胞颜色
说明 用户可以根据自己的喜好来设置细胞的颜色
主事件流 在菜单出点击需要的颜色
游戏检测到菜单的返回的颜色
更改细胞的颜色,最后显示出来(刷新)
异常事件
用例名: 设置方格大小
说明: 用户可以根据自己的喜好来设置方格的大小
主事件流 1.在菜单出点击需要的大小
2.游戏检测到菜单的返回大小
3.更改方格的大小,将窗口的大小改变,刷新
异常事件流
用例名: 设置速度
说明: 用户可以根据自己的喜好来设置算法演变的速度
主事件流 在菜单出点击需要的速度
游戏检测到菜单的返回的速度值
更改算法演变的速度(刷新)
异常事件
用例名: 控制游戏进停
说明: 用户运行或者暂停
主事件流 用户按空格或者点击菜单开关
游戏改变运行状态
暂停或者开始游戏(刷新)
异常事件

lifegame 算法类

设置一个数组,来存放生命;用Initialization()初始化;
刚开始方格内没有生命,所有都设为false

public void Initialization() {//初始化//将rectangle中的值初始化为false
		for(int x = 0;x<HEIGH;x++) {
			for(int y = 0;y<WIDTH;y++) {
				rectangle[x][y] = false;
				neighbors[x][y] = 0;
			}
		}
	}

判断周围的细胞个数

public void getNeighbors() {//看这个世界周围的环境个数
		int x,y;
		for(x= 0;x < HEIGH;x++)
			for(y = 0;y < WIDTH;y++) {
				neighbors[x][y] = 0;
				neighbors[x][y] += Torf(x-1,y-1);
				neighbors[x][y] += Torf(x-1, y);
				neighbors[x][y] += Torf(x-1, y+1);
				neighbors[x][y] += Torf(x, y-1);
				neighbors[x][y] += Torf(x, y+1);
				neighbors[x][y] += Torf(x+1, y-1);
				neighbors[x][y] += Torf(x+1, y);
				neighbors[x][y] += Torf(x+1, y+1);
			}
	}

判断下一个地方是否为墙壁或空,空返回0,非空返回1

public int Torf(int x,int y) {//返回这个值是不是为墙壁或者是空,比较是否为No
		boolean Next = (x<0||y<0||x>=HEIGH||y>=WIDTH||rectangle[x][y]== false);
		return Next?0:1;
	}

通过上一个世界计算下一个世界的细胞(核心算法)

public void nextworld() {
		int x=0,y=0;
			for(x = 0;x<HEIGH;x++)
				for(y = 0;y<WIDTH;y++) {					
					if(neighbors[x][y] == 3) {
						rectangle[x][y] = true;
					}
					else if(neighbors[x][y]<2||neighbors[x][y]>3) {
						rectangle[x][y] = false;
					}
//					neighbors[x][y]=0;
				}
	}
	

lifegame 窗口绘制类

添加一个监听器达到 运行的开始和暂停效果

addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == 32) {
					running = !running;
				}
			}
		});

绘制表格

public void paintComponents(Graphics s) {
		try {
			//super.paintComponents(s);
			s.setColor(Color.red);
			s.drawRect(sx, sy, px*w, py*w);//sx sy 起始位置,rw rw目标大小
			System.out.println("px:py"+px+py);
			for(int i =1;i<px;i++) {
				s.drawLine(sx+(i*w), sy	, sx+(i*w), sy + (py*w));
			}
			for(int j = 1;j<py;j++) {
				s.drawLine(sx, sy+(j*w), sx+(px*w), sy+(j*w));
			}
		}catch(Exception e ) {
				e.printStackTrace();
			}
	
	}

鼠标点击的时候改变细胞的颜色

private void compare(int cx, int cy) {//鼠标点击的颜色
		// TODO 自动生成的方法存根
		lg.rectangle[cx][cy] = !lg.rectangle[cx][cy];
		if(lg.rectangle[cx][cy] == true)
		setGrid(cx,cy,selectcolor);
		else{
			setGrid(cx,cy,backcolor);
		}
	}

为菜单添加监听器 例:细胞蓝色监听器

JMenuItem blue = new JMenuItem("blue");
		blue.addActionListener(new blueActionListener(this));

运行截图

posted @ 2017-12-21 22:31  难过_开心_好_不好  阅读(188)  评论(0编辑  收藏  举报