📄 minesquare.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package 挖雷游戏;/** * * @author Administrator */import java.awt.event.*;import java.awt.*;import javax.swing.*;import java.util.*;import java.io.*;public class MineSquare extends JPanel implements MouseListener{ int rows=10,cols=10,雷数=10; JButton buttonFace=null; Block block[][]; TimeCount time; CountMine count; String grade=null; RandomSetMine 随机布雷者; FindAroundMineNumber 确定周围雷数者; FindSafeArea 找出无雷连通区者; DetermineDigArea 成片挖开者; DetermineMineMarkIsRightOrWrong 确定雷标记是否正确者; FindAroundMineMarkNumber 确定周围雷标数目者; DecideWinner 判断是否胜利者; Record 记录对话框=null; public MineSquare(String grade,int mineNumber,int rows, int cols,JButton b,JDialog dialog) { this.grade=grade; this.rows=rows; this.cols=cols; 雷数=mineNumber; 判断是否胜利者=new DecideWinner(); 记录对话框=(Record)dialog; block=new Block[rows+1][cols+1]; buttonFace=b; time=new TimeCount(); count=new CountMine(雷数); count.textShowMine.setText(""+雷数); setLayout(new GridLayout(rows,cols)); for(int i=1;i<=rows;i++) {for(int j=1;j<=cols;j++) { block[i][j]=new Block(); block[i][j].设置在雷区中的位置(i,j); } } for(int i=1;i<=rows;i++) {for(int j=1;j<=cols;j++) { add(block[i][j].label); block[i][j].addMouseListener(this); } } 随机布雷者=new RandomSetMine(); 随机布雷者.随机布雷(雷数,block,rows,cols); 确定周围雷数者=new FindAroundMineNumber(); for(int i=1;i<=rows;i++) {for(int j=1;j<=cols;j++) { 确定周围雷数者.设置周围的雷数(i,j,block,rows,cols); } } } public void gameOver() { time.interrupt(); buttonFace.setIcon(new ImageIcon("哭脸.gif")); for(int i=1;i<=rows;i++) { for(int j=1;j<=cols;j++) { block[i][j].removeMouseListener(this); if(block[i][j].判断是否是雷()&&block[i][j].isOpaque()&&block[i][j].探雷标记!=0) { block[i][j].requestFocus(); block[i][j].setOpaque(false); } if(block[i][j].探雷标记==0&&!block[i][j].判断是否是雷()) { block[i][j].requestFocus(); block[i][j].探雷标记=-1; block[i][j].repaint(); block[i][j].setIcon(new ImageIcon("探雷错误.gif")); } } } } public void mousePressed(MouseEvent e) { boolean left=SwingUtilities.isLeftMouseButton(e); boolean right=SwingUtilities.isRightMouseButton(e); Block blockSource=(Block)e.getSource(); boolean 雷=blockSource.判断是否是雷(); if(left==true&&blockSource.isOpaque()==true&&blockSource.获取探雷标记()!=0) { try{time.start(); } catch(Exception ee){ } if(雷==true) { blockSource.requestFocus(); blockSource.setOpaque(false); blockSource.探雷标记=-1; blockSource.repaint(); blockSource.setIcon(new ImageIcon("触雷.gif")); gameOver(); } else { buttonFace.setIcon(new ImageIcon("微笑脸.gif")); if(blockSource.周围无雷==false&&blockSource.获取探雷标记()!=0) { blockSource.setOpaque(false); blockSource.探雷标记=-1; blockSource.repaint(); } if(blockSource.周围无雷==true&&blockSource.isOpaque()) { blockSource.setOpaque(false); Point blockPoint=(Point)blockSource.获取在雷区中的位置(); int i=blockPoint.x; int j=blockPoint.y; 找出无雷连通区者=new FindSafeArea(); Vector tree=找出无雷连通区者.确定无雷连通区(i,j,block,rows,cols); for(int index=0;index<tree.size();index++) { Point p=(Point)tree.elementAt(index); int m=p.x,n=p.y; for(int k=Math.max(m-1,1);k<=Math.min(m+1,rows);k++) { for(int t=Math.max(n-1,1);t<=Math.min(n+1,cols);t++) { if(block[k][t].探雷标记==0) { gameOver(); } else{ block[k][t].requestFocus(); block[k][t].setOpaque(false); block[k][t].探雷标记=-1; block[k][t].repaint(); } } } } tree.removeAllElements(); } } } if(right) { if(blockSource.探雷标记==0&&blockSource.isOpaque()) { count.countMineSub(); } if(blockSource.探雷标记==1&&blockSource.isOpaque()) { count.countMineAdd(); } } } public void mouseEntered(MouseEvent e) {} public void mouseReleased(MouseEvent e) { boolean success=判断是否胜利者.判断是否成功(雷数,block,rows,cols); if(success==true) { time.interrupt(); 记录对话框.setGrade(grade); int spendTime=Integer.parseInt(time.textShowTime.getText()); 记录对话框.setTime(spendTime); File f=new File("英雄榜.txt"); try{ FileInputStream in=new FileInputStream(f); ObjectInputStream object_in=new ObjectInputStream(in); Hashtable hashtable=(Hashtable)object_in.readObject(); object_in.close(); in.close(); String temp=(String)hashtable.get(grade); StringTokenizer fenxi=new StringTokenizer(temp,"#"); fenxi.nextToken(); int recordTime=Integer.parseInt(fenxi.nextToken()); if(spendTime<recordTime) 记录对话框.setVisible(true); } catch(Exception eee) { } } } public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) { if(SwingUtilities.isRightMouseButton(e)) { Block blockSource=(Block)e.getSource(); Point blockPoint=(Point)blockSource.获取在雷区中的位置(); int i=blockPoint.x; int j=blockPoint.y; 确定周围雷标数目者=new FindAroundMineMarkNumber(); int 周围雷标数=确定周围雷标数目者.获取周围雷标记的数目(i,j,block,rows,cols); int 周围雷数=blockSource.获取周围的雷数(); 确定雷标记是否正确者=new DetermineMineMarkIsRightOrWrong(); boolean correct=确定雷标记是否正确者.判断雷标记是否正确(i,j,block,rows,cols); if(blockSource.isOpaque()==false&&周围雷数>0&&correct) { 成片挖开者=new DetermineDigArea(); Vector tree=成片挖开者.确定成片挖开区域(i,j,block,rows,cols); for(int index=0;index<tree.size();index++) { Point p=(Point)tree.elementAt(index); int m=p.x,n=p.y; for(int k=Math.max(m-1,1);k<=Math.min(m+1,rows);k++) { for(int t=Math.max(n-1,1);t<=Math.min(n+1,cols);t++) { if(block[k][t].isOpaque()&&!block[k][t].判断是否是雷()&& block[k][t].探雷标记!=0) { block[k][t].requestFocus(); block[k][t].setOpaque(false); block[k][t].探雷标记=-1; block[k][t].repaint(); } repaint(); } } } tree.removeAllElements(); } if(blockSource.isOpaque()==false&&周围雷标数==周围雷数&&!correct) { gameOver(); } if((blockSource.isOpaque())==false&&(周围雷标数!=周围雷数)) { } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -