Java 课程设计 扫雷Word格式.docx
《Java 课程设计 扫雷Word格式.docx》由会员分享,可在线阅读,更多相关《Java 课程设计 扫雷Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
JMenuItemjm1_1,jm1_2,jm1_3,jm1_4,jm1_5,jm2_1;
//主函数
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
MySaoLeimsl=newMySaoLei(w,h,leisum);
}
///////////////////////////////////////////////////构造函数
publicMySaoLei(intw,inth,intleisum)
{
a=newArea[h][w];
this.w=w;
this.h=h;
this.leisum=leisum;
jmb=newJMenuBar();
jm1=newJMenu("
游戏(G)"
);
jm1_1=newJMenuItem("
初级"
jm1_1.addActionListener(this);
jm1_2=newJMenuItem("
中级"
jm1_2.addActionListener(this);
jm1_3=newJMenuItem("
高级"
jm1_3.addActionListener(this);
jm1_4=newJMenuItem("
自定义"
jm1_4.addActionListener(this);
jm1_5=newJMenuItem("
退出"
jm1_5.addActionListener(this);
jm1.add(jm1_1);
jm1.add(jm1_2);
jm1.add(jm1_3);
jm1.add(jm1_4);
jm1.add(jm1_5);
jm2=newJMenu("
帮助(H)"
jm2_1=newJMenuItem("
游戏规则"
jm2_1.addActionListener(this);
jm2.add(jm2_1);
jmb.add(jm1);
jmb.add(jm2);
//创建一个网格布局g1
GridLayoutgl=newGridLayout(h,w);
gl.setHgap
(1);
gl.setVgap
(1);
jp=newJPanel();
jp.setLayout(gl);
//初始化雷区
for(inti=0;
i<
h;
i++)
{
for(intj=0;
j<
w;
j++)
{
a[i][j]=newArea();
a[i][j].addActionListener(this);
a[i][j].addMouseListener(this);
a[i][j].show(0);
jp.add(a[i][j]);
}
}
//添加每个按钮周围的按钮
addAround();
//设置雷
intii=0;
intjj=0;
leisum;
ii=(int)(Math.random()*h);
jj=(int)(Math.random()*w);
a[ii][jj].isLei=1;
a[ii][jj].Type=9;
//给每个按钮写上数据
{
if(a[i][j].isLei==0)
{
a[i][j].Type=getAroundsum(a[i][j]);
}
/////////////////////////////////////////////////////////////////////设置JFrame
this.setJMenuBar(jmb);
this.add(jp);
this.setSize(w*35+10,h*35);
this.setLocation(10,10);
this.setTitle("
扫雷"
this.setIconImage(image);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//为每个按钮添加周围的按钮的函数
publicvoidaddAround()
a[i][j].around=newVector<
Area>
();
if(i>
0&
&
j>
0)
//左上角
a[i][j].around.add(a[i-1][j-1]);
//System.out.println(i+"
"
+j+"
左上角"
if(j>
//上方
a[i][j].around.add(a[i][j-1]);
上方"
if(i<
h-1&
//右上角
a[i][j].around.add(a[i+1][j-1]);
右上角"
h-1)
//右边
a[i][j].around.add(a[i+1][j]);
右边"
j<
w-1)
//右下角
a[i][j].around.add(a[i+1][j+1]);
右下角"
if(j<
//下方
a[i][j].around.add(a[i][j+1]);
下方"
//左下角
a[i][j].around.add(a[i-1][j+1]);
左下角"
//左边
a[i][j].around.add(a[i-1][j]);
左边"
//得到按钮周边雷的个数的函数
publicintgetAroundsum(Areaarea)
intsum=0;
Areaa=null;
area.around.size();
a=area.around.get(i);
if(a.isLei==1)
sum++;
returnsum;
//自动挖开空白区域
publicvoidwakai(Areaa)
Areaa2=null;
for(inti=0;
a.around.size();
a2=a.around.get(i);
if(a2.show==0&
a2.Type!
=0)
a2.show
(1);
a2.Type==0)
wakai(a2);
//判断是否完成扫雷的函数
publicvoidwin()
//判断是否挖完
win=0;
if(a[i][j].isLei==1&
a[i][j].show!
=2)
win++;
if(win==0)
for(intj=0;
if(a[i][j].isLei==0&
a[i][j].show==0)
a[i][j].show
(1);
JOptionPane.showMessageDialog(this,"
恭喜你!
扫雷完成!
"
//菜单响应函数
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==jm1_1)
newMySaoLei(20,15,60);
this.dispose();
if(e.getSource()==jm1_2)
newMySaoLei(30,18,90);
if(e.getSource()==jm1_3)
newMySaoLei(35,20,140);
if(e.getSource()==jm1_4)
ZiDingYizdy=newZiDingYi(this,"
自定义游戏等级"
true);
if(zdy.closeOwner)
if(e.getSource()==jm1_5)
if(e.getSource()==jm2_1)
//System.out.println("
点击了游戏规则"
Stringmessage="
游戏规则:
\n每个小方块上都可能是雷、1~8的数字或者空白(空白表示0)。
+
"
方块上的数字表示该方块周围8个方块中共有多少个雷。
\n您可以进行以下操作:
\n1、单击某个方块:
您将看到该方块的内容,如果该方块是雷,游戏结束,"
所有的雷都将爆炸,您将会被炸死。
\n2、右击某个方块:
如果您确定某个方块是雷,您可以右键标记以方便"
其他方块的判断。
\n3、双击某个方块:
如果某个方块周围的雷都已经全部标记,双击该方块可以查看它周围"
的所有方块。
\n当所有的雷的已全部标记时完成扫雷。
;
JOptionPane.showMessageDialog(this,message);
//鼠标响应函数
publicvoidmouseClicked(MouseEvente){
if(e.getSource()==a[i][j])
//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、单击鼠标
if(a[i][j].show!
=1)
if(e.getButton()==MouseEvent.BUTTON1&
e.getClickCount()==1)
{
//没挖到雷
if(a[i][j].isLei==0&
{
a[i][j].show
(1);
if(a[i][j].Type==0)
{
wakai(a[i][j]);
}
}
//挖到雷
else
for(intii=0;
ii<
ii++)
for(intjj=0;
jj<
jj++)
{
a[ii][jj].show
(1);
}
}
////////////////////////////////////////////////////、、、、、、、、右击鼠标
if(e.getButton()==MouseEvent.BUTTON3)
//System.out.println("
右击"
+i+"
+j);
if(a[i][j].show==0)
a[i][j].show
(2);
break;
if(a[i][j].show==2)
a[i][j].show(3);
if(a[i][j].show==3)
a[i][j].show(0);
////////////////////////////////////////////////////、、、双击鼠标
e.getClickCount()==2)
intbiaoLeiSum=0;
//周围标明是雷的数量
intbiaoCuoSum=0;
//标错的数量
if(a[i][j].show==1)
for(intp=0;
p<
a[i][j].around.size();
p++)
Areaa2=a[i][j].around.get(p);
if(a2.isLei==1&
a2.show==2)//a2是雷,并且已经标明
biaoLeiSum++;
if(a2.isLei==0&
a2.show==2)//a2不是雷,但是已经标明是雷
a2.biaocuo=1;
biaoCuoSum++;
if(biaoLeiSum==a[i][j].Type&
biaoCuoSum==0)
for(intp=0;
Areaa3=a[i][j].around.get(p);
if(a3.isLei!
{
a3.show
(1);
if(a3.Type==0)
{
wakai(a3);
}
}
}
if(biaoCuoSum!
for(intii=0;
for(intjj=0;
if(a[ii][jj].biaocuo==0)
a[ii][jj].show
(1);
else
a[ii][jj].show(4);
win();
@Override
publicvoidmouseEntered(MouseEvente){
publicvoidmouseExited(MouseEvente){
publicvoidmousePressed(MouseEvente){
publicvoidmouseReleased(MouseEvente){
}
//
(2)Area.java
/*
*Area类,表示某个方块,是一个JButton
*/
packagecom.test3;
importjava.awt.Color;
importjava.util.Vector;
classAreaextendsJButton
{
//是否是雷(0表示不是雷,1表示是雷)
intisLei=0;
//类型(0表示空,1~8表示数字,9表示雷)
intType=0;
//显示1表示点击左键显示,0表示未做任何处理,2表示右键标记雷,3表示再次右键标记问号
//0表示没标错,1表示标错
intbiaocuo=0;
intshow=0;
Borderborder=newLineBorder(Color.blue,1);
Borderborder0=newLineBorder(Color.white,1);
Borderborder1=newLineBorder(Color.red,3);
Borderborder2=newLineBorder(Color.green,3);
Vector<
around=null;
publicArea()
this.setBorder(border);
//显示函数
publicvoidshow(inti)
this.show=i;
Strings=this.Type+"
if(this.Type==0)
s="
//初始
if(i==0)
this.setText("
this.setBorder(border);