扫雷项目总结

时间:2024.4.13

扫雷项目总结

语言选择

我们选择了Java作为编程语言,理由如下:Java语言适用于开发窗体和简单的动画效果;因为学过C++,所以Java学起来比较容易;学习Java语言可以为以后在Android平台上开发APP打基础;Java的可移植性比较强。

项目选择

扫雷是一个经典的小游戏,自从19xx年发布了windows3.1之后便风靡全球,成为每个操作系统都必备的游戏。考虑到剩余时间和项目大小,我们便选择了扫雷这个经典的windows游戏作为开发目标,目的便是重现经典扫雷的界面和玩法,并通过扫雷来检验一下学习的Java的成果,熟悉Java语言的具有可视界面项目开发。

扫雷游戏基本玩法

游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。

游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:

左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。

右键单击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复一次或两次操作可取消标记(如果在游戏菜单中勾选了“标记(?)”,则需要两次操作来取消标雷)。 双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使

用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“ ×”。(摘自百度百科)

项目核心

我们从零做起,重载了Java的java.swing.JFrame类用来做界面,并重载了java.swing.JButton类来做按钮。因为界面和win的扫雷很相似所以无需过多的描述。有一点不同是我们为了照顾新手加入了新的内容,就是在不易判断是不是地雷的时候使用菜单里的提示并点击一个没有点过的按钮可以自动把旗子标上,这是一个很像作弊的设定所以我们在一局中只能使用三次。并且每用一次时间就会加30秒。

首先我们来看一些重要的算法。第一便是生成雷,怎样生成指定的地雷数呢?我们经过考虑和实践,决定声明一个重载按钮类的二维数组,用Random函数随机生成数字来指定地雷。用一个循环语句来确定地雷分布。因为有可能随机到一个相同的按钮,所以我们用了一个递归来解决重复问题。

第二便是解决获得格子周围雷数的算法。我们在按钮类里加入了一个整数值,在生成雷的时候把这个整数值设为-1,然后再用循环遍历了不是雷的方格。将数字记录下来,根据数字来决定怎么显示点击后的图片。

第三就是按钮类的实现了。我们需要在进行游戏时对按钮左击,右击和同时点击的事件设计不同的监听器并对其响应,还有新加入的辅助功能。因为事件颇多,所以在这方面下了很多功夫,调试出了很多bug,比如有一个bug就是我们运行程序的时候竟然没有绘出方格,原因是没有把引用类型的变量实例化,这也是常见的错误,估计很多C++学过的人都会犯这种错。还有就是在判断是否点击过我们发生了分歧,一个想法是新加入一个boolean类型的成员变量visted,另一个是直接使用之前用来记录周围地雷数的int变量。两种方法各有优劣,为了简单方便并且直观地编程,我们最后选择了boolean类型的visited。

项目难点

项目过程中有一个非常困扰我们的事,就是怎么实现按钮只能按一次的效果。经过讨论,我们决定把指针正常,按下和悬浮的Icon都设置了为点击过的,这样就形成了一种没办法再点的错觉。同时我们当然也把事件的原监听器移除了,改成了笑脸的变化,这样一来就出现了无法点击的效果,但其实那是可以点击的。其中还有一个大麻烦就是设置旗子之后按钮还是可以触发地雷,我们最后决定把上述思路也做了调整,把右键点击的监听器也做了修改。

所以,总的来说,这个项目最大的难度就在于一堆Button的属性应该怎么改变还有监

听器应该如何设置和工作。虽然做界面什么的我们完全是照搬经典windows扫雷的,但是我们也有创新点,就是刚打开游戏的时候就选择了是什么难度,尽管有时候觉得麻烦,但是这对不想到菜单里找难度的人来说还是方便了一些。

最终总结

我们虽然没有接触过Java但是经过了不懈的努力和网上查阅大量的资料也算是做出来了个还算差不多的项目,也许这个项目没有什么创新点,也许很多人都会觉得太过简单,但是我们却做得不太容易,这虽然是一个简单的项目但是很有实践意义。我们的主要目的就是去熟悉Java和创造用户界面,这些经验都是很宝贵的。

20xx年9月


第二篇:扫雷


JAVA程序论文

论文题目:Java扫雷编写程序

专 业: 通信工程

姓 名: 夏传虎

学 号:

指导老师: 完成时间:

