资源描述
package sweeper;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class JMine extends JFrame{
public int col = 10;//扫雷面板的列数
public int row = 10;//扫雷面板好行数
private int mineNum = 10;//地雷的个数
private int mineRemainNum = mineNum;
JButton[][] innitBoard = new JButton[row][col];//初始化面板
char[][] board = new char[row][col];
private int isClick[][] = new int[row][col];//用于记录按钮是否被点击过,点击过赋值为1,否则为0
private int count[][] = new int[row][col];//统计每个坐标周围地雷的个数
private boolean ismine = false;//判断是否踩到地雷
private boolean finish_click = true;
private boolean iswin = true ;
private int flagnum = 0;//记录插在地雷上小旗个个数
private MyThread mythread = new MyThread();
private static int time_start = 0;
private static int time =0;//用于计时
JLabel remain1 = new JLabel();//4个标签显示剩余地雷个数;
JLabel remain2 = new JLabel(new ImageIcon((mineRemainNum/100)+".png"));
JLabel remain3 = new JLabel(new ImageIcon((mineRemainNum/10)+".png"));
JLabel remain4 = new JLabel(new ImageIcon((mineRemainNum%10)+".png"));
static JLabel time1 = new JLabel(new ImageIcon("0.png"));
static JLabel time2 = new JLabel(new ImageIcon("0.png"));
static JLabel time3 = new JLabel(new ImageIcon("0.png"));
JButton restart;
public void innit(){
this.setSize(400,450);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());//主面板
this.setContentPane(panel);
layMines(); //随机布雷
JMenuBar bar = createBar(); //调用创建菜单栏的方法
this.setJMenuBar(bar); //与面板的添加的菜单栏无关,是窗体里面自带的添加菜单的方法
JPanel mineBoard = createBoard(); //调用创建扫雷主面板的方法
JPanel state = createState(); //调用创建状态栏的方法
panel.add(mineBoard,BorderLayout.CENTER);
panel.add(state,BorderLayout.NORTH);
for(int i=0;i<isClick.length;i++)
for(int j=0;j<isClick[i].length;j++){
isClick[i][j]=0;
}
}
public JPanel createBoard(){//创建地雷主面板的方法
JPanel mainBoard = new JPanel(new GridLayout(row,col));
for(int i=0;i<innitBoard.length;i++)
for(int j=0;j<innitBoard[i].length;j++){
innitBoard[i][j] = new JButton();
innitBoard[i][j].addMouseListener(new myClick());
mainBoard.add(innitBoard[i][j]);
}
return mainBoard;
}
public JMenuBar createBar(){ //创建菜单的函数
JMenuBar bar = new JMenuBar();
JMenu file =new JMenu("文件");
JMenu edit = new JMenu("编辑");
JMenu help = new JMenu("帮助");
JMenuItem start = new JMenuItem("开始");
JMenuItem exit = new JMenuItem("退出");
JMenuItem as = new JMenuItem("关于");
file.add(start);
file.add(exit);
help.add(as);
bar.add(file);
bar.add(edit);
bar.add(help);
return bar;
}
public JPanel createState(){ //创建状态栏的函数
JPanel state = new JPanel(new FlowLayout());
restart = new JButton(new ImageIcon("smile1.png"));
Insets space = new Insets(0,0,0,0);
restart.setMargin(space);//设置按钮上图片与四周的间距
restart.setPressedIcon(new ImageIcon("shy.png"));//按钮按下换图片
//JLabel time5 = new JLabel(new ImageIcon("负号.png"));
//JLabel time4 = new JLabel(new ImageIcon("0.png"));
state.add(remain1);
state.add(remain2);
state.add(remain3);
state.add(remain4);
state.add(restart);
state.add(time1);
state.add(time2);
//state.add(time5);
//state.add(time4);
state.add(time3);
return state;
}
public void layMines(){ //随机布雷
for(int i = 0;i<mineNum;i++){
int x = (int)(Math.random()*10); //math.random()是产生0-1之间的随机数
int y = (int)(Math.random()*10);
if(board[x][y] == '雷')
i--;
else
board[x][y] = '雷';
}
for(int i=0;i<board.length;i++)
for(int j=0;j<board[i].length;j++)
count[i][j] = count(i,j);
}
public int count(int x,int y){ //统计每个坐标周围地雷个数
int mineCount = 0;
for(int i = (x-1);i<=(x+1);i++) //对8个方向进行遍历
for(int j = (y-1);j<=(y+1);j++)
if(i>=0&&i<row&&j>=0&&j<col&&(!(i==x&&j==y))&&board[i][j] == '雷')//统计坐标除自身以外周围8个坐标的地雷个数
mineCount++;
return mineCount;
}
public void reStartButton(){
restart.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if(e.getButton()==MouseEvent.BUTTON1){
JMine.time=0;
JMine.time_start=0;
restart.setIcon(new ImageIcon("smile1.png"));
for(int i=0;i<innitBoard.length;i++)
for(int j=0;j<innitBoard[i].length;j++){
innitBoard[i][j].setIcon(null);
innitBoard[i][j].setEnabled(true);
board[i][j]=' ';
isClick[i][j]=0;
}
mineRemainNum = mineNum;
remain2.setIcon(new ImageIcon((mineRemainNum/100)+".png"));
remain3.setIcon(new ImageIcon((mineRemainNum/10)+".png"));
remain4.setIcon(new ImageIcon((mineRemainNum%10)+".png"));
JMine.time1.setIcon(new ImageIcon(time/100+".png"));
JMine.time2.setIcon(new ImageIcon(time%100/10+".png"));
JMine.time3.setIcon(new ImageIcon(time%10+".png"));
ismine = false;
layMines();
}
}
});}
class myClick implements MouseListener{ //添加按钮的鼠标事件
@Override
public void mouseClicked(MouseEvent e){
reStartButton();
if(ismine)
return;
JMine.time_start++;
for(int i=0;i<innitBoard.length;i++)
for(int j=0;j<innitBoard[i].length;j++){
if((e.getSource()==innitBoard[i][j])){
if(isClick[i][j]==0&&e.getButton()==MouseEvent.BUTTON1){//左击
isClick[i][j] = 1;
if(time_start==1){ //第一次点击按钮,启动线程
mythread= new MyThread();
mythread.start();
}
if (board[i][j] == '雷') {
mythread.stop();
//结束线程
for (int a = 0; a < board.length; a++)
for (int b = 0; b < board[a].length; b++)
if (board[a][b] == '雷'){
isClick[a][b] = 1;
innitBoard[a][b].setIcon(new ImageIcon("地雷.png"));
}
ismine = true;
restart.setIcon(new ImageIcon("cry.png"));
JOptionPane.showMessageDialog(JMine.this, "踩到地雷,游戏结束");
}
else{
if(count[i][j]!=0){
isClick[i][j] = 1;
innitBoard[i][j].setIcon(new ImageIcon(count[i][j]+".gif"));
}
else{
isClick[i][j] = 1;
innitBoard[i][j].setEnabled(false);//为零让按钮不可点
move(i,j);
}
isWin();
}
}
if(isClick[i][j]%2==0&&(e.getButton()==MouseEvent.BUTTON3)){//右击
isClick[i][j]+=2;
if(isClick[i][j]%4==0){
isClick[i][j]=0;
innitBoard[i][j].setIcon(new ImageIcon(""));
mineRemainNum++;//地雷个数加1
if(board[i][j]=='雷')
flagnum--;
}
else if(isClick[i][j]%4!=0){
innitBoard[i][j].setIcon(new ImageIcon("flag.jpg"));
mineRemainNum--;//地雷个数减1
if(board[i][j]=='雷')
flagnum++;
}
isWin();
if(mineRemainNum>=0&&mineRemainNum<=99){//地雷个数是两位数
remain2.setIcon(new ImageIcon((mineRemainNum/100)+".png"));
remain3.setIcon(new ImageIcon((mineRemainNum/10)+".png"));
remain4.setIcon(new ImageIcon((mineRemainNum%10)+".png"));
}
else if(mineRemainNum<0){
remain2.setIcon(new ImageIcon("负号.png"));
remain3.setIcon(new ImageIcon((Math.abs(mineRemainNum)/10)+".png"));
remain4.setIcon(new ImageIcon((Math.abs(mineRemainNum)%10)+".png"));
}
}
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
}
public void move(int x,int y){
for(int i = x-1;i<=(x+1);i++) //对8个方向进行遍历
for(int j = y-1;j<=(y+1);j++)
if(i>=0&&i<row&&j>=0&&j<col&&(!(i==x&&j==y))&&innitBoard[i][j].isEnabled()&&isClick[i][j]==0){//按钮处于能点状态
if(count[i][j]==0){
isClick[i][j] = 1;
innitBoard[i][j].setEnabled(false);
move(i,j);
}
else{
isClick[i][j] = 1;
innitBoard[i][j].setIcon( new ImageIcon(count(i,j)+".gif"));
}
}
}
public void isWin(){
for(int i =0;i<isClick.length;i++)
for(int j =0;j<isClick[i].length;j++){
if(isClick[i][j]==0){
finish_click = false;
break;
}
else
finish_click = true;
}
if(finish_click&&flagnum==10){
iswin =true;
JOptionPane.showMessageDialog(JMine.this, "恭喜你,胜利了!!");
mythread.stop();
}
}
class MyThread extends Thread{
@Override
public void run() {
try {
while(true){
time++;
JMine.time1.setIcon(new ImageIcon(time/100+".png"));
JMine.time2.setIcon(new ImageIcon(time%100/10+".png"));
JMine.time3.setIcon(new ImageIcon(time%10+".png"));
Thread.sleep(1000);
}
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
JMine mine = new JMine();
mine.innit();
}
}
展开阅读全文