|
SaoLei .java 类
package SaoLeiChengXu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SaoLei extends MouseAdapter implements ActionListener {
JFrame kuangJia; //程序的主界面
LeiDian leiQu[]; //雷区
JLabel biaoQian1; //设置地雷数量的标签
JTextField leiShuQu; //设置地雷数量的文本框
JButton kaiShi; //开始按钮
JLabel biaoQian2; //显示当前地雷状态的标签
JPanel zhongMianBan;
JPanel nanMianBan;
int x;
public SaoLei(){
/*---------------框架的初始化----开始--------*/
kuangJia=new JFrame("扫雷"); //生成框架,并给标题栏设置“计算器”
kuangJia.setSize(606, 700); //设置框架尺寸
kuangJia.setLocation(660, 190); //设置位置坐标
kuangJia.setLayout(new BorderLayout()); //设置框架为border布局
//kuangJia.setResizable(false); //关闭框架尺寸可调
kuangJia.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭按钮退出即关闭
/*---------------框架的初始化----结束--------*/
zhongMianBan=new JPanel(); //整体框架布局(border布局)
kuangJia.add(zhongMianBan,BorderLayout.CENTER);
zhongMianBan.setBackground(Color.gray);
zhongMianBan.setLayout(new GridLayout(12,12,1,1)); //中面板布局(grid布局)
int i;
leiQu=new LeiDian[144];
for(i=0;i<=143;i++){
leiQu=new LeiDian();
leiQu.shiFouDiLei=false;
leiQu.addMouseListener(this);
leiQu.addActionListener(this);
zhongMianBan.add(leiQu);
}
nanMianBan=new JPanel(); //南面板布局(grid布局)
kuangJia.add(nanMianBan,BorderLayout.SOUTH);
nanMianBan.setLayout(new GridLayout(1,4,5,5));
nanMianBan.setBackground(Color.white);
biaoQian1=new JLabel("设置地雷数");
leiShuQu =new JTextField("10");
kaiShi =new JButton("开始");
kaiShi.addActionListener(this);
biaoQian2=new JLabel("当前地雷数:10");
nanMianBan.add(biaoQian1 );
nanMianBan.add(leiShuQu );
nanMianBan.add(kaiShi );
nanMianBan.add(biaoQian2 );
kuangJia.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int i;
if(e.getSource().equals(kaiShi)){
; //初始化,新开一局游戏。
buLei();
jiSuanLeiShu();
}
for(i=0;i<=143;i++){
if(e.getSource().equals(leiQu)){ //如果i号按钮被左键点击
if(leiQu.shiFouDiLei==true){
leiQu.setText("X");
leiQu.setForeground(Color.red);
JOptionPane.showMessageDialog(null, "你踩到地雷了,按确定继续", "踩到地雷", 2);
}
else{
if(leiQu.zhouBianDiLeiShu!=0){ //如果雷点周边地雷数不等于0
leiQu.setText(String.valueOf(leiQu.zhouBianDiLeiShu)); //显示出当前雷点的周边地雷数
}
leiQu.setBackground(Color.white);
leiQu.setForeground(Color.red);
leiQu.setEnabled(false);
}
}
}
}
public void buLei(){ //布雷
int i=1;
while(i<=10){
x=(int)(Math.random()*144); //生成一个0-143之间的随机数
if(leiQu[x].shiFouDiLei!=true){ //随机数所在雷点是否不是地雷
leiQu[x].setText("X");
leiQu[x].setForeground(Color.red);
leiQu[x].shiFouDiLei=true; //设置当前雷点为地雷
i++; //地雷计数器增加1个
}
}
}
public void jiSuanLeiShu(){ //计算雷区中每个雷点周边八个格子的地雷数量
int c=0;
int n=0;
int i;
int s[]=new int[8];
for(n=0;n<=143;n++){
s[0]=n-13;s[1]=n-12;s[2]=n-11;s[3]=n-1;s[4]=n+1;s[5]=n+11;s[6]=n+12;s[7]=n+13; //计算八个方格的位置坐标
for(i=0;i<=7;i++){ //统计当前方格的周围地雷数
if(s>=0 && s<=143){
if(leiQu[s].shiFouDiLei==true){
c++;
}
}
}
// if(leiQu[n].shiFouDiLei==false && c!=0){ //显示当前方格周围的地雷数
// leiQu[n].setText(String.valueOf(c));
// }
leiQu[n].zhouBianDiLeiShu=c;
c=0; //统计变量归零
}
}
@Override
public void mouseClicked(MouseEvent me) {
// TODO Auto-generated method stub
if( me.getButton()==(MouseEvent.BUTTON3)){
((LeiDian)me.getSource()).setText("F");
((LeiDian)me.getSource()).setForeground(Color.red);
}
}
}
LeiDian.java类
package SaoLeiChengXu;
import javax.swing.*;
public class LeiDian extends JButton {
public boolean shiFouDiLei; //是否地雷属性,如果是true,表示是地雷,如果是false表示不是地雷
public int zhouBianDiLeiShu; //存放雷点周围八个格子里的地雷数量
}
Run.java类 运行类:
package SaoLeiChengXu;
public class Run {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SaoLei sl=new SaoLei();
}
}
运行效果图:
|
|