一、设计目的

图形界面设计,熟悉Java.awt.*包中组件,掌握图形界面设计方法,了解并深刻理解AWT窗口,事件处理,及菜单、菜单栏与滚动条的应用。通过设计同时也检测自己对着门课的掌握情况,有助于及时查漏补缺。

二、设计环境

1. 软件环境:JAVA

2. 硬件环境:微型计算机

三、需求分析

3.1 扫雷棋盘的布局设计

系统的整体布局为:CardLayout布局, 采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出, 按钮的功能是重新开始新的游戏。

3.2 雷区的设计

MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如图2-1所示。

扫雷

图2-1 MineArea类的UML图

以下是UML图中有关数据和方法的详细说明。

1、成员变量

(1)block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。

(2)blockView是BlockView类型的数组,负责为block数组中的Block对象提供视图。

(3)lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不

是雷。

(4)record负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有扫雷成功后(用时最少),才可以看见对话框。

(5)reStart是一个按钮对象,用户单击它重新开始游戏。

(6)time是计时器对象,负责计算用户的用时。

2、方法

(1)initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度、高度、雷的数目以及雷区的级别。

(2)actionPerformed(ActionEvent)是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。

(3)show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。

(4)mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。

(5)inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的累而且用时最少。

四、总体流程图

扫雷

五、设计程序

import java.awt.*; import javax.swing.*; import java.util.Random; import java.awt.event.*;

class Min extends JPanel //雷的类 {

//备注:鼠标的左键 = 1;右键 = 3;中键 = 2

private int flag = 0,statu = 0; //定义雷的属性 0:没有打开 1:打开 2:标示为雷 3:不确定

//flag = 0 不是雷 ; flag = 1是雷

private int but,count = 0; //but:哪一个鼠标键被按下去了 count:这个区域周围有多少个雷

private int mx = 0,my = 0,mw = 10; //定义雷的坐标和宽度

public Min() //构造函数

{

statu = 0;

}

public Min(int f,int x,int y,int w)

//构造函数

{

flag = f;

mx = x;

my = y;

mw = w;

}

public int getFlag(){return flag;}

public int getStatu(){return statu;}

public int getMx(){return mx;}

public int getMy(){return my;}

public int getMw(){return mw;}

public int getCount(){return count;}

public void setFlag(int f){flag = f;}

public void setCount(int c){count = c;}

public void setData(int f,int x,int y,int w,int s)

//传递值

{

flag = f;

mx = (x-1)*w;

my = (y-1)*w;

mw = w-1;

statu = s;

}

//根据你点击鼠标的不同来改变雷的属性 public int sendKey(int key) {

//返回值,如果游戏结束则返回-1 int rtn = 1;

if(key == 3)

{

switch(statu)

{

case 1:

break;

case 2:

statu = 3;

break;

case 3:

statu = 0;

break;

case 0:

statu = 2;

break;

}

rtn = 1;

}

if(key == 1 && statu == 0)

{

switch(flag)

{

case 0:

statu = 1;

rtn = 2;

break;

case 1:

statu = 1;

rtn = -1;

break;

}

}

return rtn;

}

}

class DrawPanel extends JPanel

