import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Landmine extends JFrame
{
Playing listener = new Playing(this); //监听者
JPanel landminePanel = new JPanel(); //创建地雷面板
JPanel topPanel = new JPanel(); //创建顶部面板
public static ImageIcon dead = new ImageIcon("images/dead.gif");
public static ImageIcon smallIcon = new ImageIcon("images/smallIcon_10.png");
public static MyButton [][] lei; //按钮数组
public static int numberOfUnflaged ; //未标记的雷数,显示在topPanel上,用于提示用户
public static int numberOfClicked ; //已经翻开的格子数,当数字数字到"总格子数—雷数"时,即胜利
public static JLabel numberOfUnflagedLabel = new JLabel();
public Landmine()
{
super("扫雷,1.1版"); //标题
//setSize(800,800); //窗口尺寸
setBounds(300,90,800,800); //设置窗口位置和大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//最大化、最小化、关闭按钮
BorderLayout ff = new BorderLayout();//创建布局管理器
setLayout(ff);//关联布局管理器
//setResizable(false);//禁止最大化
numberOfClicked = 0;
numberOfUnflaged = 40;
/*设置地雷面板*/
GridLayout dd = new GridLayout(16,16);
landminePanel.setLayout(dd);//布局管理
lei = new MyButton[18][18];
for(int i=0; i<18; ++i)
{//创建下标0—17的按钮,18*18矩阵
for(int j=0; j<18; ++j)
{
lei[i][j] = new MyButton(i,j);
}
}
for(int i=1; i<17; ++i)
{//将下标1-16的按钮,加入面板、设置图标、翻开标记为假、加入监听者
for(int j=1; j<17; ++j)
{
landminePanel.add(lei[i][j]); //按钮加入地雷面板
lei[i][j].setIcon(smallIcon); //设置按钮图标
lei[i][j].isClicked = false; //翻开标记设置为 假lei[i][j].setIcon(dead);
lei[i][j].addActionListener(listener); //加入监听者
lei[i][j].addMouseListener(listener); //加入鼠标事件监听者
}
}
add(landminePanel,BorderLayout.CENTER); //landminePanel加入主框架中央
/*设置顶部面板*/
numberOfUnflagedLabel.setText("剩余雷数:"+numberOfUnflaged+" ");//显示剩余雷数
numberOfUnflagedLabel.setFont(new Font("null",Font.BOLD,20));//设置标签字体
numberOfUnflagedLabel.setIcon(new ImageIcon("images/Bomb.gif"));//标签图标(地雷形)
JButton aboutJB = new JButton("关于");//创建“关于”按钮
JButton helpJB = new JButton("求救"); //创建“求救”按钮
helpJB.addActionListener(listener); //"求救"按钮加入监听者
aboutJB.addActionListener(listener); //"关于"按钮加入监听者
topPanel.add(numberOfUnflagedLabel); //剩余雷数标签加入topPanel
topPanel.add(aboutJB); //“关于”按钮加入topPanel
topPanel.add(helpJB);
add(topPanel,BorderLayout.NORTH);//加入主面板上部
addLandmine();//布雷
setVisible(true);//显示之
}
/*布雷*/
public static void addLandmine()
{//随机将40的按钮的是否为雷的标记isBomb设为真
for(int count = 0; count<40; /*blank*/)
{
int i = (int)(Math.random()*100 % 16 +1 ) ;
int j = (int)(Math.random()*100 % 16 +1 ) ;
if(lei[i][j].isBomb == false)
{
lei[i][j].isBomb = true;
//lei[i][j].setIcon(dead);
count++;
}
}
}
//////// 主函数 /////////
public static void main(String[] argus)
{
Landmine Zhang = new Landmine();
}
//////////////////////////////////////
}
//
// Playing类 执行操作
//
class Playing implements ActionListener,MouseListener
{
public static Landmine gui;
public static ImageIcon dead2 = new ImageIcon("images/dead.gif");
public static ImageIcon flagIcon = new ImageIcon("images/flag_2.png");//旗帜图标,用于标记地雷
public Playing(Landmine in )
{
gui = in;
}
public void actionPerformed(ActionEvent event)
{
//关于
if(event.getActionCommand()=="关于")
JOptionPane.showMessageDialog(null,"扫雷1.1版。。还…还是小老头出品");
//求救
if(event.getActionCommand()=="求救")
help();
MyButton receive = (MyButton)event.getSource();
if(receive.isBomb==true)
{//如果翻到了雷。。
receive.setIcon(dead2);
JOptionPane.showMessageDialog(null,"孩子,你挂了…");
int yourChose = JOptionPane.showConfirmDialog(null,"你可能是一不小心点错了,再来一局?" );//显示对话框
if(yourChose == JOptionPane.OK_OPTION)
{//点击“是”时
replay();
}
else
{//点击 “否” 或 “取消” 时退出程序
System.exit(0);
}
}
else if(receive.isClicked ==false)
{//未翻到雷
showBombNumber(receive);
}
}
public static void showBombNumber(MyButton in)
{//翻开点击的按钮
int numberOfLandmine = 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(new ImageIcon("images/"+numberOfLandmine+".png"));//根据周围的雷数显示数字图标
gui.numberOfClicked++;//翻开格子数+1
if(gui.numberOfClicked==216)
{//翻开216个格子时游戏成功,用户选择是否再来一局
int yourChoice = JOptionPane.showConfirmDialog(null,"恭喜你成功了!再来一盘吗?");
if(yourChoice == JOptionPane.OK_OPTION)
replay();
else
System.exit(0);
}
if(numberOfLandmine==0)
{//如果周围无雷,则将周围未翻开格子的全部翻开
if(gui.lei[in.num_x-1]
JAVA扫雷程序代码 详细注释
5星 · 超过95%的资源 需积分: 34 92 浏览量
2010-08-11
23:58:33
上传
评论 3
收藏 120KB RAR 举报
barryhappy
- 粉丝: 314
- 资源: 29
最新资源
- 基于matlab主成分分析图像压缩重建系统代码14
- C语言《基于AT89C52单片机搭建的PID直流电机控制程序,主要用于Proteus电路仿真》+源代码
- C++《基于规划和汽车动力学的自动驾驶项目仿真(基于ROS的自动驾驶项目仿真,使用DWA路径规划算法和双PID控制器)》+源代码
- vos3000客户端2.1.7.03、2.1.8.05、2.1.9.07
- c++《用于船舶控制方法研究的3D船舶运动仿真软件》+源代码
- globalmapper24
- Python 小游戏 (贪吃蛇、五子棋、扫雷、俄罗斯方块)源码.zip
- Map data that can be used for 2D raster map path planning
- 关于电子技术数字电路的芯片模拟.zip
- 普中开发板proteus仿真电路V2.6
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页