扫雷.docx
- 文档编号:28934961
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:22
- 大小:56.21KB
扫雷.docx
《扫雷.docx》由会员分享,可在线阅读,更多相关《扫雷.docx(22页珍藏版)》请在冰豆网上搜索。
扫雷
实验设计思路
1.创建一个框架,加入游戏主区域,加入显示剩余时间、剩余地雷数的提示。
2.在游戏主区域布置制定的格子,每个格子为一个按钮,每个按钮有监听器。
用定时器记录流逝的时间,并定时显示剩余的时间。
3.设立表示所有按钮的按钮二维数组、表示对应按钮属性的属性二维数组、表示对应按钮用户标记的标记二维数组、记录有地雷的位置的集合。
上述结构可以表示全局情景。
4.随机生成地雷的位置。
根据当前状态显示界面。
当用户点击了一个按钮,则根据游戏规则处理:
取出用户点击的位置,分别处理按下鼠标左键和鼠标右键的情况,最后检查是否成功结束游戏。
若为左键:
点中地雷,游戏失败;点中数字,显示其周围的地雷总数;点中空块,连锁显示邻接的空块.
实验的重点难点
建立一个面板,在面板上布局是最简单的。
比较难的部分是在网格布局的9*9面板上随机布雷,要用到for语句,且代码比较繁琐。
不过我觉得最难的重点是在鼠标点击一颗雷的时候,检查周围的八个按钮是否有雷,若是空格就连同空格一起显示。
因为空格不知道怎么显示,所以没做出效果,只能凭借猜来猜出是否有空格。
所以做的还不完善。
代码
Y_button.javaf
packageclearmine;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassY_buttonextendsJButtonimplementsMouseListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privatebooleanisMine=false;
privateintnumber=0;
privateintm,n;
privateSLyeyemain;
privatebooleanisPass=false;
privatebooleanflag;
privatestaticbooleantimerBegin;
publicvoidsetTimerBegin(booleant)
{
timerBegin=t;
}
publicvoidsetFlag(booleanf)
{
flag=f;
}
publicbooleanisFlag()
{
returnflag;
}
publicvoidsetPass(booleanisWin)
{
isPass=isWin;
}
publicbooleangetPass()
{
returnisPass;
}
publicvoidsetMine(booleanb)
{
isMine=b;
}
publicbooleangetMine()
{
returnisMine;
}
publicvoidsetNumber(intn)
{
number=n;
}
publicintgetNumber()
{
returnnumber;
}
publicvoidsetM(inti)
{
m=i;
}
publicvoidsetN(intj)
{
n=j;
}
publicintgetM()
{
returnm;
}
publicintgetN()
{
returnn;
}
publicY_button(SLyeyeminesweeper)
{
main=minesweeper;
setMargin(newInsets(0,0,0,0));
addMouseListener(this);
}
publicvoidmousePressed(MouseEvente)
{
}
publicvoidmouseReleased(MouseEvente)
{
if(!
Y_button.timerBegin)
{
main.timer();
}
setTimerBegin(true);
if(getNumber()!
=0&&!
getPass())
{
if(!
e.isPopupTrigger())
{
if(!
isFlag())
{
setText(""+number);
setPass(true);
main.haveFinish();
}
}
else
{
if(!
isFlag())
{
//setText("f");
main.flagCountReduce();
setFlag(true);
}
else
{
main.flagCountIncrease();
setFlag(false);
}
}
}
elseif(getNumber()==0&&!
getMine()&&!
getPass())
{
if(!
e.isPopupTrigger())
{
if(!
isFlag())
{
main.setSpaciousArea(this);
}
}
else
{
if(!
isFlag())
{
main.flagCountReduce();
setFlag(true);
}
else
{
setIcon(null);
main.flagCountIncrease();
setFlag(false);
}
}
}
elseif(getMine()&&!
getPass())
{
if(!
e.isPopupTrigger())
{
if(!
isFlag())
{
main.showMine();
}
}
else
{
if(!
isFlag())
{
setText("*");
main.flagCountReduce();
setFlag(true);
}
else
{
setIcon(null);
main.flagCountIncrease();
setFlag(false);
}
}
}
}
publicvoidmouseClicked(MouseEvente){}
publicvoidmouseEntered(MouseEvente){}
publicvoidmouseExited(MouseEvente){}
}
SLyeye.java
packageclearmine;
importjavax.swing.*;
importjava.awt.*;
publicclassSLyeyeextendsJFrame{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
privateContainerY;
privateJPanelC,c1;
privateY_buttonjButton[];
privateY_buttonmineButton[][];
privateJLabelshowLabel;
privateJLabellabel1,label2,label3,label4;
privateTimertimerThread;
privatebooleanstopFlag=false;
privateintflagCount=10;
publicSLyeye()
{
initGameStep1();
initGameStep2();
Y=newContainer();
Y=getContentPane();
Y.setLayout(newBoxLayout(Y,BoxLayout.Y_AXIS));
initGameStep3();
Y.add(C);
c1=newJPanel();
c1.setBorder(BorderFactory.createEtchedBorder());
c1.setLayout(newFlowLayout());
c1.setBounds(30,30,160,160);
Y.add(c1);
showLabel=newJLabel();
showLabel.setBounds(30,195,160,20);
Y.add(showLabel);
label4=newJLabel("MINE:
");
label4.setBounds(74,215,30,20);
label4.setFont(newFont("仿宋",Font.BOLD,15));
c1.add(label4);
label1=newJLabel("10");
label1.setBounds(74,215,30,20);
label1.setFont(newFont("仿宋",Font.BOLD,15));
c1.add(label1);
label3=newJLabel("TIME:
");
label3.setBounds(74,215,30,20);
label3.setFont(newFont("仿宋",Font.BOLD,15));
c1.add(label3);
label2=newJLabel("0");
label2.setBounds(170,215,20,20);
label2.setFont(newFont("仿宋",Font.BOLD,15));
c1.add(label2);
setTitle("耶耶的扫雷游戏");
setVisible(true);
setSize(300,300);
setResizable(false);
setLocation(521,280);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/*
初始化函数1
新建81个button
给其中10个按钮布雷,并随机打乱次序
*/
publicvoidinitGameStep1()
{
jButton=newY_button[81];
for(inti=0;i<81;i++)
{
jButton[i]=newY_button(this);
if(i<10)
{
jButton[i].setMine(true);//settenMines
}
}
Y_buttontemp;
for(inti=0;i<81;i++)
{
inta=(int)(Math.random()*80);
intb=(int)(Math.random()*80);
temp=jButton[a];
jButton[a]=jButton[b];
jButton[b]=temp;
}
}//diorderthetenmines
publicvoidinitGameStep2()
{
mineButton=newY_button[9][9];
intn=0;
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
mineButton[i][j]=newY_button(this);
mineButton[i][j]=jButton[n];
n++;
mineButton[i][j].setM(i);
mineButton[i][j].setN(j);
}
}
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
if(!
mineButton[i][j].getMine())
{
intk=0;
if(i>0&&mineButton[i-1][j].getMine())
{
k++;
}
if(i<8&&mineButton[i+1][j].getMine())
{
k++;
}
if(j>0&&mineButton[i][j-1].getMine())
{
k++;
}
if(j<8&&mineButton[i][j+1].getMine())
{
k++;
}
if(i>0&&j>0&&mineButton[i-1][j-1].getMine())
{
k++;
}
if(i>0&&j<8&&mineButton[i-1][j+1].getMine())
{
k++;
}
if(i<8&&j>0&&mineButton[i+1][j-1].getMine())
{
k++;
}
if(i<8&&j<8&&mineButton[i+1][j+1].getMine())
{
k++;
}
mineButton[i][j].setNumber(k);
}
}
}
}//检查一个按钮周围的九个按钮,若有雷,k++
publicvoidinitGameStep3()
{
C=newJPanel();
C.setBorder(BorderFactory.createEtchedBorder());
C.setLayout(newGridLayout(9,9));//网格布局9*9
C.setBounds(30,30,160,160);
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
C.add(mineButton[i][j]);
}
}
}
publicvoidflagCountIncrease()
{
flagCount++;
label1.setText(""+flagCount);
}
publicvoidflagCountReduce()
{
flagCount--;
label1.setText(""+flagCount);
}
publicvoidsetSpaciousArea(Y_buttonbutton)
{
inti=button.getM();
intj=button.getN();
button.setPass(true);
if(i>0&&!
mineButton[i-1][j].getMine()&&!
mineButton[i-1][j].getPass())
{
if(mineButton[i-1][j].getNumber()!
=0)
{
mineButton[i-1][j].setText(""+mineButton[i-1][j].getNumber());
mineButton[i-1][j].setPass(true);
setSpaciousArea(mineButton[i-1][j]);
}
}
if(i<8&&!
mineButton[i+1][j].getMine()&&!
mineButton[i+1][j].getPass())
{
if(mineButton[i+1][j].getNumber()!
=0)
{
mineButton[i+1][j].setText(""+mineButton[i+1][j].getNumber());
mineButton[i+1][j].setPass(true);
setSpaciousArea(mineButton[i+1][j]);
}
}
if(j>0&&!
mineButton[i][j-1].getMine()&&!
mineButton[i][j-1].getPass())
{
if(mineButton[i][j-1].getNumber()!
=0)
{
mineButton[i][j-1].setText(""+mineButton[i][j-1].getNumber());
mineButton[i][j-1].setPass(true);
setSpaciousArea(mineButton[i][j-1]);
}
}
if(j<8&&!
mineButton[i][j+1].getMine()&&!
mineButton[i][j+1].getPass())
{
if(mineButton[i][j+1].getNumber()!
=0)
{
mineButton[i][j+1].setText(""+mineButton[i][j+1].getNumber());
mineButton[i][j+1].setPass(true);
setSpaciousArea(mineButton[i][j+1]);
}
}
if(i>0&&j>0&&mineButton[i-1][j-1].getNumber()!
=0&&!
mineButton[i-1][j-1].getPass())
{
mineButton[i-1][j-1].setText(""+mineButton[i-1][j-1].getNumber());
mineButton[i-1][j-1].setPass(true);
}
if(i>0&&j<8&&mineButton[i-1][j+1].getNumber()!
=0&&!
mineButton[i-1][j+1].getPass())
{
mineButton[i-1][j+1].setText(""+mineButton[i-1][j+1].getNumber());
mineButton[i-1][j+1].setPass(true);
}
if(i<8&&j>0&&mineButton[i+1][j-1].getNumber()!
=0&&!
mineButton[i+1][j-1].getPass())
{
mineButton[i+1][j-1].setText(""+mineButton[i+1][j-1].getNumber());
mineButton[i+1][j-1].setPass(true);
}
if(i<8&&j<8&&mineButton[i+1][j+1].getNumber()!
=0&&!
mineButton[i+1][j+1].getPass())
{
mineButton[i+1][j+1].setText(""+mineButton[i+1][j+1].getNumber());
mineButton[i+1][j+1].setPass(true);
}
}
classshowMineextendsThread
{
publicvoidrun()
{
getShowLabel().setText("不好意思,失败了");
try
{
sleep(600);
}
catch(Exceptione){}
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
if(mineButton[i][j].getMine())
{
//
}
mineButton[i][j].setPass(true);
}
}
}
}
publicvoidshowMine()
{
showMinea=newshowMine();
a.start();
stop();
}
publicJLabelgetShowLabel()
{
returnshowLabel;
}
publicvoidhaveFinish()
{
intk=0;
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
if(mineButton[i][j].getPass())
{
k++;
}
}
}
if(k==71)
{
getShowLabel().setText("恭喜你过关啦");
stop();
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
if(mineButton[i][j].getMine())
{
mineButton[i][j].setText("*");
}
mineButton[i][j].setPass(true);
}
}
}
}
publicclassTimerextendsThread
{
publicvoidrun()
{
inti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扫雷
![提示](https://static.bdocx.com/images/bang_tan.gif)