{

private int i,j;

private int f = 0; //if f = 1 then game over ,if f =2 then win private int chx = 0,chy = 0; //专门记录坐标x,y的值

private int msum = 6,ksum = 0; //msum:雷的个数,ksum:标示雷的个数 private int bx = 10,by = 10,bw = 40; //bx,by:棋盘的大小,bw:棋子的大小

public Min board[][] = {

{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new

Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()},

{new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new

Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, {new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min(),new Min()}, };

// 画坐标为ax,ay区域的雷的状态

public void draw(Graphics g,int ax,int ay)

{

int x,y,w; // 坐标x,y;和宽度:w

int s,c,flag; //状态;雷的个数;

int cx = bw/2 - 4;

int cy = bw/2 + 4;

x = board[ax][ay].getMx();

y = board[ax][ay].getMy();

w = board[ax][ay].getMw();

s = board[ax][ay].getStatu();

c = board[ax][ay].getCount();

flag= board[ax][ay].getFlag();

switch(s)

{

case 0: //没有打开状态

{

g.setColor(Color.black);

g.fillRect(x,y,w,w);

break;

}

case 1: //打开状态

{

g.setColor(Color.blue);

g.fillRect(x,y,w,w);

if(c != 0 && flag == 0) //此处没有雷

{

g.setColor(Color.red);

g.drawString(String.valueOf(c),x + cx,y + cy); }

if(flag == 1) //此处有雷

{

g.setColor(Color.red);

g.fillRect(x,y,w,w);

g.setColor(Color.blue);

g.drawString(" 雷",x + cx,y + cy);

}

break;

}

case 2: //标雷状态

{

g.setColor(Color.green);

g.fillRect(x,y,w,w);

g.setColor(Color.blue);

g.drawString(" 旗",x + cx,y + cy);

break;

}

case 3: //不确定状态

{

g.setColor(Color.black);

g.fillRect(x,y,w,w);

g.setColor(Color.red);

g.drawString("?",x + cx,y + cy);

break;

}

default:

break;

}

}

// 没有图形器的绘图函数:画出坐标ax,ay的雷的状态和图形 public void draw(int ax,int ay)

{

Graphics g;

g = this.getGraphics();

draw(g,ax,ay);

}

//打开周围没有雷的地方,并且绘画所在区域点击左键触发

public int openNoMin(int ax,int ay)

{

int i,j;

if(ax<1||ay<1||ax>bx||ay>by) return 0; //鼠标点击的区域出界了

if(board[ax][ay].getStatu() != 0) return 0; //如果此区域打开了,返回

board[ax][ay].sendKey(1); //如果返回值等于-1,就说明游戏结束 draw(ax,ay);

if(board[ax][ay].getFlag() == 1)

//如果游戏结束,把所有的雷都显示出来

{

for(i = 1;i<=bx;i++)

{

for(j = 1;j <= by;j++)

{

if(board[i][j].getFlag() == 1)

{

board[i][j].sendKey(1);

draw(i,j);

}

}

}

return -1;

}

//如果游戏没有结束

if(board[ax][ay].getCount() > 0)

{

ksum ++;

return 1; //周围有雷,就不用打开周围地区

}

if(board[ax][ay].getCount() == 0 && board[ax][ay].getFlag() == 0) //周围没有雷,打开周围地区,直到有雷的地区

{

openNoMin(ax-1,ay-1);openNoMin(ax,ay-1);openNoMin(ax+1,ay-1); openNoMin(ax-1,ay ); openNoMin(ax+1,ay );

openNoMin(ax-1,ay+1);openNoMin(ax,ay+1);openNoMin(ax+1,ay+1); }

ksum ++;

return 1;

}

//计算坐标x,y的周围雷的个数

public int getCount(int ai,int aj)

{

int sum = 0;

if(board[ai][aj].getFlag() == 1)

{

return sum;

}

if(ai>1&&aj>1&&ai<bx&&aj<by)

{

sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+

board[ai+1][aj-1].getFlag()+

board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+ board[ai-1][aj+1].getFlag()+

board[ai+1][aj+1].getFlag();

}

if(ai==1&&aj==1)

{

sum = board[ai+1][aj ].getFlag()+

board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag(); }

if(ai==1&&aj==by)

{

sum = board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+ board[ai+1][aj ].getFlag();

}

if(ai==bx&&aj==1)

{

sum = board[ai-1][aj ].getFlag()+

board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag(); }

if(ai==bx&&aj==by)

{

sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai-1][aj ].getFlag();

}

if(ai==1&&aj>1&&aj<by)

{

sum = board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+ board[ai+1][aj ].getFlag()+

board[ai][aj+1].getFlag()+ board[ai+1][aj+1].getFlag(); board[ai][aj+1].getFlag()+

}

if(ai==bx&&aj>1&&aj<by)

{

sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+

board[ai-1][aj ].getFlag()+

board[ai-1][aj+1].getFlag()+ board[ai][aj+1].getFlag();

}

if(ai>1&&ai<bx&&aj==1)

{

sum = board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+

board[ai-1][aj+1].getFlag()+

board[ai+1][aj+1].getFlag();

}

if(ai>1&&ai<bx&&aj==by)

{

sum = board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+

board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag(); }

return sum;

}

// 传入参数:几列,几行,宽度,雷数

public void initMin(int ax,int ay,int aw,int as)

{

int k = 1; //表明产生的第几个雷

Random r; //随机数

f = 0; //f=0表示游戏还没有结束 board[ai][aj+1].getFlag()+

ksum = 0;

bx = ax;

by = ay;

bw = aw;

msum = as;

r = new Random();

//初始化底盘的值

for(i = 1;i <= bx;i++)

{

for(j=1;j<=by;j++)

{

board[i][j].setData(0,i,j,bw,0); }

}

// 随机产生雷

while(k <= msum)

{

i = r.nextInt(bx)+1;

j = r.nextInt(by)+1;

if(board[i][j].getFlag() != 1) {

board[i][j].setFlag(1);

k++;

}

}

// 非雷区的周围有几个雷,初始化其值 for(i = 1;i <= bx;i++)

{

for(j=1;j<=by;j++)

{

board[i][j].setCount(getCount(i,j));

}

}

setBackground(Color.white);

repaint();

}

// 构造函数

public DrawPanel(int ax,int ay,int aw,int as) {

initMin(ax,ay,aw,as);

addMouseListener(new MouseAdapter()

{

public void mousePressed(MouseEvent me)

{

int r;

if(f != 0) return; //如果游戏结束,返回

chx = me.getX();

chy = me.getY();

if(me.getButton() != 1)

{

board[chx/bw+1][chy/bw+1].sendKey(me.getButton()); draw(chx/bw+1,chy/bw+1);

}

else if(me.getButton() == 1)

{

if(openNoMin(chx/bw+1,chy/bw+1) == -1)

{

f = 1;

repaint();

}

else if ( ksum + msum == bx*by ) {

f = 2;

repaint();

}

}

}

}

);

}

// 重画所有的图形,包括一些修饰的图形 public void paint(Graphics g) {

int x,y,w;

int s;

int cx = bw/2 - 4;

int cy = bw/2 + 4;

g.clearRect(0,0,600,600);

for(i=1;i<=bx;i++)

{

for(j=1;j<=by;j++)

{

draw(g,i,j);

}

}

if(f == 1)

{

Font f = new Font("11",1,70);

Font fo = g.getFont();

g.setColor(Color.white);

g.setFont(f);

//g.setSize();

g.drawString("Game Over",0,200);

g.setFont(fo);

}

if( f == 2 )

{

Font f = new Font("11",1,70);

Font fo = g.getFont();

g.setColor(Color.white);

g.setFont(f);

//g.setSize();

g.drawString("You win!",0,200);

g.setFont(fo);

}

}

};

