?? javamines.java
字號:
import java.awt.*;
import java.awt.image.*;
import java.applet.Applet;
import java.util.Vector;
import mines;
import cell;
import custombutton;
import digitaldisplay;
public class JavaMines extends Applet implements Runnable{
mines cm=null;
int RowsXCols;
Vector ArrayOfControl, ArrayOfImages;
boolean YouLose=false,started=false;
int founded=0,flaged=0;
MediaTracker tracker;
Image img, flag, mina, ask, smile, smile1, smile2;
// 為節省圖片的上載時間將表示數字的圖片整合到一張圖片中
// 在該圖片中數字的具體順序安排是: 1 2 3 4 5 6 7 8 * ? F
Image strip;
Panel p;
custombutton cButt;
digitaldisplay dd1,dd2;
Thread clock=null;
int clockvalue=99;
//初始化
public void init(){
tracker = new MediaTracker(this);
img = getImage(getCodeBase(),"back.gif");
tracker.addImage(img, 0);
smile = getImage(getCodeBase(),"smile.gif");
tracker.addImage(smile, 0);
smile1 = getImage(getCodeBase(),"smile1.gif");
tracker.addImage(smile1, 0);
smile2 = getImage(getCodeBase(),"smile2.gif");
tracker.addImage(smile2, 0);
strip = getImage(getCodeBase(),"strip.gif");
tracker.addImage(strip, 0);
// 該向量實現一個控件數組
ArrayOfControl=new Vector();
ArrayOfImages=new Vector();
// 這是擁有游戲區的panel
p=new Panel();
try {
//開始下載圖片,直到全部完成
tracker.waitForAll();
} catch (InterruptedException e) {}
// 這些圖片來自strip
mina=createImage(new FilteredImageSource(strip.getSource(),new CropImageFilter(88,0,11,11)));
ask=createImage(new FilteredImageSource(strip.getSource(),new CropImageFilter(99,0,11,11)));
flag=createImage(new FilteredImageSource(strip.getSource(),new CropImageFilter(110,0,11,11)));
// 將圖片安排在一個數組中,以便可以使用一個整數來恢復它們
ArrayOfImages.setSize(17);
for (int i=1;i<=8;i++) {
Image tmpimg=createImage(new FilteredImageSource(strip.getSource(),new CropImageFilter((i-1)*11,0,11,11)));
ArrayOfImages.setElementAt(tmpimg, i);
}
ArrayOfImages.setElementAt(mina, 16);
setLayout(new FlowLayout(FlowLayout.CENTER,5,10));
cButt= new custombutton(smile,this,30,30);
dd1=new digitaldisplay(false, 2, Color.black, Color.red);
dd2=new digitaldisplay(false, 2, Color.black, Color.red);
add(dd2);
add(cButt);
add(dd1);
}
//啟動線程
public void start() {
if (!started) {
started=true;
startGame();
} //!started
}
//開始游戲
void startGame() {
cButt.setImage(smile);
clockvalue=99;
// Mines類支持不同大小和數量的雷,但是當前的GUI不支持,
//如果改變了該變量的值,(即改變雷的大小和數量)可能會遇到布局管理問題
cm= new mines(8,8,10);
RowsXCols=cm.Rows()*cm.Cols();
p.setLayout(new GridLayout(cm.Rows(),cm.Cols()));
for (int i=0; i< RowsXCols; i++){
cell c= new cell(null,this,16,16);
p.add(c);
ArrayOfControl.addElement(c);
}
dd2.SetValue(Integer.toString(cm.Mines()));
add(p);
p.validate();
if (clock==null){
clock=new Thread(this);
clock.start();
}
}
public void stop() {
clock=null;
}
public void run() {
while(clock!=null){
try {Thread.sleep(1000);} catch (InterruptedException e) {}
clockvalue--;
if (clockvalue==0) { /* 設置時鐘 */
YouLose=true;
cButt.setImage(smile2);
clock=null;
ShowAll();
} else {
dd1.SetValue(Integer.toString(clockvalue));
}
}
}
public void paint(Graphics g) {
//如果所有的圖片還沒有上載完成
if (!tracker.checkAll()) {
} else {
g.drawImage(img,0,0,this);
}
}
public Insets insets() { return new Insets(28,0,0,0); }
public boolean mouseUp(Event evt, int x, int y) {
if (evt.target instanceof custombutton) { //開始新游戲
started=true;
YouLose=false;
founded=0;flaged=0;clockvalue=99;
p.removeAll();
ArrayOfControl.setSize(0);
startGame();
}
return true;
}
public boolean mouseDown(Event evt, int x, int y) {
//判斷誰接收到了用戶的輸入
cell c=(cell)evt.target;
int btnIndex=ArrayOfControl.indexOf(evt.target);
int cv=cm.get_play_field(btnIndex);
cell tmpbtn;
int tmpcv; int i; int tmpint;
if (!YouLose) {//如果掃雷失敗
if ((cv & mines.SCOPERTA)==0) {
if(evt.modifiers==Event.META_MASK){
if (c.image==flag) {
c.setImage(ask);
flaged-=1;
dd2.SetValue(Integer.toString(cm.Mines()-flaged));
return true;
}
if (c.image==ask) { c.setImage(null); return true;}
c.setImage(flag);
flaged+=1;
dd2.SetValue(Integer.toString(cm.Mines()-flaged));
return true;
}
if (cv==mines.MINE) {
YouLose=true;
cButt.setImage(smile2);
clock=null;
ShowAll();
}
cm.toShow.setSize(0);
cm.Show(btnIndex/cm.Rows(),btnIndex%cm.Rows());
for (i=0;i<cm.toShow.size();i++){
tmpint=((Integer)cm.toShow.elementAt(i)).intValue();
tmpbtn=(cell)ArrayOfControl.elementAt(tmpint);
tmpcv=cm.get_play_field(tmpint);
tmpbtn.setImage(IntToImage(tmpcv & mines.MASK));
tmpbtn.disableCell();
tmpcv=tmpcv | mines.SCOPERTA;
founded++;
if (founded==(RowsXCols-cm.Mines())) {
YouLose=true;
cButt.setImage(smile1);
clock=null;
}
cm.set_play_field(tmpint,tmpcv);
}
return true;
}
return true;
} //返回掃雷失敗
return true;
}
void ShowAll(){
int i, cv;
cell c;
for (i=0;i<ArrayOfControl.size();i++){
c=(cell)ArrayOfControl.elementAt(i);
cv=cm.get_play_field(i);
if (cv==mines.MINE) {
c.setImage(IntToImage(cv));
}
}
}
Image IntToImage(int i){
Image img=null;
img=(Image)ArrayOfImages.elementAt(i);
return img;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -