?? javaclearbomb.java
字號:
import java.awt.*;
import java.awt.event.*;
import java.math.*;
import java.util.*;
import javax.swing.*;
//程序入口
public class JavaClearBomb {
public static void main(String args[]){
DrawInterFace DIF=new DrawInterFace();
DIF.RandomMine();
}
}
//生成界面
class DrawInterFace{
//地雷標志,0無雷,1有雷
private static int fmine[]=new int[81];
//右鍵記錄標志
private static boolean rmouse;
//用來存放總地雷數
private static int fcount=10;
//存放剩余地雷數
private static int rcount;
//存放隨機生成的數
private static int r[]=new int[10];
//記錄標簽是否翻開標志
private static boolean appear[]=new boolean[81];
//記錄時間
private static long time=0;
//標記線程
private boolean stop = true;
//標記又右鍵
private static boolean rightclick[]=new boolean[81];
private Frame fr;
private Menu m1,m2;
private MenuBar mb;
private MenuItem mi11,mi12,mi13,mi14,mi15,mi19,mi110,mi21,mih;
private CheckboxMenuItem mi16,mi17,mi18;
//用CardLayout來放置按鈕和標簽,plbmine里包含lbmine和btmine,為了實現CardLayout的功能
private Panel pup,pdown;
private Label lbleft,lbright,lbover;
private Button btagain,btexit;
private JButton btstart;
private static Button btmine[];
private static Label lbmine[];
private static Panel plbmine[];
private int minenum=0;
private int mine[]=new int[10];
private static CardLayout CLayout=new CardLayout();
private Dialog digOver;
public DrawInterFace(){
//生成菜單欄
fr=new Frame("掃雷");
mb=new MenuBar();
fr.setMenuBar(mb);
m1=new Menu("游戲");
m2=new Menu("幫助");
mb.add(m1);
mb.setHelpMenu(m2);
mi11=new MenuItem("開局");
mi12=new MenuItem("初級");
mi13=new MenuItem("中級");
mi14=new MenuItem("高級");
mi15=new MenuItem("自定義");
mi16=new CheckboxMenuItem("標記");
mi17=new CheckboxMenuItem("顏色");
mi18=new CheckboxMenuItem("聲音");
mi19=new MenuItem("掃雷英雄榜");
mi110=new MenuItem("退出");
mih=new MenuItem("河海大學");
mi21=new MenuItem("06計算機周挺川");
m1.add(mi11);
m1.addSeparator();
m1.add(mi12);
m1.add(mi13);
m1.add(mi14);
m1.add(mi15);
m1.addSeparator();
m1.add(mi16);
m1.add(mi17);
m1.add(mi18);
m1.addSeparator();
m1.add(mi19);
m1.addSeparator();
m1.add(mi110);
m2.add(mih);
m1.addSeparator();
m2.add(mi21);
fr.setMenuBar(mb);
mb.add(m1);
mb.add(m2);
fr.setResizable(false);
fr.setLocation(500,200);
//生成時間顯示區,雷數顯示區和開始游戲按鈕
pup=new Panel();
pdown=new Panel();
pup.setLayout(new FlowLayout());
lbleft=new Label("0");
lbleft.setAlignment(Label.CENTER);
lbright=new Label("0");
lbright.setAlignment(Label.CENTER);
btstart=new JButton("",new ImageIcon("image/mine.gif"));
// lbleft.setLocation(1,10);
// lbright.setLocation(250,1);
// btstart.setBounds(125,1,24,24);
pup.add(lbleft);
pup.add(btstart);
pup.add(lbright);
//對話框
lbover=new Label("踩到雷了");
btagain=new Button("再玩一局");
btexit=new Button("算了");
digOver=new Dialog(fr,"你輸了");
digOver.setLayout(new FlowLayout());
digOver.setResizable(false);
digOver.setSize(250,70);
digOver.add(lbover);
digOver.add(btagain);
digOver.add(btexit);
btagain.addActionListener(new Restart());
btexit.addActionListener(new Exit());
digOver.setLocation(500,250);
//生成雷區
pdown.setLayout(new GridLayout(9,9,1,1));
btmine=new Button[81];
lbmine=new Label[81];
plbmine=new Panel[81];
for(int i=0;i<81;i++)
{
btmine[i]=new Button();
lbmine[i]=new Label();
lbmine[i].setBackground(Color.LIGHT_GRAY);
lbmine[i].setAlignment(Label.CENTER);//設定標簽文字居中顯示
plbmine[i]=new Panel();
}
for(int i=0;i<81;i++)
{
plbmine[i].setLayout(CLayout);
plbmine[i].add(btmine[i],"up");
plbmine[i].add(lbmine[i],"up");
pdown.add(plbmine[i],"down");
}
//設定雷區按鈕的監聽
for(int i=0;i<81;i++)
{
btmine[i].addActionListener(new BombAction());
btmine[i].addMouseListener(new UnitEvent(i));
}
//設定開始按鈕的監聽
btstart.addActionListener(new Start());
//畫出panel
fr.add(pup,"North");
fr.add(pdown,"South");
fr.setSize(222,300);
fr.setVisible(true);
fr.addWindowListener(new WindowClosing());
//初始化
for(int i=0;i<81;i++)
{
fmine[i]=0;
appear[i]=false;
rightclick[i]=false;
}
rmouse=false;
rcount=10;
lbright.setText(Integer.toString(rcount));
}
//隨機生成10個大小介于0到80之間的整數并對雷進行標記(算法有待優化)
public static void RandomMine(){
//存到fmine[i]中,1為雷,0沒有
Random rm=new Random();
for(int i=0;i<10;i++){
r[i]=rm.nextInt(80);
for(int j=0;j<i;j++){
while((r[i]==r[j])&&(i!=j)){
r[i]=rm.nextInt(80);
};
}
}
for(int i=0;i<10;i++)
{
fmine[r[i]]=1;
}
}
//計算某方格周圍的雷數
static int HowManyMine(int x){
int temp=0;
switch (x){
//左上角
case 0: temp=fmine[x+1]+fmine[x+9]+fmine[x+10];break;
//右上角
case 8: temp=fmine[x-1]+fmine[x+8]+fmine[x+9];break;
//左下角
case 72: temp=fmine[x-9]+fmine[x-8]+fmine[x+1];break;
//右下角
case 80: temp=fmine[x-10]+fmine[x-9]+fmine[x-1];break;
//上邊
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7: temp=fmine[x-1]+fmine[x+1]+fmine[x+8]+fmine[x+9]+fmine[x+10];break;
//下邊
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
case 79: temp=fmine[x-10]+fmine[x-9]+fmine[x-8]+fmine[x-1]+fmine[x+1];break;
//左邊
case 9:
case 18:
case 27:
case 36:
case 45:
case 54:
case 63: temp=fmine[x-9]+fmine[x-8]+fmine[x+1]+fmine[x+9]+fmine[x+10];break;
//右邊
case 17:
case 26:
case 35:
case 44:
case 53:
case 62:
case 71: temp=fmine[x-10]+fmine[x-9]+fmine[x-1]+fmine[x+8]+fmine[x+9];break;
//其余
default: temp=fmine[x-10]+fmine[x-9]+fmine[x-8]+fmine[x-1]+fmine[x+1]+fmine[x+8]+fmine[x+9]+fmine[x+10];break;
}
return temp;
}
//判斷標簽是否已經顯示
////展開雷區方法(此算法嚴重需要改進)
static void ClickMine(int i){
CLayout.last(plbmine[i]);
if(fmine[i]==1) {
System.out.println("踩到雷了");
return;
}
else {
if(HowManyMine(i)==0)
{
CLayout.last(plbmine[i]);
appear[i]=true;
}
else{
CLayout.last(plbmine[i]);
appear[i]=true;
return;
}
}
btmine[i].setVisible(false);
switch (i){
//左上角
case 0: {if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
//右上角
case 8: {if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}break;}
//左下角
case 72: {if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}break;}
//右下角
case 80: {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}break;}
//上邊
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7: {if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
//下邊
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
case 79: {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}break;}
//左邊
case 9:
case 18:
case 27:
case 36:
case 45:
case 54:
case 63: {if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
//右邊
case 17:
case 26:
case 35:
case 44:
case 53:
case 62:
case 71: {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}break;}
//其余
default: {if(appear[i-10]==false){CLayout.last(plbmine[i-10]);ClickMine(i-10);appear[i-10]=true;}if(appear[i-9]==false){CLayout.last(plbmine[i-9]);ClickMine(i-9);appear[i-9]=true;}if(appear[i-8]==false){CLayout.last(plbmine[i-8]);ClickMine(i-8);appear[i-8]=true;}if(appear[i-1]==false){CLayout.last(plbmine[i-1]);ClickMine(i-1);appear[i-1]=true;}if(appear[i+1]==false){CLayout.last(plbmine[i+1]);ClickMine(i+1);appear[i+1]=true;}if(appear[i+8]==false){CLayout.last(plbmine[i+8]);ClickMine(i+8);appear[i+8]=true;}if(appear[i+9]==false){CLayout.last(plbmine[i+9]);ClickMine(i+9);appear[i+9]=true;}if(appear[i+10]==false){CLayout.last(plbmine[i+10]);ClickMine(i+10);appear[i+10]=true;}break;}
}
}
//內部類實現監聽,實現掃雷中心算法
class BombAction implements ActionListener{
public void actionPerformed(ActionEvent e){
if(stop==true){
new Clock().start();
}
stop = false;
for (int i=0;i<81;i++){
if (e.getSource()==btmine[i]&&rightclick[i]==true) return;
}
for (int i=0;i<81;i++){
lbmine[i].setText(Integer.toString(HowManyMine(i)));
if(HowManyMine(i)==0) {lbmine[i].setText("");}
if (e.getSource()==btmine[i])
{
if(fmine[i]==1)
{
//判斷是否失敗
stop=true;
digOver.setVisible(true);
fr.setEnabled(false);
}
else
{
//實現展開雷區(較難算法)
ClickMine(i);
//判斷是否勝利(要改進)
int win=0;
for(int j=0;j<81;j++){
if(appear[j]==true) win++;
}
if(win==71){
stop=true;
lbover.setText("用時"+time+"秒");
digOver.setTitle("你贏了");
digOver.setVisible(true);
}
}
}
}
}
}
//右鍵標記
//線程實現記時
class Clock extends Thread{
public void run(){
while(stop==false){
try{
sleep(1000);
}
catch(InterruptedException e){
System.out.println(e.getMessage());
}
time++;
lbleft.setText(String.valueOf(time));
}
return;
}
}
//開始按鈕的監聽
class Start implements ActionListener{
public void actionPerformed(ActionEvent e){
for(int i=0;i<81;i++)
{
fmine[i]=0;
appear[i]=false;
lbmine[i].setText("");
btmine[i].setVisible(true);
CLayout.first(plbmine[i]);
btmine[i].setLabel("");
btmine[i].setEnabled(true);
rightclick[i]=false;
}
btstart.setIcon(new ImageIcon("image/mine.gif"));
RandomMine();
rcount=10;
lbright.setText(Integer.toString(rcount));
//初始化線程
stop = true;
time=0;
lbleft.setText(Long.toString(time));
}
}
//右擊事件
class UnitEvent extends MouseAdapter{
private int i;
public UnitEvent(int i){
this.i=i;
}
public void mouseClicked(MouseEvent e){
if(e.getModifiers()==InputEvent.BUTTON1_MASK){
}
if(e.getModifiers()==InputEvent.BUTTON2_MASK){
}
if(e.getModifiers()==InputEvent.BUTTON3_MASK){
if(btmine[i].getLabel()==""){
btmine[i].setLabel("▲");
rightclick[i]=true;
rcount--;
lbright.setText(String.valueOf(rcount));
return;
}
if(btmine[i].getLabel()=="▲"){
btmine[i].setLabel("?");
btmine[i].setEnabled(true);
rightclick[i]=false;
rcount++;
lbright.setText(String.valueOf(rcount));
return;
}
if(btmine[i].getLabel()=="?"){
btmine[i].setLabel("");
return;
}
}
}
}
//對話框按鈕的監聽
class Restart implements ActionListener{
public void actionPerformed(ActionEvent e){
new Start().actionPerformed(e);
digOver.setVisible(false);
fr.setEnabled(true);
lbover.setText("踩到雷了");
digOver.setTitle("你輸了");
}
}
class Exit implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
//內部類關閉窗口
class WindowClosing extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -