📄 mainexe.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
import java.applet.*;
//Bomb 开始 定义地雷
class Bomb extends JLabel{
//存放图像标记:分别为数字0-8;
public static Icon icon[]={new ImageIcon("icon/0.jpg"),
new ImageIcon("icon/1.jpg"),
new ImageIcon("icon/2.jpg"),
new ImageIcon("icon/3.jpg"),
new ImageIcon("icon/4.jpg"),
new ImageIcon("icon/5.jpg"),
new ImageIcon("icon/6.jpg"),
new ImageIcon("icon/7.jpg"),
new ImageIcon("icon/8.jpg"),
//地雷标记:踩中地雷 地雷 地雷标识错误
new ImageIcon("icon/9.jpg"),
new ImageIcon("icon/10.jpg"),
new ImageIcon("icon/11.jpg"),
//怀疑按下 地雷标识 怀疑 默认
new ImageIcon("icon/12.jpg"),
new ImageIcon("icon/13.jpg"),
new ImageIcon("icon/14.jpg"),
new ImageIcon("icon/15.jpg")
};
public int num_x,num_y; //第几号方块
public int BombRoundCount; //周围雷数
public boolean isBomb; //是否为雷
public boolean isClicked; //是否被点击
public int BombFlag; //探雷标记
public Bomb(int x,int y) {
BombFlag = -1;
//num_x = x;
//num_y = y;
BombRoundCount = 0;
isBomb = false;
isClicked = false;
setIcon(icon[15]);
}
//设置显示图标
public void setBombIcon(int iconNum){
setIcon(icon[iconNum]);
}
//重置
public void reSet(){
BombFlag = -1;
BombRoundCount = 0;
isBomb = false;
isClicked = false;
setIcon(icon[15]);
}//重置完毕
}
//Bomb 结束
//LayTime 开始 显示用时的JLabel控件
class LayTime extends JLabel implements Runnable{
private volatile Thread t;
LayTime(){
super();
setText("0");
}
public void start(){
t=new Thread(this,"showtime");
t.start();
}
public void run(){
int usedtime=0;
Thread thisThread = Thread.currentThread();
while(t==thisThread){
try{
usedtime++;
setText(Integer.toString(usedtime));
t.sleep(1000);
} catch(InterruptedException e){
setText("无法准确显示时间");
}
}
}
public void stopShow(){
t=null;
}
}
//LayTime结束
//MyFrame 开始 定义程序运行框架
class MyFrame extends JFrame implements MouseListener{
public int RowNum=16,LineNum=30,BombNum=99; //当前行,列,雷数
private Panel mainPanel = new Panel();
private Bomb[][] bombButton;
//显示状态的控件
private JPanel StatusPanel= new JPanel();
private JLabel LeftBomb= new JLabel(Integer.toString(BombNum));//剩余雷数
private LayTime UseTime = new LayTime();//使用时间
private boolean gameBegin=false;//用于显示用时的控制变量
private Icon StatusBobIcon[]={new ImageIcon("icon/16.jpg"),
new ImageIcon("icon/17.jpg"),
new ImageIcon("icon/18.jpg"),
new ImageIcon("icon/19.jpg"),
new ImageIcon("icon/20.jpg"),
};
private JLabel StatusBon=new JLabel(StatusBobIcon[0]);
private boolean gameOver=false; //游戏是否结束
//初始化
MyFrame(){
super("扫雷 0.8");
Container c=getContentPane();
c.setBackground(Color.gray);
c.setLayout(new BorderLayout());
//初始化状态标签开始
StatusPanel.add(LeftBomb,BorderLayout.EAST);
StatusPanel.add(StatusBon);//,BorderLayout.CENTER);
StatusPanel.add(UseTime);//,BorderLayout.WEST);
c.add(StatusPanel,"North"); //初始化状态标签完毕
StatusBon.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent me){
replay();
StatusBon.setIcon(StatusBobIcon[0]);
}
public void mousePressed(MouseEvent e){
StatusBon.setIcon(StatusBobIcon[1]);
}
});
//初始化扫雷窗口
mainPanel.setLayout(new GridLayout(RowNum,LineNum));
bombButton=new Bomb[RowNum][];
for(int i = 0 ; i < RowNum; i++) {
bombButton[ i ]=new Bomb[LineNum];
}
for(int i=0;i<RowNum;i++)
for(int j=0;j<LineNum;j++){
bombButton[i][j]= new Bomb(i,j);
mainPanel.add(bombButton[i][j]);
}
c.add(mainPanel,"Center");//初始化扫雷窗口完毕
creatBomb();//开始布雷
CountRoundBomb();//计算周围雷数
mainPanel.addMouseListener(this);//添加监听器
setLocation(350,200);//确定程序窗口在显示屏幕中的位置
setResizable(false);
}//初始化完毕
//重新开始
public void replay() {
UseTime.stopShow();
UseTime.setText("0");
LeftBomb.setText(Integer.toString(BombNum));
for(int i=0;i<RowNum;i++)
for(int j=0;j<LineNum;j++){
bombButton[ i ][ j ].reSet();
}
creatBomb();//开始布雷
CountRoundBomb();//计算周围雷数
gameOver=false;
gameBegin=false;
}//完毕
//布雷
public void creatBomb() {
for(int i=0;i<BombNum;i++) {
int x =(int)(Math.random()*(RowNum-1));
int y =(int)(Math.random()*(LineNum-1));
if(bombButton[ x ][ y ].isBomb==true)
i--;
else
bombButton[ x ][ y ].isBomb=true ;
}
} //布雷完毕
//计算雷数
public void CountRoundBomb(){
int count;
for(int i=0;i<RowNum;i++)
for(int j=0;j<LineNum;j++){
count=0;
if(bombButton[i][j].isBomb==false){
if((i-1)>=0&&(j-1)>=0&&(bombButton[i-1][j-1].isBomb==true))
count++;//左上方
if((i-1)>=0&&(bombButton[i-1][j].isBomb==true))
count++;//上方
if((i-1)>=0&&(j+1)<LineNum&&(bombButton[i-1][j+1].isBomb==true))
count++;//右上方
if((j-1)>=0&&(bombButton[i][j-1].isBomb==true))
count++;//左边
if((j+1)<LineNum&&(bombButton[i][j+1].isBomb==true))
count++;//右边
if((i+1)<RowNum&&(j-1)>=0&&(bombButton[i+1][j-1].isBomb==true))
count++;//左下方
if((i+1)<RowNum&&(bombButton[i+1][j].isBomb==true))
count++;//下方
if((i+1)<RowNum&&(j+1)<LineNum&&(bombButton[i+1][j+1].isBomb==true))
count++;//右下方
}
bombButton[i][j].BombRoundCount=count;
}
}//计算雷数完毕
//挖雷
public void digBomb(int x,int y){
if(bombButton[x][y].isBomb==false){//不是地雷
if(bombButton[x][y].BombRoundCount==0){// 周围无雷
bombButton[x][y].setBombIcon(0);
digZeroBomb(x,y);
//bombButton[x][y].isClicked=true;
}
else{//周围有雷
bombButton[x][y].setBombIcon(bombButton[x][y].BombRoundCount);
bombButton[x][y].isClicked=true;
}
}
else{//踩中地雷
for(int i=0;i<RowNum;i++)
for(int j=0;j<LineNum;j++){
if(bombButton[i][j].isBomb==true)
bombButton[i][j].setBombIcon(10);
}
bombButton[x][y].setBombIcon(9);
StatusBon.setIcon(StatusBobIcon[3]);
gameOver=true;
UseTime.stopShow();
}
}//挖雷完毕
//当遇到空格周围没有地雷时的处理函数
public void digZeroBomb(int x,int y){
if(bombButton[x][y].isClicked==false){//此处主要是防止无限循环
bombButton[x][y].isClicked=true;
if((x-1)>=0&&(y-1)>=0){
if(bombButton[x-1][y-1].BombRoundCount==0){//周围无雷
bombButton[x-1][y-1].setBombIcon(0);
//bombButton[x-1][y-1].isClicked=true;
digZeroBomb(x-1,y-1);
}
else{
bombButton[x-1][y-1].setBombIcon(bombButton[x-1][y-1].BombRoundCount);
bombButton[x-1][y-1].isClicked=true;
}
}//左上方
if((x-1)>=0){
if(bombButton[x-1][y].BombRoundCount==0){//周围无雷
//bombButton[x-1][y].isClicked=true;
bombButton[x-1][y].setBombIcon(0);
digZeroBomb(x-1,y);
}
else{
bombButton[x-1][y].setBombIcon(bombButton[x-1][y].BombRoundCount);
bombButton[x-1][y].isClicked=true;
}
}//上方
if((x-1)>=0&&(y+1)<LineNum){
if(bombButton[x-1][y+1].BombRoundCount==0){//周围无雷
//bombButton[x-1][y+1].isClicked=true;
bombButton[x-1][y+1].setBombIcon(0);
digZeroBomb(x-1,y+1);
}
else{
bombButton[x-1][y+1].setBombIcon(bombButton[x-1][y+1].BombRoundCount);
bombButton[x-1][y+1].isClicked=true;
}
}//右上方
if((y-1)>=0){
if(bombButton[x][y-1].BombRoundCount==0){//周围无雷
//bombButton[x][y-1].isClicked=true;
bombButton[x][y-1].setBombIcon(0);
digZeroBomb(x,y-1);
}
else{
bombButton[x][y-1].setBombIcon(bombButton[x][y-1].BombRoundCount);
bombButton[x][y-1].isClicked=true;
}
}//左边
if((y+1)<LineNum){
if(bombButton[x][y+1].BombRoundCount==0){//周围无雷
//bombButton[x][y+1].isClicked=true;
bombButton[x][y+1].setBombIcon(0);
digZeroBomb(x,y+1);
}
else{
bombButton[x][y+1].setBombIcon(bombButton[x][y+1].BombRoundCount);
bombButton[x][y+1].isClicked=true;
}
}//右边
if((x+1)<RowNum&&(y-1)>=0){
if(bombButton[x+1][y-1].BombRoundCount==0){//周围无雷
//bombButton[x+1][y-1].isClicked=true;
bombButton[x+1][y-1].setBombIcon(0);
digZeroBomb(x+1,y-1);
}
else{
bombButton[x+1][y-1].setBombIcon(bombButton[x+1][y-1].BombRoundCount);
bombButton[x+1][y-1].isClicked=true;
}
}//坐下方
if((x+1)<RowNum){
if(bombButton[x+1][y].BombRoundCount==0){//周围无雷
//bombButton[x+1][y].isClicked=true;
bombButton[x+1][y].setBombIcon(0);
digZeroBomb(x+1,y);
}
else{
bombButton[x+1][y].setBombIcon(bombButton[x+1][y].BombRoundCount);
bombButton[x+1][y].isClicked=true;
}
}//下方
if((x+1)<RowNum&&(y+1)<LineNum){
if(bombButton[x+1][y+1].BombRoundCount==0){//周围无雷
//bombButton[x+1][y+1].isClicked=true;
bombButton[x+1][y+1].setBombIcon(0);
digZeroBomb(x+1,y+1);
}
else{
bombButton[x+1][y+1].setBombIcon(bombButton[x+1][y+1].BombRoundCount);
bombButton[x+1][y+1].isClicked=true;
}
}//右上方
}
}//处理完毕
//当按下鼠标按钮时的处理函数
public void mouseClicked(MouseEvent e) { //根据鼠标的左右键决定相应的行动
int x=0,y=0;//存放鼠标点击方块的坐标
int z=0;
y=e.getX()/16;
x=e.getY()/16;
boolean right = SwingUtilities.isRightMouseButton(e);
if(gameOver==false){
if(right){//点击右键
if(bombButton[x][y].isClicked==false){
z=13+(++bombButton[x][y].BombFlag)%3;
bombButton[x][y].setBombIcon(z);//确定载入图像
}
}
if(!right){//点击左键
if(bombButton[x][y].isClicked==false&&(bombButton[x][y].BombFlag%3!=0)){
//bombButton[x][y].isClicked=true;
digBomb(x,y);
}
}
}
if((gameBegin==false)&&(!gameOver)){//此处添加!gameOver主要是当第一次按键就中雷时停止显示
//LayTime laytime=new LayTime(StatusBon);
gameBegin=true;
UseTime.start();
//laytime.start();
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
StatusBon.setIcon(StatusBobIcon[0]);
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
StatusBon.setIcon(StatusBobIcon[2]);
}
}//MyFrame 结束
//程序主控函数
public class MainExe{
public static void main(String[] args){
JFrame.setDefaultLookAndFeelDecorated(true);
MyFrame MainFrame= new MyFrame();
MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示窗口
MainFrame.pack();
MainFrame.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -