CrazyPuzzle的完整源代码,整个架构已经基本打好,但因为某些原因,部分功能尚未实现,在此一并贴出来.如果各位朋友有兴趣,可自行完善相应功能.
//------------------------------
//MyGameCanvas.java
//------------------------------
package src;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;//西门子C65不支持,故无法以此方法播放声音,在此不插入
import java.util.*;
import java.io.*;
public class MyGameCanvas extends GameCanvas implements CommandListener 
...{

/** *//** 代表标题显示状态的常量 */
private static final short STAGE_TITLE = 0;
/** *//** 代表关卡开始显示状态的常量 */
private static final short STAGE_START = 1;
/** *//** 代表关卡显示状态的常量 */
private static final short STAGE_PLAYING = 2;
/** *//** 代表游戏中显示完整图案的常量 */
private static final short STAGE_PLAYING_SEE_PERFECT_PIC = 3;
/** *//** 代表关卡结束显示状态的常数 */
private static final short STAGE_OVER = 5;
/** *//** 代表过关显示状态的常量 */
private static final short STAGE_CLEAR = 7;
/** *//** 代表全关卡过关显示状态的常量 */
private static final short ALL_STAGE_CLEAR = 9;
/** *//** 代表游戏结束的常量 */
private static final short GAME_END = 10;
/** *//** 最大关卡数 */
private static final short MAX_STAGE = 5;
/** *//** 正常模式常量 */
public static final short MODE_NORMAL = 1;
/** *//** 极限模式常量 */
public static final short MODE_UTMOST = 2;

/** *//** 储存现在之显示状态的变量 */
private short gameState;

/** *//** 储存游戏模式的变量 */
private short gameMode;

/** *//** 储存目前的关卡 */
private short stageNum;

/** *//** 储存已过关的关卡 */
private short stagePassedNum;

/** *//** 储存剩余的时间 */
private long lastTime;

/** *//** 储存损耗的时间,普通模式用到 */
private long usedTime;

/** *//** 储存单关通过的最短时间 */
private long quicklyPassOneStageTime;

/** *//** 游戏过程暂停状态所用的标志 */
private boolean isGamePaused;

/** *//** 储存显示的对象 */
private Display display;

/** *//** 储存音乐的对象 */
private Player player;//西门子C65不支持

/** *//** 储存主类的对象,方便进行退出之类的操作 */
private CrazyPuzzleMIDlet mainMIDlet;

/** *//**层管理*/
private LayerManager lm;

/** *//**背景*/
private TiledLayer puzzlePic;

/** *//**建一个画图对象*/
private Graphics g;

/** *//**时间倒计时,类为继承*/
private TimeCounterTask timeCounter;

/** *//** 储存各关卡谜题资讯的变量 */
private static final short[][] PUZZLE_MAP = new short[][] ...{
...{ //关卡1的谜题
1, 5, 9, 13,
2, 6, 10, 14,
3, 7, 11, 15,
4, 8, 12, 0
},
...{ //关卡2的谜题
4, 3, 2, 1,
8, 7, 6, 5,
12, 11, 10, 9,
15, 13, 14, 0
},
...{ //关卡3的谜题
12, 8, 4, 1,
15, 9, 5, 2,
13, 10, 6, 3,
14, 11, 7, 0
},
...{ //关卡4的谜题
14, 15, 12, 13,
8, 9, 10, 11,
4, 5, 6, 7,
1, 2, 3, 0
},
...{ //关卡5的谜题
14, 12, 15, 13,
11, 10, 9, 8,
7, 6, 5, 4,
3, 2, 1, 0
}
};
//norains:*构造函数*
public MyGameCanvas(Display disp,CrazyPuzzleMIDlet m,short mode)
...{
super(false);
this.display=disp;
this.mainMIDlet=m;
this.gameMode=mode;
stageNum=1;
stagePassedNum=0;
lastTime=0;
usedTime=0;
quicklyPassOneStageTime=0;
isGamePaused=false;
g=this.getGraphics();
gameState=STAGE_TITLE;
this.setFullScreenMode(true);//全屏幕
//增加命令
//this.addCommand(new Command("重新开始",Command.OK,1));
this.addCommand(new Command("取消",Command.BACK,1));
this.addCommand(new Command("返回列表",Command.BACK,1));
this.addCommand(new Command("退出游戏",Command.EXIT,1));
this.setCommandListener(this);
render();
}
public void commandAction(Command command, Displayable arg1)
...{
// TODO Auto-generated method stub
String cmd=command.getLabel();
if(cmd.equals("重新开始"))
...{
//不知为何,下面这段代码无法正常关闭音乐流,无论在模拟器还是在实体机上
//造成的后果是两首音乐一起播放,以致于系统变慢,无法正常游戏
//估计产生原因是上一首歌还没退出来,下一首就播放了
//关闭本节声音播放,以方便下一关播放新音乐
gameState=STAGE_TITLE;
try
...{
player.stop();
}
catch(Exception exp)
...{}

render();
}
else if(cmd.equals("返回列表"))
...{
if(player!=null)
...{
//关闭本节声音播放
try
...{
player.stop();
}
catch(Exception exp)
...{}
}
ListChoiceScreen lcs =new ListChoiceScreen(display,mainMIDlet);
display.setCurrent(lcs);
}
else if(cmd.equals("退出游戏"))
...{
mainMIDlet.notifyDestroyed();
}
else if(cmd.equals("取消"))
...{
//什么都不做,返回原画面
}
}
//*主要是用来绘图
public void render()
...{
switch(gameState)
...{
case STAGE_TITLE:
doTitlePaint();
break;
case STAGE_START:
doStartPaint();
break;
case STAGE_PLAYING:
doPlayingPaint();
break;
case STAGE_PLAYING_SEE_PERFECT_PIC:
doPlayingSeePerfectPicPaint();
break;
case STAGE_OVER:
doStageOverPaint();
break;
case STAGE_CLEAR:
doStageClearPaint();
break;
case ALL_STAGE_CLEAR:
doStageAllClearPaint();
break;
case GAME_END:
doGameEndPaint();
break;
}
}
//*画出关卡画面*
private void doTitlePaint()
...{
int dispWidth=this.getWidth();
int dispHeight=this.getHeight();
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
Image img1=creatImage("/res/ready.png");
g.drawImage(img1,(dispWidth-img1.getWidth())/2,(dispHeight-img1.getHeight())/2-4,0);
Image img2=creatImage("/res/num"+stageNum+".png");
g.drawImage(img2,(dispWidth-img2.getWidth())/2,(dispHeight-img1.getHeight())/2+img1.getHeight()-1,0);
this.flushGraphics();
}
//*关卡开始前
boolean firstStart=true;//是否首次运行标志
short musicNum=1;//因为音乐不够,以此变量做两首歌更换标志
private void doStartPaint()
...{
//*关卡初始化
lm=<




