在MiningCanvas.java中添加如下代码
int empty;
static final int miningMapGrid=16;//雷区为16格x16格
static final int bombNum=52;//共有52颗雷
int miningMapLength,miningGridLength;//整个雷区的边长,每一个雷位格子的边长
int miningMapX,miningMapY;//雷区的左上角坐标
int selectedX,selectedY;//选择框的坐标,是在雷区里的坐标(1-16)
int player1Found,player2Found;//两个玩家的分值,即已经找到的雷数
int paintX,paintY;//要画出的区域的左上角坐标,是在雷区里的坐标(1-16)
int bombLeft;//剩下未扫出的雷数
static final int Player1X=10,Player1Y=30;//信息框中画出玩家一分数的坐标位置,相对于信息框左上角
static final int Player2X=10,Player2Y=90;//信息框中画出玩家二分数的坐标位置,相对于信息框左上角
static final int bombnowX=8,bombnowY=52;//信息框中画出剩余雷数的坐标位置,相对于信息框左上角
static final int bombMapW=10,bombMapH=12;//屏幕上能绘出的雷位的数量
Bomb[][] bombs;
boolean isPlayer1;//当前是否轮到玩家一扫雷
Alert winAlert;//显示输赢信息的Alert对象
String winString;//比出输赢后要输出的信息
boolean sbWon;//是否得出输赢
static final Font font = Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_SMALL);
//消息框中使用的字体
Image infoImg,splashImage;
Image unFoundGroundImg;
Image foundGroundImg;
Image player1BombImg,player2BombImg,player1TurnImg,player2TurnImg;
Image bomb1Img,bomb2Img,bomb3Img,bomb4Img,bomb5Img,bomb6Img,bomb7Img,bomb8Img;
//所有要用到的图片
public MiningCanvas(MiningMIDlet miningMIDlet){
...
try{//实例化游戏中需要的Image对象
unFoundGroundImg=Image.createImage("/unfoundGroundbig.png");
foundGroundImg=Image.createImage("/foundGroundbig.png");
player1BombImg=Image.createImage("/player1bombbig.png");
player2BombImg=Image.createImage("/player2bombbig.png");
bomb1Img=Image.createImage("/bomb1big.png");
bomb2Img=Image.createImage("/bomb2big.png");
bomb3Img=Image.createImage("/bomb3big.png");
bomb4Img=Image.createImage("/bomb4big.png");
bomb5Img=Image.createImage("/bomb5big.png");
bomb6Img=Image.createImage("/bomb6big.png");
infoImg=Image.createImage("/info.png");
splashImage=Image.createImage("/occo.png");
player1TurnImg=Image.createImage("/player1turn.png");
player2TurnImg=Image.createImage("/player2turn.png");
}catch(IOException e){}
isPlayer1=true;//初始化玩家先后顺序
miningGridLength=14;//初始化每一个雷位的边长
miningMapLength=14*12;//整个扫雷棋盘的边长
miningMapX=(canvasW-miningMapLength)/2;//屏幕上棋盘左上角的X坐标
miningMapY=(canvasH-miningMapLength)/2;//屏幕上棋盘左上角的Y坐标
selectedX=selectedY=miningMapGrid/2;//初始化选择框的坐标为
player1Found=player2Found=0;//初始化两个玩家的得分
paintX=paintY=3;//初始化整个雷区一开始在屏幕上显示的范围
sbWon=false;//初始化没有玩家获胜
bombLeft=bombNum;//初始化剩余雷数为总雷数
bombs=new Bomb[miningMapGrid+2][miningMapGrid+2];
bombInit();//初始化雷区
}
private void paintGameScreen(Graphics g){
paintPlayer(g,isPlayer1);
paintMiningMap(g);
paintInfo(g);
paintSelected(g);
}
protected void paintInfo(Graphics g){
g.drawImage(infoImg,miningMapX+bombMapW*miningGridLength+1,
miningMapY,Graphics.TOP|Graphics.LEFT);
g.setFont(font);
g.setColor(0x00FFFFFF);
g.drawString(String.valueOf(bombLeft),miningMapX+bombMapW*miningGridLength+bombnowX,
miningMapY+bombnowY,Graphics.TOP|Graphics.LEFT);
g.drawString(String.valueOf(player1Found),miningMapX+bombMapW*miningGridLength+Player1X,
miningMapY+Player1Y,Graphics.TOP|Graphics.LEFT);
g.drawString(String.valueOf(player2Found),miningMapX+bombMapW*miningGridLength+Player2X,
miningMapY+Player2Y,Graphics.TOP|Graphics.LEFT);
//这个方法中接下来的代码是用来在信息框中画出小地图,也就是屏幕上显示的地雷区域在整个雷区
中的位置
g.setColor(0x00777777);
g.fillRect(miningMapX+bombMapW*miningGridLength+1,miningMapY+8*miningGridLength+1,
2*miningGridLength-2,2*miningGridLength-1);
g.setColor(0x00000000);
g.drawRect(miningMapX+bombMapW*miningGridLength+1,miningMapY+8*miningGridLength+1,
2*miningGridLength-2,2*miningGridLength-1);
g.setColor(0x00BBBBBB);
g.fillRect(miningMapX+bombMapW*miningGridLength+4+2*(paintX-1),
miningMapY+8*miningGridLength+4+2*(paintY-1),12,17);
g.setColor(0x00FFFFFF);
g.drawRect(miningMapX+bombMapW*miningGridLength+4+2*(paintX-1),
miningMapY+8*miningGridLength+4+2*(paintY-1),12,17);
}
protected void paintPlayer(Graphics g,boolean isPlayer1){
if(isPlayer1)//在棋盘外围画出玩家颜色的外框
g.setColor(0x000000FF);
else
g.setColor(0x00FF0000);
for(int i=1;i<=5;i++){
g.drawRect(miningMapX-i,miningMapY-i,miningMapLength+2*i,miningMapLength+2*i);
}
if(isPlayer1)//在信息框中画出代表玩家的旗帜
g.drawImage(player1TurnImg,miningMapX+(bombMapW+1)*miningGridLength+1,
miningMapY+11*miningGridLength,Graphics.HCENTER|Graphics.VCENTER);
else
g.drawImage(player2TurnImg,miningMapX+(bombMapW+1)*miningGridLength+1,
miningMapY+11*miningGridLength,Graphics.HCENTER|Graphics.VCENTER);
}
public void paintMiningMap(Graphics g){
for(int i=0;i<bombMapH;i++){
for(int j=0;j<bombMapW;j++){//根据每个Bomb对象中的变量值画出不同的图片
if(!bombs[i+paintY+1][j+paintX+1].hasFound){
g.drawImage(unFoundGroundImg,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
}
else {
if(!bombs[i+paintY+1][j+paintX+1].isBomb){
switch(bombs[i+paintY+1][j+paintX+1].bombaround){
case 0:
g.drawImage(foundGroundImg,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
case 1:
g.drawImage(bomb1Img,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
case 2:
g.drawImage(bomb2Img,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
case 3:
g.drawImage(bomb3Img,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
case 4:
g.drawImage(bomb4Img,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
case 5:
g.drawImage(bomb5Img,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
case 6:
g.drawImage(bomb6Img,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
default:
g.drawImage(foundGroundImg,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
break;
}
}
else {
if(bombs[i+paintY+1][j+paintX+1].isPlayer1){
g.drawImage(player1BombImg,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
}
else{
g.drawImage(player2BombImg,miningMapX+j*miningGridLength,
miningMapY+i*miningGridLength,Graphics.TOP|Graphics.LEFT);
}
}
}
}
}
}
public void paintSelected(Graphics g){
g.setColor(0x00FF0000);//画出选择框,注意其与总雷区和能在屏幕上显示出的区域间的关系
g.drawRoundRect(miningMapX+(selectedX-paintX)*miningGridLength-1,
miningMapY+(selectedY-paintY)*miningGridLength-1,
miningGridLength+1,miningGridLength+1,2,2);
}
在keyPressed方法中的switch结构中添加
case GAMESTATE_GAMEING:
{
if(keyCode==FullCanvas.KEY_SOFTKEY1){
gamestate=GAMESTATE_GAMEMENU;
}
else if (action == FullCanvas.LEFT ) {
selectedX=(--selectedX+miningMapGrid)%(miningMapGrid);
}
else if (action == FullCanvas.RIGHT) {
selectedX=(++selectedX)%(miningMapGrid);
}
else if (action == FullCanvas.UP) {
selectedY=(--selectedY+miningMapGrid)%(miningMapGrid);
}
else if (action == FullCanvas.DOWN) {
selectedY=(++selectedY)%(miningMapGrid);
}
else if (action == FullCanvas.FIRE) {
if(!bombs[selectedY+1][selectedX+1].hasFound){
if(bombs[selectedY+1][selectedX+1].isBomb){
bombs[selectedY+1][selectedX+1].hasFound=true;
bombs[selectedY+1][selectedX+1].isPlayer1=this.isPlayer1;
if(isPlayer1)
player1Found++;
else
player2Found++;
bombLeft--;
checkWin();//每次有玩家挖到了雷就监测其是否胜出
}
else{
bombOut(selectedY+1,selectedX+1);
//如果此雷位及周围都无雷,打开所有与其相连的相同情况的雷位及此区域周边一圈雷位
isPlayer1=!isPlayer1;
}
}
}
//以下几行代码是调整显示在屏幕上的区域的坐标,以免选择框跑出屏幕范围
if((selectedX-paintX)<0)
paintX=selectedX;
else if((selectedX-paintX)>=bombMapW)
paintX=selectedX-bombMapW+1;
if((selectedY-paintY)<0)
paintY=selectedY;
else if((selectedY-paintY)>=bombMapH)
paintY=selectedY-bombMapH+1;
break;
} |