Java制作扫雷.docx

上传人:b****7 文档编号:10304777 上传时间:2023-02-10 格式:DOCX 页数:16 大小:18.94KB
下载 相关 举报
Java制作扫雷.docx_第1页
第1页 / 共16页
Java制作扫雷.docx_第2页
第2页 / 共16页
Java制作扫雷.docx_第3页
第3页 / 共16页
Java制作扫雷.docx_第4页
第4页 / 共16页
Java制作扫雷.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

Java制作扫雷.docx

《Java制作扫雷.docx》由会员分享,可在线阅读,更多相关《Java制作扫雷.docx(16页珍藏版)》请在冰豆网上搜索。

Java制作扫雷.docx

Java制作扫雷

importjavax.swing.*;

importjava.awt.*;

importjava.awt.event.*;

publicclassMain

{

publicstaticvoidmain(String[]args)

{

LandmineZhang=newLandmine();

}

}

//

//Landmine类主界面

classLandmineextendsJFrame

{

staticResourcesresources=newResources();

Playinglistener=newPlaying(this);//主要监听者,监听地雷面板的动作

HelphelpListener=newHelp(this);//辅助监听者,监听“帮助”、“关于”

JPanellandminePanel=newJPanel();//创建地雷面板

JPaneltopPanel=newJPanel();//创建顶部面板

JPanellowerPanel=newJPanel();//创建底部面板

publicstaticMyButton[][]lei;//主区按钮组

publicstaticintnumberOfUnflaged;//剩余的雷数,显示在topPanel上,用于提示用户

publicstaticintnumberOfClicked;//已经翻开的格子数,当数字数字到"总格子数—雷数"时,即胜利

publicstaticintusedTime;//已用时间

publicstaticJLabelnumberOfUnflagedLabel=newJLabel();//创建剩雷数标签

publicstaticJLabeltimeLabel=newJLabel();//创建时间标签

publicstaticTimertimer;//创建计时

KeylistenerkeyListener=newKeylistener(this);

publicLandmine()

{

super("扫雷__1.2版__小老头");//标题

setBounds(300,90,800,800);//设置窗口位置和大小

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//最大化、最小化、关闭按钮

BorderLayoutff=newBorderLayout();//创建布局管理器

setLayout(ff);//关联布局管理器

setResizable(false);//禁止改变窗口大小

/*初始化一些数据*/

numberOfClicked=0;

numberOfUnflaged=40;

usedTime=0;

/*设置顶部面板*/

numberOfUnflagedLabel.setText("剩余雷数:

"+numberOfUnflaged);//显示剩余雷数

numberOfUnflagedLabel.setFont(resources.fontOne);//设置剩雷数标签字体

numberOfUnflagedLabel.setIcon(resources.bombIconForLabel);//剩雷数标签图标(地雷形)

topPanel.add(numberOfUnflagedLabel);//剩雷数标签加入topPanel

timeLabel.setText("用时:

"+usedTime);//显示剩余时间

timeLabel.setFont(resources.fontOne);//设置时间标签字体

timeLabel.setIcon(resources.clockIcon);//设置时间标签图标

topPanel.add(timeLabel);//时间标签加入topPanel

add(topPanel,BorderLayout.NORTH);//加入主面板上部

timer=newTimer(1000,newTimerListener());//计算器注册监听者

/*设置底部面板*/

JButtonaboutJB=newJButton("关于");//创建“关于”按钮

JButtonhelpJB=newJButton("求救");//创建“求救”按钮

helpJB.addActionListener(helpListener);//"求救"按钮加入监听者

aboutJB.addActionListener(helpListener);//"关于"按钮加入监听者

helpJB.addKeyListener(keyListener);

aboutJB.addKeyListener(keyListener);//注册按键监听

lowerPanel.add(aboutJB);//“关于”按钮加入lowerPanel

lowerPanel.add(helpJB);//“帮助”按钮加入lowerPanel

add(lowerPanel,BorderLayout.SOUTH);

/*设置地雷面板*/

GridLayoutdd=newGridLayout(16,16);

landminePanel.setLayout(dd);//布局管理

lei=newMyButton[18][18];

for(inti=0;i<18;++i)

{//创建下标0—17的按钮,18*18矩阵

for(intj=0;j<18;++j)

{

lei[i][j]=newMyButton(i,j);

}

}

for(inti=1;i<17;++i)

{//将下标1-16的按钮,加入面板、设置图标、翻开标记为假、加入监听者

for(intj=1;j<17;++j)

{

landminePanel.add(lei[i][j]);//按钮加入地雷面板

lei[i][j].setIcon(resources.smallIcon);//设置按钮图标

lei[i][j].isClicked=false;//翻开标记设置为假lei[i][j].setIcon(dead);

lei[i][j].addActionListener(listener);//加入监听者

lei[i][j].addMouseListener(listener);//加入鼠标事件监听者

lei[i][j].addKeyListener(keyListener);//按钮注册按键监听,当焦点在按钮上是能监听按键

}

}

add(landminePanel,BorderLayout.CENTER);//landminePanel加入主框架中央

addLandmine();//布雷

timer.start();//启动计时器

setVisible(true);//显示之

}

/*布雷*/

publicstaticvoidaddLandmine()

{//随机将40的按钮的是否为雷的标记isBomb设为真

for(intcount=0;count<40;/*blank*/)

{

inti=(int)(Math.random()*100%16+1);

intj=(int)(Math.random()*100%16+1);

if(lei[i][j].isBomb==false)

{

lei[i][j].isBomb=true;

count++;

}

}

}

classTimerListenerimplementsActionListener

{//内部类,时间监听

publicvoidactionPerformed(ActionEvente)

{

usedTime++;

timeLabel.setText("用时:

"+usedTime);

}

}

}

//

 

//Playing类执行主要游戏操作

classPlayingimplementsActionListener,MouseListener

{

staticResourcesresources=newResources();

publicstaticLandminegui;

publicPlaying(Landminein)

{

gui=in;

}

publicvoidactionPerformed(ActionEventevent)

{

MyButtonreceive=(MyButton)event.getSource();

if(receive.isBomb)

{//如果翻到了雷。

for(inti=1;i<17;++i)

{//将所有的雷图标设为“地雷”

for(intj=1;j<17;++j)

{

if(gui.lei[i][j].isBomb)

gui.lei[i][j].setIcon(resources.bombIcon);

}

}

receive.setIcon(resources.deadIcon);//将踩到的地雷图标设为“衰”

gui.timer.stop();//停止计时器

JOptionPane.showMessageDialog(null,"小朋友,你挂了…","失败!

",

JOptionPane.INFORMATION_MESSAGE,

resources.deadIcon);//提示失败

intyourChose=JOptionPane.showConfirmDialog(null,"你可能是一不小心点错了,再来一局?

");

if(yourChose==JOptionPane.OK_OPTION)

{//点击“是”时

replay();

}

else

{//点击“否”或“取消”时退出程序

System.exit(0);

}

}

elseif(receive.isClicked==false)

{//未翻到雷

showBombNumber(receive);

}

}

publicstaticvoidshowBombNumber(MyButtonin)

{//翻开点击的按钮

intnumberOfLandmine=0;//记录雷的个数

in.isClicked=true;//翻开标记设为真

/*检测周围8个方块是否为雷*/

if(gui.lei[in.num_x-1][in.num_y-1].isBomb==true)numberOfLandmine++;//左上

if(gui.lei[in.num_x][in.num_y-1].isBomb==true)numberOfLandmine++;//上

if(gui.lei[in.num_x+1][in.num_y-1].isBomb==true)numberOfLandmine++;//右上

if(gui.lei[in.num_x+1][in.num_y].isBomb==true)numberOfLandmine++;//右

if(gui.lei[in.num_x+1][in.num_y+1].isBomb==true)numberOfLandmine++;//右下

if(gui.lei[in.num_x][in.num_y+1].isBomb==true)numberOfLandmine++;//下

if(gui.lei[in.num_x-1][in.num_y+1].isBomb==true)numberOfLandmine++;//左下

if(gui.lei[in.num_x-1][in.num_y].isBomb==true)numberOfLandmine++;//左

in.setIcon(newImageIcon("images/"+numberOfLandmine+".png"));//根据周围的雷数显示数字图标

gui.numberOfClicked++;//翻开格子数+1

if(gui.numberOfClicked==216)

{//翻开216个格子时游戏成功,用户选择是否再来一局

intyourChoice=JOptionPane.showConfirmDialog(null,"恭喜你成功了!

再来一盘吗?

");

if(yourChoice==JOptionPane.OK_OPTION)

replay();

else

System.exit(0);

}

if(numberOfLandmine==0)

{//如果周围无雷,则将周围未翻开格子的全部翻开

if(gui.lei[in.num_x-1][in.num_y-1].isClicked==false)

showBombNumber(gui.lei[in.num_x-1][in.num_y-1]);

if(gui.lei[in.num_x][in.num_y-1].isClicked==false)

showBombNumber(gui.lei[in.num_x][in.num_y-1]);

if(gui.lei[in.num_x+1][in.num_y-1].isClicked==false)

showBombNumber(gui.lei[in.num_x+1][in.num_y-1]);

if(gui.lei[in.num_x+1][in.num_y].isClicked==false)

showBombNumber(gui.lei[in.num_x+1][in.num_y]);

if(gui.lei[in.num_x+1][in.num_y+1].isClicked==false)

showBombNumber(gui.lei[in.num_x+1][in.num_y+1]);

if(gui.lei[in.num_x][in.num_y+1].isClicked==false)

showBombNumber(gui.lei[in.num_x][in.num_y+1]);

if(gui.lei[in.num_x-1][in.num_y+1].isClicked==false)

showBombNumber(gui.lei[in.num_x-1][in.num_y+1]);

if(gui.lei[in.num_x-1][in.num_y].isClicked==false)

showBombNumber(gui.lei[in.num_x-1][in.num_y]);

}

}

publicstaticvoidreplay()

{//重新开始

gui.dispose();//释放框架资源

gui.timer.stop();//终止计时器

Landmineff=newLandmine();//重新创建一个主类的实例

//这几条语句实现了重新开始————关闭上一个窗口,重新开启一个

//但是这种方法会造成内存的浪费,一个改进的方法是不关闭当年窗口,而是将当前窗口重新初始化

}

publicvoidmousePressed(MouseEvente)

{//当鼠标右键点击时自动调用此函数

intmods=e.getModifiers();

MyButtonreceive=(MyButton)e.getSource();

if((mods&InputEvent.BUTTON3_MASK)!

=0)

{//鼠标右键

if(receive.isClicked==false)

{

receive.isRight=receive.isRight?

false:

true;//改变receive.isRight的值

if(receive.isRight)

{//如果添加标记,则剩余雷数-1,设置标签为“旗帜”

gui.numberOfUnflaged--;

receive.setIcon(resources.flagIcon);

}

else

{//如果清除标记,则剩余雷数+1,设置标签为“未翻开”

gui.numberOfUnflaged++;

receive.setIcon(resources.smallIcon);

}

gui.numberOfUnflagedLabel.setText("剩余雷数:

"+gui.numberOfUnflaged);

//更新剩余雷数标签

}

}

}

publicvoidmouseReleased(MouseEvente){}

publicvoidmouseExited(MouseEvente){}

publicvoidmouseClicked(MouseEvente){}

publicvoidmouseEntered(MouseEvente){}

}

//

//Help类,响应“关于”、“求救”

classHelpimplementsActionListener

{

staticResourcesresources=newResources();

publicstaticLandminegui;

publicHelp(Landminein)

{

gui=in;

}

publicvoidactionPerformed(ActionEventevent)

{

if(event.getActionCommand()=="关于")

JOptionPane.showMessageDialog(null,"扫雷1.2版。

小老头出品");

if(event.getActionCommand()=="求救")

help();

}

publicstaticvoidhelp()

{//求救

intstopNumber=(int)(Math.random()*gui.numberOfUnflaged+1);

intcount=0;

for(inti=1;i<17;++i)

{

for(intj=1;j<17;++j)

{

if(gui.lei[i][j].isBomb&&!

gui.lei[i][j].isClicked&&!

gui.lei[i][j].isRight)

{

count++;

}

if(count==stopNumber)

{

gui.lei[i][j].setIcon(resources.badIcon);

return;

}

}

}

}

 

}

//

//Keylistener类,响应键盘事件

classKeylistenerimplementsKeyListener

{

staticResourcesresources=newResources();

Landminegui;

publicKeylistener(Landminein)

{

gui=in;

}

publicvoidkeyPressed(KeyEvente)

{//有键按下时自动执行该方法

if(e.getKeyCode()==KeyEvent.VK_UP)

{//按键为向上时,将所有未标记的地雷显示出

for(inti=1;i<17;++i)

{

for(intj=1;j<17;++j)

{

if(gui.lei[i][j].isBomb&&!

gui.lei[i][j].isRight)

gui.lei[i][j].setIcon(resources.badIcon);

}

}

}

if(e.getKeyCode()==KeyEvent.VK_DOWN)

{//按键为向下时,将所有未标记的地雷恢复为未点击的图标

for(inti=1;i<17;++i)

{

for(intj=1;j<17;++j)

{

if(gui.lei[i][j].isBomb&&!

gui.lei[i][j].isRight)

gui.lei[i][j].setIcon(resources.smallIcon);

}

}

}

}

publicvoidkeyReleased(KeyEvente){}

publicvoidkeyTyped(KeyEvente){}

}

//

//按钮类MyBtton

classMyButtonextendsJButton

{

publicintnum_x,num_y;//第几号方块

publicbooleanisBomb;//是否为雷

publicbooleanisClicked;//是否被点击

publicintBombFlag;//探雷标记

publicbooleanisRight;//是否点击右键

publicMyButton(intx,inty)

{

BombFlag=0;

num_x=x;

num_y=y;

isBomb=false;

isClicked=true;

isRight=false;

}

}

//

//资源类其他类中用到的图标,字体等

classResources

{

publicstaticImageIcondeadIcon;

publicstaticImageIconsmallIcon;

publicstaticImageIconclockIcon;

publicstaticImageIconbombIcon;

publicstaticImageIconflagIcon;

publicstaticImageIconbadIcon;

publicstaticImageIconbombIconForLabel;

publicstaticFontfontOne;

publicResources()

{

deadIcon=newImageIc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1