// 主类和程序的入口

public class da extends JFrame implements ActionListener {

Container cp = getContentPane();

JButton bt = new JButton("开局");

Label l1 = new Label("列:");

Label l2 = new Label("行:");

Label l3 = new Label("宽度:");

Label l4 = new Label("雷的个数:");

TextField tf1 = new TextField("10",2); //列

TextField tf2 = new TextField("10",2); //行 TextField tf3 = new TextField("40",2); //宽度

TextField tf4 = new TextField("15",2); //雷的个数 int x=10,y=10,w=40,sum=15;

DrawPanel dp = new DrawPanel(x,y,w,sum);

public da()

{

setBackground(Color.white);

cp.setLayout(null);

cp.add(dp);

cp.add(bt);

cp.add(tf1);

cp.add(tf2);

cp.add(tf3);

cp.add(tf4);

cp.add(l1);

cp.add(l2);

cp.add(l3);

cp.add(l4);

l1.setBounds(20 ,10,20,20);

tf1.setBounds(40,10,20,20);

l2.setBounds(70,10,20,20);

tf2.setBounds(90,10,20,20);

l3.setBounds(120,10,40,20);

tf3.setBounds(160,10,20,20);

l4.setBounds(190,10,60,20);

tf4.setBounds(250,10,20,20);

bt.setBounds(300,10,80,20);

dp.setBounds(20,40,x*w,y*w);

setResizable(false);

setSize(x*w+40,y*w+80);

setTitle(" 扫雷");

show();

bt.addActionListener(this);

addWindowListener(new WindowAdapter()

{ public void windowClosing(WindowEvent e) {System.exit(0);}

}

);

}

public void actionPerformed(ActionEvent e) {

if(e.getSource() == bt)

{

//x = Integer.parseInt(tf1.getText()); //y = Integer.parseInt(tf2.getText()); //w = Integer.parseInt(tf3.getText()); sum = Integer.parseInt(tf4.getText()); setSize(x*w+40,y*w+80);

dp.setBounds(20,40,x*w,y*w);

show();

dp.initMin(x,y,w,sum);

}

}

public static void main(String args[]) {

new da();

}

};

