图2-9 mineborder详细类图
(1) 成员变量
Button_Game是Button[][]型,用于创建扫雷区
Map_Bomb是Int[][]型,用于创建扫雷区的地雷分布图
Bomb_I和Bomb_J是Int型,Bomb_I为地雷区有多少行,Bome_J为地雷区有多少列。
mines,Tag_Num,CountTime都是int型,mines用来定义雷数,Tag_Num用来定义flag可用数目,CountTime用来计时
timer是Timer类型,用来定义计时器。
Success是boolean类型,默认为true,用来辅助判断玩家是否获胜的条件,一旦玩家中途失败,则设置为false
(2) 方法
mineborder(Composite, int, int, int, int)是该类的构造函数,带入的Composite是父容器,此处为父Shell,后面的int依次为样式,行数,列数,雷数 reset()用于重新开始游戏。
12
3编码实现
3.1 minesweeper.action包 (1) ImageSource类
package minesweeper.action;
import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; //该类用于初始化各Image,便于图片更改 public class ImageSource {
private Display d;
public Image[] image=new Image[9]; public ImageSource(Display display){
//构造函数,用于初始化0-8,这九
个图片的image
}
//定义各种image,便于其他类调用
public Image mine=new Image(d,\); public Image explosion=new
this.d=display; for(int i=0;i<9;i++)
image[i]=new Image(d,\+i+\);
Image(d,\);
public Image flag=new Image(d,\); public Image wrong=new Image(d,\); public Image digbome=new
Image(d,\);
public Image xiaolian=new
Image(d,\);
public Image app=new Image(d,\); public Image background=new
Image(d,\); }
(2) MouseLeftListener类
package minesweeper.action;
13
import java.io.IOException; import java.util.TimerTask; import minesweeper.swt.*; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*;
//创建左键点击触发的MouseAdapter
public class MouseLeftListener extends MouseAdapter{
private Button [][]Button_Game; private int[][]Map_Bomb; private int Bomb_I,Bomb_J;
private ImageSource imagesource=new ImageSource(mainshell.d);
//构造函数,用于初始化参数,便于后续进行操作
public MouseLeftListener(Button[][]Button_Game,int[][]Map_Bomb,int
Bomb_I,int Bomb_J){
}
//sweep函数,传入(x,y)坐标,翻开该坐标button的内容 public void sweep(int X,int Y){
if(Button_Game[X][Y].getImage()==null){
if(Map_Bomb[X][Y]==9){
//
this.Button_Game=Button_Game; this.Map_Bomb=Map_Bomb; this.Bomb_I=Bomb_I; this.Bomb_J=Bomb_J;
如果选择的是雷
Button_Game[X][Y].setImage(imagesource.mine);
//
设置为雷的图片
} else{
Button_Game[X][Y].setImage(imagesource.image[Map_Bomb[X][Y]]);
//设置成相应数字的图片
}
14
if(Map_Bomb[X][Y]==0) 周围所有 { if(Y-1>=0) {
sweep(X,Y-1);
sweep函数扫雷 if(X+1 sweep(X+1,Y-1); 调用sweep函数扫雷 if(X-1>0) sweep(X-1,Y-1); 调用sweep函数扫雷 } if(X-1>=0) sweep(X-1,Y); sweep函数扫雷 if(X+1 sweep(X+1,Y); sweep函数扫雷 if(Y+1 sweep(X,Y+1); sweep函数扫雷 if(X+1 sweep(X+1,Y+1); 调用sweep函数扫雷 if(X-1>=0) sweep(X-1,Y+1); 调用sweep函数扫雷 } } } } 15 //如果该格子周围什么都没有,挖开 //如果该雷的左边存在,那么对他调用 //如果该雷的左下方存在,那么对他 //如果该雷的左上方存在,那么对他 //如果该雷的上方存在,那么对他调用 //如果该雷的下方存在,那么对他调用 //如果该雷的右边存在,那么对他调用 //如果该雷的右下方存在,那么对他 //如果该雷的右上方存在,那么对他 //创建鼠标左键点击事件函数 public void mouseUp(MouseEvent e) { if(e.button==1){ //判断是否是鼠标左键点击 //获取该点击区域的对象 Object Button_Select=e.getSource(); if(minesweeper.swt.fuzhumianbanComposite.FirstClickFlag){ //如果是第一次点击,启动时钟 minesweeper.swt.fuzhumianbanComposite.FirstClickFlag=false; TimerTask task=new CountT(minesweeper.swt.fuzhumianbanComposite.l2); } for(int i=0;i for(int j=0;j if((Button_Select==Button_Game[i][j])){ //2层for循环 minesweeper.swt.mineborder.timer.schedule(task, 0,1000); 查找选择的按钮的i,j坐标 sweep(i,j); //翻开该坐标 button的内容 //如果点到雷了,弹出diag,你输了,显示全部button内容,方便玩家找 出自己错误,并设置mineborder.success=false; if(Map_Bomb[i][j]==9&&(!Button_Game[i][j].getText().equals(new mineborder.success=false; String(\)))){ Button_Game[i][j].setImage(imagesource.digbome); // 该点错的位置设置为引爆地雷的骷髅图标 minesweeper.swt.mineborder.timer.cancel(); //停止计时 System.out.println(\你失败成绩: \+minesweeper.swt.mineborder.CountTime); //弹出diag对话框 MessageBox failgame=new MessageBox(Button_Game[i][j].getParent().getShell(),SWT.ICON_QUESTION|SWT.YES); failgame.setMessage(\你输了\); 16 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库java课程设计 SWT 扫雷(功能图,类图,类详细说明,测试)(4)在线全文阅读。
相关推荐: