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;
}
没有合适的资源?快使用搜索试试~ 我知道了~
用JAVA编写的一个挖雷的小游戏
共53个文件
class:20个
java:9个
root:7个
需积分: 11 13 下载量 164 浏览量
2008-09-19
18:48:36
上传
评论
收藏 36KB RAR 举报
温馨提示
这是我在学习JAVA时,编写的一个挖雷的小游戏,它实现了挖的几乎所有功能,不过还没有写用时和记录最高分.
资源推荐
资源详情
资源评论
收起资源包目录
mine.rar (53个子文件)
mine
.project 380B
bin
CVS
Repository 10B
Root 35B
com
xinxi
mine
MyWindowEvent.class 508B
Fail.class 1KB
GameMain.class 5KB
Constant.class 894B
Distributing.class 3KB
Success.class 1KB
MainFrame.class 2KB
test
panel.class 5KB
sweepmine$menulistener.class 2KB
Test2.class 2KB
Test.class 2KB
MyListener.class 1KB
frame.class 545B
panel$buttonclick.class 2KB
panel$textfieldclick.class 2KB
Test2$1.class 680B
sweepmine$menuaction.class 904B
Test2$MyListener.class 1KB
Test2$MyThread.class 1KB
sweepmine.class 3KB
CVS
Entries 108B
Repository 6B
Root 35B
image
white.gif 990B
black.gif 890B
src
CVS
Entries 11B
Repository 10B
Root 35B
com
CVS
Entries 13B
Repository 14B
Root 35B
xinxi
mine
MainFrame.java 1KB
Success.java 1011B
CVS
Entries 282B
Repository 25B
Root 35B
Constant.java 667B
GameMain.java 6KB
Fail.java 1015B
Distributing.java 3KB
CVS
Entries 24B
Repository 20B
Root 35B
test
CVS
Entries 135B
Repository 25B
Root 35B
Test.java 2KB
sweepmine.java 8KB
Test2.java 2KB
.classpath 232B
共 53 条
- 1
资源评论
新溪-gordon
- 粉丝: 21
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功