?? 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 + -