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