📄 sweepmine.java
字号:
package com.xinxi.test;
import java.applet.*;
import java.net.URL;
import sun.audio.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class sweepmine
{
public static void main(String[] args)
{
sweepmine initer = new sweepmine();
initer.init();
try//背景音乐
{
InputStream in = new FileInputStream ("c:\\beep.wav");
AudioStream as = new AudioStream (in);
AudioPlayer.player.start (as);
}
catch (IOException e)
{
System.err.println(e);
}
}
void init()
{
mineframe = new frame(9,9,10);
JMenuBar menubar = new JMenuBar();
mineframe.setJMenuBar(menubar);
JMenu gamemenu= new JMenu("游戏(G)");
menubar.add(gamemenu);
JMenu helpmenu= new JMenu("帮助(H)");
menubar.add(helpmenu);
Action middleaction =new menuaction("开局(N)");
JMenuItem start = gamemenu.add(middleaction);
gamemenu.addSeparator();
ActionListener listener =new menulistener();
JMenuItem junior = new JMenuItem("初级(J)");
junior.setName("junior");
junior.addActionListener(listener);
gamemenu.add(junior);
JMenuItem middle = new JMenuItem("中级(M)");
middle.setName("middle");//下面监听器要用
middle.addActionListener(listener);
gamemenu.add(middle);
JMenuItem senior = new JMenuItem("高级(S)");
senior.setName("senior");
senior.addActionListener(listener);
gamemenu.add(senior);
mineframe.setTitle("扫雷");
mineframe.setSize(189,232);//因面板没有布局,所以只能制定框架的大小
mineframe.setLocation(400,300);
mineframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mineframe.setVisible(true);
mineframe.setResizable(false);
}
private class menulistener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
JMenuItem temp=(JMenuItem)event.getSource();
String name = temp.getName();
mineframe.remove(mineframe.minepanel);//移除原面板
if(name.equals("middle"))
{
mineframe.minepanel = new panel(16,16,40);//重新构造面板,面板为框架的属性
mineframe.setSize(329,372);
}
else if(name.equals("junior"))
{
mineframe.minepanel = new panel(9,9,10);
mineframe.setSize(189,232);
}
else
{
mineframe.minepanel = new panel(30,16,99);
mineframe.setSize(609,372);
}
mineframe.add(mineframe.minepanel);
mineframe.minepanel.laymine();
mineframe.validate();//刷新界面
}
}
private class menuaction extends AbstractAction//菜单动作
{
public menuaction(String s)
{
super(s);
}
public void actionPerformed(ActionEvent event)
{
mineframe.minepanel.refresh();
}
}
frame mineframe;//框架为主类的属性
}
class frame extends JFrame
{
public frame(int m,int n,int o)
{
minepanel = new panel(m,n,o);
add(minepanel);
minepanel.laymine();
}
panel minepanel;
}
class panel extends JPanel
{
private JTextField[][] textfield;
private JButton[][] button ;
private boolean flag;
private int row;
private int cols;
private int minecount;
public panel(int m,int n,int count)
{
setLayout(null);//不知道有没有三维布局?
button = new JButton[m][n];
textfield = new JTextField[m][n];
row=m;
cols=n;
minecount=count;
for( int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
button[i][j]= new JButton();
textfield [i][j]= new JTextField();
add(button[i][j],null);
add(textfield[i][j],null);
button[i][j].setBounds(new Rectangle(i*20, j*20,20, 20));
textfield [i][j].setBounds(new Rectangle(i*20, j*20,20, 20));//用这种方法实现三维布局
textfield [i][j].setEditable(false);
textfield [i][j].setVisible(false);
textfield [i][j].setHorizontalAlignment(JTextField.CENTER);
button[i][j].setMargin(new Insets(2,0,2,0)); //设置了边框
button[i][j].addMouseListener(new buttonclick(i,j));
textfield [i][j].addMouseListener(new textfieldclick(i,j));
}
}
}
public void refresh()//重新开局的实现
{
for( int i=0;i<row;i++)
for(int j=0;j<cols;j++)
{
textfield [i][j].setVisible(false);
textfield [i][j].setText("");
button [i][j].setVisible(true);
button[i][j].setText("");
}
flag=false;
laymine();
}
public void ifsuccess()//判断是否扫雷成功
{
int total=0;
for( int i=0;i<row;i++)
for(int j=0;j<cols;j++)
{
if(button [i][j].isVisible()==true)
{
total+=1;
}
}
if(total==minecount)
{
for( int i=0;i<row;i++)
for(int j=0;j<cols;j++)
{
if(button [i][j].isVisible()==true)
{
button[i][j].setText("&");
}
}
flag=true;
}
}
public void laymine()//布雷方法
{
java.util.Random s=new java.util.Random();
for( int i=0;i<minecount;i++)
{
int x =s.nextInt(row);
int y =s.nextInt(cols);
if(textfield[x][y].getText().equals("*"))//有可能重叠
i--;
else
textfield [x][y].setText("*");
}
for( int i=0;i<row;i++)
{
for(int j=0;j<cols;j++)
{
String flag =textfield [i][j].getText();
if(!flag.equals("*"))
{
int value=this.countmine(i,j);
textfield [i][j].setText(""+value);
}
}
}
}
public int countmine(int x,int y){//计算周围的雷数
int count =0;
int a=x-1<0?0:x-1;
int b=x+1>row-1?row-1:x+1;
int c=y-1<0?0:y-1;
int d=y+1>cols-1?cols-1:y+1;
for(int i=a;i<=b;i++)
for(int j=c;j<=d;j++){
String flag =textfield [i][j].getText();
if(flag.equals("*"))
count+=1;
}
return count;
}
private class buttonclick extends MouseAdapter//按钮的监听器
{
public buttonclick(int a,int b)
{
x=a;
y=b;
}
public void mouseClicked(MouseEvent e)
{
if(flag==true)
return;
if(e.getButton()==MouseEvent.BUTTON1)//左键单击
{
button[x][y].setText("");
button[x][y].setVisible(false);
textfield[x][y].setVisible(true);
if(textfield[x][y].getText().equals("*"))//如果是雷,游戏结束
{
flag=true;
for( int i=0;i<row;i++)
for(int j=0;j<cols;j++)
{
String flag =textfield [i][j].getText();
if(flag.equals("*"))
{
button[i][j].setVisible(false);
textfield[i][j].setVisible(true);
}
}
}
if(textfield[x][y].getText().equals("0"))//如果不是雷且周围没有雷,则打开周围区域
{
textfield[x][y].setText("");
open(x,y);
}
}
if(e.getButton()==MouseEvent.BUTTON3)//右键单击
{
button[x][y].setText("&");
}
ifsuccess();
}
int x;
int y;
}
public void open (int x,int y)//递归打开周围区域
{
int a=x-1<0?0:x-1;
int b=x+1>row-1?row-1:x+1;
int c=y-1<0?0:y-1;
int d=y+1>cols-1?cols-1:y+1;
for(int i=a;i<=b;i++)
for(int j=c;j<=d;j++)
{
if(i==x && j==y)
continue;
if(button[i][j].getText().equals("&"))
continue;
button[i][j].setText("");
button[i][j].setVisible(false);
textfield[i][j].setVisible(true);
if(textfield[i][j].getText().equals("*"))//如果是雷,游戏结束
{
flag=true;
for( int m=0; m<row; m++){
for(int n=0; n<cols; n++) {
String flag =textfield [m][n].getText();
if(flag.equals("*")) {
button[m][n].setVisible(false);
textfield[m][n].setVisible(true);
}
}
}
}
}
for(int i=a;i<=b;i++)
for(int j=c;j<=d;j++)
{
if(textfield[i][j].getText().equals("0"))//递归打开
{
textfield[i][j].setText("");
open(i,j);
}
}
}
private class textfieldclick extends MouseAdapter//文本域监听器
{
public textfieldclick (int a,int b)
{
x=a;
y=b;
}
public void mousePressed(MouseEvent e)
{
if(flag==true)
return;
int test=(MouseEvent.BUTTON1_DOWN_MASK | MouseEvent.BUTTON3_DOWN_MASK);//左右键同时击下
if(!textfield [x][y].getText().equals(""))
{
if ((e.getModifiersEx() & test)==test)
{
int iconcount=0;
int a=x-1<0?0:x-1;
int b=x+1>row-1?row-1:x+1;
int c=y-1<0?0:y-1;
int d=y+1>cols-1?cols-1:y+1;
for(int i=a;i<=b;i++)
for(int j=c;j<=d;j++)
{
if(button[i][j].getText().equals("&"))
{
iconcount+=1;
}
}
if( iconcount==Integer.parseInt(textfield [x][y].getText()))//如果周围雷数和标记的雷数一样,则打开周围非雷的区域
{
open(x,y);
}
}
}
ifsuccess();
}
int x;
int y;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -