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));