六、运行结果

扫雷

扫雷

扫雷

七、设计总结

Java的程序编程相对于C语言的编程较为简单,C语言是基础。熟悉java 的编程语言,有助于我们网页制作。在设计过程中,遇到很多的问题,比如按钮排放顺序及位置,行列不同的按钮要怎么排放在面板中,个别按钮的字体颜色怎么设计,数据的保存,读取甚至是运算。一个一个的问题都在一次又一次的实践中摸索,有些的向老师请教。计算器的运行过程中,其他的运算都是正常,可是当遇到小数位的运算就会出现差错,自己经过很长时间都没有找出原因,经老师的帮助才知道错误与出在哪里。添加一个方法即科学记数法就可以正常读书。

更多相关推荐:
项目总结报告模板

(以上为修改记录的示例,请认真填写)一.绪论...................................................................................…

项目总结报告模板

目录历史记录...................................................................................................…

Acsnwo17 项目总结报告模板

生命是永恒不断的创造,因为在它内部蕴含着过剩的精力,它不断流溢,越出时间和空间的界限,它不停地追求,以形形色色的自我表现的形式表现出来。--泰戈尔项目名称项目总结报告:总体[注:以下提供的模板用于部门技术文档的…

Yp-qqat17 项目总结报告模板

、.~①我们‖打〈败〉了敌人。②我们‖〔把敌人〕打〈败〉了。项目名称项目总结报告:总体[注:以下提供的模板用于部门技术文档的建立。其中用方括号括起来并以蓝色斜体(样式=使用说明)显示的文本,他们用于向作者提供指…

大学生创新性项目总结

项目研究总结:一、主要研究内容与研究方法:(一)研究内容:本课题一武汉市体育旅游也开发为研究对象,对东方马城、藏龙岛国际体育公园等体育旅游资源进行重点调研,结合旅游学、体育经济学、旅游规划学等相关知识对武汉市体…

大学生创业项目总结

大学生实践项目—淮安市汽车维修服务质量调查总结历时一年多,“淮安市汽车维修服务质量调查”项目就要结题了。能够参加这次项目,我感到非常荣幸,过程中的点点滴滴依然历历在目。经过创新小组成员的共同努力我们的项目基本取…

大学生创新科技项目总结

1、AutoCADMDT二次开发简介AutoCAD的二次开发可以通过ActiveX来实现,ActiveX是微软公司提出的一个基于COM的技术标准。应用AutoCADMDTActiveX技术,用户可以利用VC、V…

项目技术总结报告

深圳桑达百利电器有限公司编号QF73048PMSHENZHENSANGDABAILIELECTRONICCOLTD项目技术总结报告项目名称部门起止年月项目经理大功率LED智能控制恒流电源桑达百利电源研发部年2月...

项目部资料员年终工作总结范文

资料员年终工作总结时光流逝20xx年即将成为过去20xx的脚步已悄然来临新的一年意味着新的起点新的机遇新的挑战回顾20xx年这一年感触颇多现将工作总结如下我刚来到公司工作担任项目部资料员一职由于刚参加工作无论从...

项目经理个人工作年度总结范文一例

20xx年个人工作年度总结项目经理在集团公司及开发公司领导的强有力的领导下和相关同事的协作下及监理有限公司XX新光建设工程监理咨询公司的共同努力XX住宅小区工程得以顺利进行本人在XX房地产开发有限公司项目工程部...

XXX工程项目管理工作总结范文

XXX工程项目管理工作总结范文摘要工作总结前要充分占有材料一定要实事求是成绩不夸大缺点不缩小更不能弄虚作假精品学习网工作总结频道为各位朋友编辑了XXX工程项目管理工作总结范文欢迎收看从去年以来我完整地参与了XX...

项目总结

国培项目总结我在这次培训中感受到培训的内容丰富形式多样有学术讲座专题报告参与式专题与讨论专题研讨与交流等专家的教育教学理念人格魅力和治学精神深深地印在我的脑海中我认为国培学习不但告诉我们什么而且结合实例告诉我们...

项目总结范文(81篇)