Java 课程设计 扫雷.docx
《Java 课程设计 扫雷.docx》由会员分享,可在线阅读,更多相关《Java 课程设计 扫雷.docx(23页珍藏版)》请在冰豆网上搜索。
Java课程设计扫雷
自己写用Java写的扫雷游戏
-----------做课程设计的可以参考一下。
运行界面截图:
扫雷游戏主界面
以下是游戏代码(共分三个文件即三个类:
MySaoLei.java;Area.java和ZiDingYi.java):
------运行方法:
打开MyEclipse->新建一个javaproject工程->右击工程名新建一个名为com.test的package包->右击包名新建三个class文件,分别为MySaoLei.java;Area.java和ZiDingYi.java。
然后把以下代码对号入座。
//
(1)MySaoLei.java
packagecom.test;
importjava.awt.*;
importjavax.swing.*;
importjavax.swing.border.Border;
importjavax.swing.border.LineBorder;
importjava.awt.event.*;
importjava.security.acl.Owner;
importjava.util.*;
publicclassMySaoLeiextendsJFrameimplementsActionListener,MouseListener{
//w表示横向可以放多少雷,h表示纵向可以放多少雷
staticintw=35,h=20;
//设置雷的个数
staticintleisum=180;
//用二维向量a[][]来存放雷
Areaa[][]=null;
//win用于判断是否完成扫雷
intwin=0;
JPaneljp=null;
JPaneljp0=null;
JMenuBarjmb;
JMenujm1,jm2;
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{
for(intj=0;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;
for(inti=0;i{
ii=(int)(Math.random()*h);
jj=(int)(Math.random()*w);
a[ii][jj].isLei=1;
a[ii][jj].Type=9;
}
//给每个按钮写上数据
for(inti=0;i{
for(intj=0;j{
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()
{
for(inti=0;i{
for(intj=0;j{
a[i][j].around=newVector();
if(i>0&&j>0)
{
//左上角
a[i][j].around.add(a[i-1][j-1]);
//System.out.println(i+""+j+"左上角");
}
if(j>0)
{
//上方
a[i][j].around.add(a[i][j-1]);
//System.out.println(i+""+j+"上方");
}
if(i0)
{
//右上角
a[i][j].around.add(a[i+1][j-1]);
//System.out.println(i+""+j+"右上角");
}
if(i{
//右边
a[i][j].around.add(a[i+1][j]);
//System.out.println(i+""+j+"右边");
}
if(i{
//右下角
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]);
//System.out.println(i+""+j+"下方");
}
if(i>0&&j{
//左下角
a[i][j].around.add(a[i-1][j+1]);
//System.out.println(i+""+j+"左下角");
}
if(i>0)
{
//左边
a[i][j].around.add(a[i-1][j]);
//System.out.println(i+""+j+"左边");
}
}
}
}
//得到按钮周边雷的个数的函数
publicintgetAroundsum(Areaarea)
{
intsum=0;
Areaa=null;
for(inti=0;i{
a=area.around.get(i);
if(a.isLei==1)
sum++;
}
returnsum;
}
//自动挖开空白区域
publicvoidwakai(Areaa)
{
Areaa2=null;
for(inti=0;i{
a2=a.around.get(i);
if(a2.show==0&&a2.Type!
=0)
{
a2.show
(1);
}
if(a2.show==0&&a2.Type==0)
{
a2.show
(1);
wakai(a2);
}
}
}
//判断是否完成扫雷的函数
publicvoidwin()
{
//判断是否挖完
win=0;
for(inti=0;i{
for(intj=0;j{
if(a[i][j].isLei==1&&a[i][j].show!
=2)
{
win++;
}
}
}
if(win==0)
{
for(inti=0;i{
for(intj=0;j{
if(a[i][j].isLei==0&&a[i][j].show==0)
a[i][j].show
(1);
}
}
JOptionPane.showMessageDialog(this,"恭喜你!
扫雷完成!
");
}
}
//菜单响应函数
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
if(e.getSource()==jm1_1)
{
newMySaoLei(20,15,60);
this.dispose();
}
if(e.getSource()==jm1_2)
{
newMySaoLei(30,18,90);
this.dispose();
}
if(e.getSource()==jm1_3)
{
newMySaoLei(35,20,140);
this.dispose();
}
if(e.getSource()==jm1_4)
{
ZiDingYizdy=newZiDingYi(this,"自定义游戏等级",true);
if(zdy.closeOwner)
this.dispose();
}
if(e.getSource()==jm1_5)
{
this.dispose();
}
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){
//TODOAuto-generatedmethodstub
for(inti=0;i{
for(intj=0;j{
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==0)
{
a[i][j].show
(1);
if(a[i][j].Type==0)
{
wakai(a[i][j]);
}
}
//挖到雷
else
{
for(intii=0;ii{
for(intjj=0;jj{
a[ii][jj].show
(1);
}
}
}
}
////////////////////////////////////////////////////、、、、、、、、右击鼠标
if(a[i][j].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);
break;
}
if(a[i][j].show==3)
{
a[i][j].show(0);
break;
}
}
////////////////////////////////////////////////////、、、双击鼠标
if(e.getButton()==MouseEvent.BUTTON1&&e.getClickCount()==2)
{
intbiaoLeiSum=0;//周围标明是雷的数量
intbiaoCuoSum=0;//标错的数量
if(a[i][j].show==1)
{
for(intp=0;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;p{
Areaa3=a[i][j].around.get(p);
if(a3.isLei!
=1)
{
a3.show
(1);
if(a3.Type==0)
{
wakai(a3);
}
}
}
}
if(biaoCuoSum!
=0)
{
for(intii=0;ii{
for(intjj=0;jj{
if(a[ii][jj].biaocuo==0)
a[ii][jj].show
(1);
else
a[ii][jj].show(4);
}
}
}
}
}
}
}
}
win();
}
@Override
publicvoidmouseEntered(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseExited(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmousePressed(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmouseReleased(MouseEvente){
//TODOAuto-generatedmethodstub
}
}
//
(2)Area.java
/*
*Area类,表示某个方块,是一个JButton
*/
packagecom.test3;
importjava.awt.Color;
importjava.util.Vector;
importjavax.swing.*;
importjavax.swing.border.Border;
importjavax.swing.border.LineBorder;
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);
Vectoraround=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);