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