疯狂拼图完整源代码
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=new LayerManager();
puzzlePic=creatPuzzlePic();
//*测试用
//puzzlePic=creatTestPuzzlePic();//测试用
lm.append(puzzlePic);
//播放声音
//西门子模拟器不支持下面这段代码,但实体机子完美支持
try
{
InputStream in ;
//in= getClass().getResourceAsStream("/res/music"+stageNum+".mid");这是有5首音乐的时候使用的
//只有两首歌的时候使用
if(musicNum==1)
{
in= getClass().getResourceAsStream("/res/music1.mid");
musicNum=2;
}
else
{
in= getClass().getResourceAsStream("/res/music2.mid");
musicNum=1;
}
player = Manager.createPlayer(in,"audio/midi");
player.setLoopCount(10);
player.start();
}
catch(IOException e){}
catch(MediaException e){}
gameState=STAGE_PLAYING;
//创建并启动计时器
if(firstStart==true||gameMode==MODE_NORMAL)
{
if(gameMode==MODE_NORMAL)
{
timeCounter=new TimeCounterTask(300);
}
else if(gameMode==MODE_UTMOST)//此段代码只在第一次时运行
{
timeCounter=new TimeCounterTask(900);
}
Timer timer=new Timer();
timer.schedule(timeCounter,1000,1000);
firstStart=false;
}
else
{
timeCounter=new TimeCounterTask(lastTime);
Timer timer=new Timer();
timer.schedule(timeCounter,1000,1000);
firstStart=false;
System.out.println("first");
}
//
render();
}
//*游戏进行中
private void doPlayingPaint()
{
//*设置计时器的字体
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
g.setColor(1,16,57);
g.fillRect(0,0,this.getWidth(),this.getHeight());
lm.setViewWindow(0,0,this.getWidth(),this.getHeight());
lm.paint(g,(this.getWidth()-112)/2,font.getHeight()+2);
//*画格子
g.setColor(255,255,255);
int x1,y1,x2,y2;
//*横线
y1=y2=font.getHeight()+2;
x1=(this.getWidth()-112)/2;
x2=((this.getWidth()-112)/2)+112;
for(int i=0;i<5;i++)
{
g.drawLine(x1,y1,x2,y2);
y1=y2=y2+28;
}
//*直线
x1=x2=(this.getWidth()-112)/2;
y1=font.getHeight()+2;
y2=font.getHeight()+2+112;
for(int i=0;i<5;i++)
{
g.drawLine(x1,y1,x2,y2);
x1=x2=x2+28;
}
g.setColor(255,255,255);
g.drawString(timeCounter.timeString,(this.getWidth()-font.stringWidth(timeCounter.timeString))/2 ,1,0);
flushGraphics();
}
// *游戏进行中观看全图
private void doPlayingSeePerfectPicPaint()
{
//*在游戏中切换到完整图案
g.setColor(1,16,57);
g.fillRect(0,0,this.getWidth(),this.getHeight());
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
Image img=creatImage("/res/stage"+stageNum+".png");
//*画出计时器
g.setColor(255,255,255);
g.drawString(timeCounter.timeString,(this.getWidth()-font.stringWidth(timeCounter.timeString))/2,1,0);
g.drawImage(img,(this.getWidth()-112)/2,font.getHeight()+2,0);
//*画出右下角的小缺口
g.setColor(1,16,57);
g.fillRect((this.getWidth()-112)/2+82,font.getHeight()+2+82,30,30);
//*画出图片的方框
g.setColor(255,255,255);
g.drawRect((this.getWidth()-112)/2,font.getHeight()+2,111,111);
flushGraphics();
}
//*游戏过一关
private void doStageClearPaint()
{
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
Image img=creatImage("/res/clear.png");
g.drawImage(img,(this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/3,0);
//*描绘字体
g.setColor(1,16,57);
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
if(gameMode==MODE_NORMAL)
{
String writeString="最快过关:"+numToTime(quicklyPassOneStageTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2,(this.getHeight()-img.getHeight())/3+img.getHeight()+2,0);
writeString="全部耗费:"+numToTime(usedTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2,(this.getHeight()-img.getHeight())/3+img.getHeight()+font.getHeight()+2,0);
}
else if(gameMode==MODE_UTMOST)
{
String writeString="已经通过"+stagePassedNum+"关!坚持下去!" ;
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2,(this.getHeight()-img.getHeight())/3+img.getHeight()+2,0);
}
//关闭本节声音播放,以方便下一关播放新音乐
try
{
player.stop();
}
catch(Exception exp)
{}
//重画
flushGraphics();
}
//*游戏全部过关
private void doStageAllClearPaint()
{
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
//Image img=creatImage("/res/clear.png");
//g.drawImage(img,(this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/2,0);
g.setColor(255,0,0);
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE);
if(gameMode==MODE_NORMAL)
{
String writeString="顺利过关!";
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2-font.getHeight()-1,0);
writeString="最快过关:"+numToTime(quicklyPassOneStageTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2,0);
writeString="全部耗费:"+numToTime(usedTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2+font.getHeight()+1,0);
}
else if(gameMode==MODE_UTMOST)
{
String writeString="时间到!";
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2-font.getHeight()-1,0);
writeString="总过关数:"+stageNum;
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2,0);
}
//关闭本节声音播放,以方便下一画面播放新音乐
try
{
player.stop();
}
catch(Exception exp)
{}
//重画
flushGraphics();
}
//*游戏结束
private void doStageOverPaint()
{
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
Image img=creatImage("/res/gameover.png");
g.drawImage(img,(this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/2,0);
flushGraphics();
}
//全部通关
private void doGameEndPaint()
{
//返回选择画面
ListChoiceScreen lcs =new ListChoiceScreen(display,mainMIDlet);
display.setCurrent(lcs);
}
//过关检查
private void doStageClearCheck()
{
for(int i=0,k=1;i<4;i++)
for(int j=0;j<4;j++)
{
if(i!=3||j!=3)
{
if(puzzlePic.getCell(j,i)!=k)
{
return; //直接跳出函数
}
k++;
}
}
if(gameMode==MODE_NORMAL)//普通模式
{
if(stageNum==MAX_STAGE)//达到最大关数
{
gameState=ALL_STAGE_CLEAR;
timeCounter.cancel();//过关,停止计时器
if(quicklyPassOneStageTime>(300-lastTime))//判断耗费的最少时间
{
quicklyPassOneStageTime=(300-lastTime);
}
usedTime=usedTime+(300-lastTime);
}
else//未达到最大关数
{
gameState=STAGE_CLEAR;
stageNum++;//进入下一关
timeCounter.cancel();//过关,停止计时器
//如果保存时间至变量
if(quicklyPassOneStageTime==0)
{
//此为第一关,quicklyPassOneStageTime中未存数据
quicklyPassOneStageTime=300-lastTime;//300为普通模式默认的时间
usedTime=300-lastTime;//总耗时
}
else //不是第一关,比较quicklyPassOneStageTime里数字大小
{
if(quicklyPassOneStageTime>(300-lastTime))
{
quicklyPassOneStageTime=(300-lastTime);
}
usedTime=usedTime+(300-lastTime);
}
}
}
else if(gameMode==MODE_UTMOST)//极限模式
{
if(stageNum==MAX_STAGE)//达到最大关卡数
{
gameState=STAGE_CLEAR;
stageNum=1;//重新进入第一关
timeCounter.cancel();//过关,停止计时器
}
else//未到最大关数
{
gameState=STAGE_CLEAR;
stageNum++;//进入下一关
timeCounter.cancel();//过关,停止计时器
//如果是普通模式则保存时间至变量
}
stagePassedNum++;//过关数增加1
}
render();//重新绘画
}
//*创建图片
private Image creatImage(String fileName)
{
Image img=null;
try
{
img=Image.createImage(fileName);
}
catch(Exception exp)
{
System.out.println("打开图片出错:"+fileName);
}
return img;
}
//*创建随机背景拼图
private TiledLayer creatPuzzlePic()
{
Image img=null;
try
{
img=Image.createImage("/res/stage"+stageNum+".png");
}
catch(Exception exp)
{}
TiledLayer tiledLayer=new TiledLayer(4,4,img,28,28);
//*产生随机数选择地图分散方式
Random rdm=new Random();
int mapNum=(rdm.nextInt()>>>1)%4;
for(int i=0;i<PUZZLE_MAP[mapNum].length;i++)
{
int column=i%4;
int row=(i-column)/4;
tiledLayer.setCell(column,row,PUZZLE_MAP[mapNum][i]);
}
return tiledLayer;
}
//*创建简单背景拼图,测试用
private TiledLayer creatTestPuzzlePic()
{
Image img=null;
try
{
img=Image.createImage("/res/stage"+stageNum+".png");
}
catch(Exception exp)
{}
TiledLayer tiledLayer=new TiledLayer(4,4,img,28,28);
//*产生随机数选择地图分散方式
int []map=
{
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 0, 15
};
for(int i=0;i<map.length;i++)
{
int column=i%4;
int row=(i-column)/4;
tiledLayer.setCell(column,row,map[i]);
}
return tiledLayer;
}
//*游戏中按下左键
private void doRight()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最左边
if( puzzlePic.getCell(0,i)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn-1,spaceRow);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn-1,spaceRow,0);
//*绘图
render();
doStageClearCheck();
}
}
//*游戏中按下右键
private void doLeft()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最右边
if( puzzlePic.getCell(3,i)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn+1,spaceRow);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn+1,spaceRow,0);
//*绘图
render();
doStageClearCheck();
}
}
//*游戏中按下上键
private void doDown()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最上边
if( puzzlePic.getCell(i,0)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn,spaceRow-1);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn,spaceRow-1,0);
//*绘图
render();
doStageClearCheck();
}
}
//*游戏中按下下键
private void doUp()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最下边
if( puzzlePic.getCell(i,3)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn,spaceRow+1);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn,spaceRow+1,0);
//*绘图
render();
doStageClearCheck();
}
}
//*按下键盘时;
protected void keyPressed(int keyCode)
{
if(gameState==STAGE_TITLE )
{
gameState=STAGE_START;
render();
}
else if(gameState==STAGE_PLAYING&&isGamePaused!=true)
{
switch(getGameAction(keyCode))
{
case Canvas.FIRE:
gameState=STAGE_PLAYING_SEE_PERFECT_PIC;
render();
break;
case Canvas.DOWN:
doDown();
break;
case Canvas.UP:
doUp();
break;
case Canvas.LEFT:
doLeft();
break;
case Canvas.RIGHT:
doRight();
break;
}
}
else if(gameState==STAGE_CLEAR)
{
gameState=STAGE_TITLE;
render();
}
else if(gameState==ALL_STAGE_CLEAR)
{
gameState=GAME_END;
render();
}
}
//*松开键盘时
protected void keyReleased(int keyCode)
{
if(gameState==STAGE_PLAYING_SEE_PERFECT_PIC&&isGamePaused!=true&&getGameAction(keyCode)==Canvas.FIRE)
{
gameState=STAGE_PLAYING;
render();
}
}
//*时间转换函数
private String numToTime(long timeLong)
{
int hour = (int)(timeLong / 3600);
int minute = (int)((timeLong - (hour * 3600)) / 60);
String minuteSt = String.valueOf(minute);
minuteSt = (minuteSt.length() < 2 ? "0"+minuteSt : minuteSt);//加上0变成两位数
int sec = (int)(timeLong - (hour * 3600) - (minute * 60));
String secSt = String.valueOf(sec);
secSt = (secSt.length() < 2 ? "0"+secSt : secSt);//加上0变成两位数傞
String timeString = String.valueOf(hour) + ":" + minuteSt + ":" + secSt;
return timeString;
}
//*计时器
public class TimeCounterTask extends TimerTask
{
public String timeString;
private long timeLong;
public TimeCounterTask(long time)
{
timeLong=time;
changeTime();
}
public void run()
{
changeTime();
render();//重新绘图
}
private void changeTime()
{
timeLong=timeLong-1;//倒计时
if (timeLong==0)
{
gameState=STAGE_OVER; //时间到
}
else
{
timeString=numToTime(timeLong);
//把剩余时间储存到类外面变量(因为类的声明在doStartPainting()函数中,在函数外无法调用所建立的对象)
lastTime=timeLong;
}
}
}
}
//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=new LayerManager();
puzzlePic=creatPuzzlePic();
//*测试用
//puzzlePic=creatTestPuzzlePic();//测试用
lm.append(puzzlePic);
//播放声音
//西门子模拟器不支持下面这段代码,但实体机子完美支持
try
{
InputStream in ;
//in= getClass().getResourceAsStream("/res/music"+stageNum+".mid");这是有5首音乐的时候使用的
//只有两首歌的时候使用
if(musicNum==1)
{
in= getClass().getResourceAsStream("/res/music1.mid");
musicNum=2;
}
else
{
in= getClass().getResourceAsStream("/res/music2.mid");
musicNum=1;
}
player = Manager.createPlayer(in,"audio/midi");
player.setLoopCount(10);
player.start();
}
catch(IOException e){}
catch(MediaException e){}
gameState=STAGE_PLAYING;
//创建并启动计时器
if(firstStart==true||gameMode==MODE_NORMAL)
{
if(gameMode==MODE_NORMAL)
{
timeCounter=new TimeCounterTask(300);
}
else if(gameMode==MODE_UTMOST)//此段代码只在第一次时运行
{
timeCounter=new TimeCounterTask(900);
}
Timer timer=new Timer();
timer.schedule(timeCounter,1000,1000);
firstStart=false;
}
else
{
timeCounter=new TimeCounterTask(lastTime);
Timer timer=new Timer();
timer.schedule(timeCounter,1000,1000);
firstStart=false;
System.out.println("first");
}
//
render();
}
//*游戏进行中
private void doPlayingPaint()
{
//*设置计时器的字体
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
g.setColor(1,16,57);
g.fillRect(0,0,this.getWidth(),this.getHeight());
lm.setViewWindow(0,0,this.getWidth(),this.getHeight());
lm.paint(g,(this.getWidth()-112)/2,font.getHeight()+2);
//*画格子
g.setColor(255,255,255);
int x1,y1,x2,y2;
//*横线
y1=y2=font.getHeight()+2;
x1=(this.getWidth()-112)/2;
x2=((this.getWidth()-112)/2)+112;
for(int i=0;i<5;i++)
{
g.drawLine(x1,y1,x2,y2);
y1=y2=y2+28;
}
//*直线
x1=x2=(this.getWidth()-112)/2;
y1=font.getHeight()+2;
y2=font.getHeight()+2+112;
for(int i=0;i<5;i++)
{
g.drawLine(x1,y1,x2,y2);
x1=x2=x2+28;
}
g.setColor(255,255,255);
g.drawString(timeCounter.timeString,(this.getWidth()-font.stringWidth(timeCounter.timeString))/2 ,1,0);
flushGraphics();
}
// *游戏进行中观看全图
private void doPlayingSeePerfectPicPaint()
{
//*在游戏中切换到完整图案
g.setColor(1,16,57);
g.fillRect(0,0,this.getWidth(),this.getHeight());
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
Image img=creatImage("/res/stage"+stageNum+".png");
//*画出计时器
g.setColor(255,255,255);
g.drawString(timeCounter.timeString,(this.getWidth()-font.stringWidth(timeCounter.timeString))/2,1,0);
g.drawImage(img,(this.getWidth()-112)/2,font.getHeight()+2,0);
//*画出右下角的小缺口
g.setColor(1,16,57);
g.fillRect((this.getWidth()-112)/2+82,font.getHeight()+2+82,30,30);
//*画出图片的方框
g.setColor(255,255,255);
g.drawRect((this.getWidth()-112)/2,font.getHeight()+2,111,111);
flushGraphics();
}
//*游戏过一关
private void doStageClearPaint()
{
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
Image img=creatImage("/res/clear.png");
g.drawImage(img,(this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/3,0);
//*描绘字体
g.setColor(1,16,57);
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
if(gameMode==MODE_NORMAL)
{
String writeString="最快过关:"+numToTime(quicklyPassOneStageTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2,(this.getHeight()-img.getHeight())/3+img.getHeight()+2,0);
writeString="全部耗费:"+numToTime(usedTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2,(this.getHeight()-img.getHeight())/3+img.getHeight()+font.getHeight()+2,0);
}
else if(gameMode==MODE_UTMOST)
{
String writeString="已经通过"+stagePassedNum+"关!坚持下去!" ;
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2,(this.getHeight()-img.getHeight())/3+img.getHeight()+2,0);
}
//关闭本节声音播放,以方便下一关播放新音乐
try
{
player.stop();
}
catch(Exception exp)
{}
//重画
flushGraphics();
}
//*游戏全部过关
private void doStageAllClearPaint()
{
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
//Image img=creatImage("/res/clear.png");
//g.drawImage(img,(this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/2,0);
g.setColor(255,0,0);
Font font;
font=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_LARGE);
if(gameMode==MODE_NORMAL)
{
String writeString="顺利过关!";
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2-font.getHeight()-1,0);
writeString="最快过关:"+numToTime(quicklyPassOneStageTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2,0);
writeString="全部耗费:"+numToTime(usedTime);
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2+font.getHeight()+1,0);
}
else if(gameMode==MODE_UTMOST)
{
String writeString="时间到!";
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2-font.getHeight()-1,0);
writeString="总过关数:"+stageNum;
g.drawString(writeString,(this.getWidth()-font.stringWidth(writeString))/2 ,this.getHeight()/2,0);
}
//关闭本节声音播放,以方便下一画面播放新音乐
try
{
player.stop();
}
catch(Exception exp)
{}
//重画
flushGraphics();
}
//*游戏结束
private void doStageOverPaint()
{
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
Image img=creatImage("/res/gameover.png");
g.drawImage(img,(this.getWidth()-img.getWidth())/2,(this.getHeight()-img.getHeight())/2,0);
flushGraphics();
}
//全部通关
private void doGameEndPaint()
{
//返回选择画面
ListChoiceScreen lcs =new ListChoiceScreen(display,mainMIDlet);
display.setCurrent(lcs);
}
//过关检查
private void doStageClearCheck()
{
for(int i=0,k=1;i<4;i++)
for(int j=0;j<4;j++)
{
if(i!=3||j!=3)
{
if(puzzlePic.getCell(j,i)!=k)
{
return; //直接跳出函数
}
k++;
}
}
if(gameMode==MODE_NORMAL)//普通模式
{
if(stageNum==MAX_STAGE)//达到最大关数
{
gameState=ALL_STAGE_CLEAR;
timeCounter.cancel();//过关,停止计时器
if(quicklyPassOneStageTime>(300-lastTime))//判断耗费的最少时间
{
quicklyPassOneStageTime=(300-lastTime);
}
usedTime=usedTime+(300-lastTime);
}
else//未达到最大关数
{
gameState=STAGE_CLEAR;
stageNum++;//进入下一关
timeCounter.cancel();//过关,停止计时器
//如果保存时间至变量
if(quicklyPassOneStageTime==0)
{
//此为第一关,quicklyPassOneStageTime中未存数据
quicklyPassOneStageTime=300-lastTime;//300为普通模式默认的时间
usedTime=300-lastTime;//总耗时
}
else //不是第一关,比较quicklyPassOneStageTime里数字大小
{
if(quicklyPassOneStageTime>(300-lastTime))
{
quicklyPassOneStageTime=(300-lastTime);
}
usedTime=usedTime+(300-lastTime);
}
}
}
else if(gameMode==MODE_UTMOST)//极限模式
{
if(stageNum==MAX_STAGE)//达到最大关卡数
{
gameState=STAGE_CLEAR;
stageNum=1;//重新进入第一关
timeCounter.cancel();//过关,停止计时器
}
else//未到最大关数
{
gameState=STAGE_CLEAR;
stageNum++;//进入下一关
timeCounter.cancel();//过关,停止计时器
//如果是普通模式则保存时间至变量
}
stagePassedNum++;//过关数增加1
}
render();//重新绘画
}
//*创建图片
private Image creatImage(String fileName)
{
Image img=null;
try
{
img=Image.createImage(fileName);
}
catch(Exception exp)
{
System.out.println("打开图片出错:"+fileName);
}
return img;
}
//*创建随机背景拼图
private TiledLayer creatPuzzlePic()
{
Image img=null;
try
{
img=Image.createImage("/res/stage"+stageNum+".png");
}
catch(Exception exp)
{}
TiledLayer tiledLayer=new TiledLayer(4,4,img,28,28);
//*产生随机数选择地图分散方式
Random rdm=new Random();
int mapNum=(rdm.nextInt()>>>1)%4;
for(int i=0;i<PUZZLE_MAP[mapNum].length;i++)
{
int column=i%4;
int row=(i-column)/4;
tiledLayer.setCell(column,row,PUZZLE_MAP[mapNum][i]);
}
return tiledLayer;
}
//*创建简单背景拼图,测试用
private TiledLayer creatTestPuzzlePic()
{
Image img=null;
try
{
img=Image.createImage("/res/stage"+stageNum+".png");
}
catch(Exception exp)
{}
TiledLayer tiledLayer=new TiledLayer(4,4,img,28,28);
//*产生随机数选择地图分散方式
int []map=
{
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 0, 15
};
for(int i=0;i<map.length;i++)
{
int column=i%4;
int row=(i-column)/4;
tiledLayer.setCell(column,row,map[i]);
}
return tiledLayer;
}
//*游戏中按下左键
private void doRight()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最左边
if( puzzlePic.getCell(0,i)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn-1,spaceRow);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn-1,spaceRow,0);
//*绘图
render();
doStageClearCheck();
}
}
//*游戏中按下右键
private void doLeft()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最右边
if( puzzlePic.getCell(3,i)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn+1,spaceRow);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn+1,spaceRow,0);
//*绘图
render();
doStageClearCheck();
}
}
//*游戏中按下上键
private void doDown()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最上边
if( puzzlePic.getCell(i,0)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn,spaceRow-1);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn,spaceRow-1,0);
//*绘图
render();
doStageClearCheck();
}
}
//*游戏中按下下键
private void doUp()
{
boolean canChanged=true;
for(int i=0;i<4;i++)
{
//*判断最空格是否在最下边
if( puzzlePic.getCell(i,3)==0)
{
canChanged=false;
break;
}
}
if(canChanged==true)
{
//*可以移动方块
int spaceColumn,spaceRow,picCell;
spaceColumn=spaceRow=0;
for(int i=0;i<puzzlePic.getColumns();i++)
for(int j=0;j<puzzlePic.getRows();j++)
{
if(puzzlePic.getCell(i,j)==0)
{
spaceColumn=i;
spaceRow=j;
break;
}
}
//*交换空格位置
picCell=puzzlePic.getCell(spaceColumn,spaceRow+1);
puzzlePic.setCell(spaceColumn,spaceRow,picCell);
puzzlePic.setCell(spaceColumn,spaceRow+1,0);
//*绘图
render();
doStageClearCheck();
}
}
//*按下键盘时;
protected void keyPressed(int keyCode)
{
if(gameState==STAGE_TITLE )
{
gameState=STAGE_START;
render();
}
else if(gameState==STAGE_PLAYING&&isGamePaused!=true)
{
switch(getGameAction(keyCode))
{
case Canvas.FIRE:
gameState=STAGE_PLAYING_SEE_PERFECT_PIC;
render();
break;
case Canvas.DOWN:
doDown();
break;
case Canvas.UP:
doUp();
break;
case Canvas.LEFT:
doLeft();
break;
case Canvas.RIGHT:
doRight();
break;
}
}
else if(gameState==STAGE_CLEAR)
{
gameState=STAGE_TITLE;
render();
}
else if(gameState==ALL_STAGE_CLEAR)
{
gameState=GAME_END;
render();
}
}
//*松开键盘时
protected void keyReleased(int keyCode)
{
if(gameState==STAGE_PLAYING_SEE_PERFECT_PIC&&isGamePaused!=true&&getGameAction(keyCode)==Canvas.FIRE)
{
gameState=STAGE_PLAYING;
render();
}
}
//*时间转换函数
private String numToTime(long timeLong)
{
int hour = (int)(timeLong / 3600);
int minute = (int)((timeLong - (hour * 3600)) / 60);
String minuteSt = String.valueOf(minute);
minuteSt = (minuteSt.length() < 2 ? "0"+minuteSt : minuteSt);//加上0变成两位数
int sec = (int)(timeLong - (hour * 3600) - (minute * 60));
String secSt = String.valueOf(sec);
secSt = (secSt.length() < 2 ? "0"+secSt : secSt);//加上0变成两位数傞
String timeString = String.valueOf(hour) + ":" + minuteSt + ":" + secSt;
return timeString;
}
//*计时器
public class TimeCounterTask extends TimerTask
{
public String timeString;
private long timeLong;
public TimeCounterTask(long time)
{
timeLong=time;
changeTime();
}
public void run()
{
changeTime();
render();//重新绘图
}
private void changeTime()
{
timeLong=timeLong-1;//倒计时
if (timeLong==0)
{
gameState=STAGE_OVER; //时间到
}
else
{
timeString=numToTime(timeLong);
//把剩余时间储存到类外面变量(因为类的声明在doStartPainting()函数中,在函数外无法调用所建立的对象)
lastTime=timeLong;
}
}
}
}
//------------------------------
//CrazyPuzzleMIDlet.java
//------------------------------
package src;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class CrazyPuzzleMIDlet extends MIDlet {
private Display display;
public CrazyPuzzleMIDlet()
{
super();
display=Display.getDisplay(this);
WelcomeCanvas welcomeCanvas=new WelcomeCanvas(display,this);
display.setCurrent(welcomeCanvas);
}
protected void startApp() throws MIDletStateChangeException {
//norains: TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
}
//CrazyPuzzleMIDlet.java
//------------------------------
package src;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class CrazyPuzzleMIDlet extends MIDlet {
private Display display;
public CrazyPuzzleMIDlet()
{
super();
display=Display.getDisplay(this);
WelcomeCanvas welcomeCanvas=new WelcomeCanvas(display,this);
display.setCurrent(welcomeCanvas);
}
protected void startApp() throws MIDletStateChangeException {
//norains: TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
}
//------------------------------
//ListChoiceScreen.java
//------------------------------
package src;
import javax.microedition.lcdui.*;
public class ListChoiceScreen extends List implements CommandListener
{
private Display display;
private CrazyPuzzleMIDlet mainMIDlet;
//传入TestLatencyMIDlet主要是为了能进行退出程序的操作.
public ListChoiceScreen(Display display,CrazyPuzzleMIDlet m)
{
super("疯狂拼图",Choice.IMPLICIT);
mainMIDlet=m;
this.display=display;
Image img1,img2,img3,img4;
img1=img2=img3=img4=null;
try
{
img1=Image.createImage("/res/lis1.png");
img2=Image.createImage("/res/lis2.png");
img3=Image.createImage("/res/lis3.png");
img4=Image.createImage("/res/lis4.png");
}
catch(Exception erro)
{}
this.append("普通模式",img1);
this.append("极限模式",img2);
//this.append("高手排行",img2);
this.append("游戏说明",img3);
this.append("退出游戏",img4);
this.setCommandListener(this);
}
public void commandAction(Command c,Displayable s)
{
if (c==List.SELECT_COMMAND)
{
List tmp=(List) s;
int selected=tmp.getSelectedIndex();
String list=tmp.getString(selected);
if(list.equals("普通模式"))
{
MyGameCanvas myGameCanvas=new MyGameCanvas(display,mainMIDlet,MyGameCanvas.MODE_NORMAL);
display.setCurrent(myGameCanvas);
}
else if (list.equals("极限模式"))
{
MyGameCanvas myGameCanvas=new MyGameCanvas(display,mainMIDlet,MyGameCanvas.MODE_UTMOST);
display.setCurrent(myGameCanvas);
}
else if (list.equals("高手排行"))
{
}
else if (list.equals("游戏说明"))
{
InfoScreen infoScreen=new InfoScreen(display,this);
display.setCurrent(infoScreen);
}
else if (list.equals("退出游戏"))
{
mainMIDlet.notifyDestroyed();
}
}
}
}
//ListChoiceScreen.java
//------------------------------
package src;
import javax.microedition.lcdui.*;
public class ListChoiceScreen extends List implements CommandListener
{
private Display display;
private CrazyPuzzleMIDlet mainMIDlet;
//传入TestLatencyMIDlet主要是为了能进行退出程序的操作.
public ListChoiceScreen(Display display,CrazyPuzzleMIDlet m)
{
super("疯狂拼图",Choice.IMPLICIT);
mainMIDlet=m;
this.display=display;
Image img1,img2,img3,img4;
img1=img2=img3=img4=null;
try
{
img1=Image.createImage("/res/lis1.png");
img2=Image.createImage("/res/lis2.png");
img3=Image.createImage("/res/lis3.png");
img4=Image.createImage("/res/lis4.png");
}
catch(Exception erro)
{}
this.append("普通模式",img1);
this.append("极限模式",img2);
//this.append("高手排行",img2);
this.append("游戏说明",img3);
this.append("退出游戏",img4);
this.setCommandListener(this);
}
public void commandAction(Command c,Displayable s)
{
if (c==List.SELECT_COMMAND)
{
List tmp=(List) s;
int selected=tmp.getSelectedIndex();
String list=tmp.getString(selected);
if(list.equals("普通模式"))
{
MyGameCanvas myGameCanvas=new MyGameCanvas(display,mainMIDlet,MyGameCanvas.MODE_NORMAL);
display.setCurrent(myGameCanvas);
}
else if (list.equals("极限模式"))
{
MyGameCanvas myGameCanvas=new MyGameCanvas(display,mainMIDlet,MyGameCanvas.MODE_UTMOST);
display.setCurrent(myGameCanvas);
}
else if (list.equals("高手排行"))
{
}
else if (list.equals("游戏说明"))
{
InfoScreen infoScreen=new InfoScreen(display,this);
display.setCurrent(infoScreen);
}
else if (list.equals("退出游戏"))
{
mainMIDlet.notifyDestroyed();
}
}
}
}
//------------------------------
//RecordScreen.java
//------------------------------
package src;
public class RecordScreen {
}
//RecordScreen.java
//------------------------------
package src;
public class RecordScreen {
}
//------------------------------
//InfoScreen.java
//------------------------------
package src;
import javax.microedition.lcdui.*;
public class InfoScreen extends Form implements CommandListener
{
Displayable nextDisp;
Display display;
public InfoScreen(Display display, Displayable nextDisp)
{
super("");
this.nextDisp=nextDisp;
this.display=display;
this.append("游戏:疯狂拼图 "+"版本:1.0 "+"型号:泡泡堂 "+"作者:norains "+"联系:norains@163.com "
+"说明:游戏有两种模式选择,普通模式每关都重新计时,极限模式计算时间完毕前通过的关数.在游戏中按住5键可以切换到完整图案.");
this.addCommand(new Command("返回",Command.BACK,0));
this.setCommandListener(this);
}
public void commandAction(Command c,Displayable s)
{
String cmd=c.getLabel();
if (cmd.equalsIgnoreCase("返回"))
{
display.setCurrent(nextDisp);
}
}
}
//InfoScreen.java
//------------------------------
package src;
import javax.microedition.lcdui.*;
public class InfoScreen extends Form implements CommandListener
{
Displayable nextDisp;
Display display;
public InfoScreen(Display display, Displayable nextDisp)
{
super("");
this.nextDisp=nextDisp;
this.display=display;
this.append("游戏:疯狂拼图 "+"版本:1.0 "+"型号:泡泡堂 "+"作者:norains "+"联系:norains@163.com "
+"说明:游戏有两种模式选择,普通模式每关都重新计时,极限模式计算时间完毕前通过的关数.在游戏中按住5键可以切换到完整图案.");
this.addCommand(new Command("返回",Command.BACK,0));
this.setCommandListener(this);
}
public void commandAction(Command c,Displayable s)
{
String cmd=c.getLabel();
if (cmd.equalsIgnoreCase("返回"))
{
display.setCurrent(nextDisp);
}
}
}
//------------------------------
//RMSUtil.java
//------------------------------
package src;
import javax.microedition.rms.*;
//数据库操作公共类
public class RMSUtil
{
public static RecordStore openRSAnyway(String rsname)
{
RecordStore rs=null;
if(rsname.length()>32)
{
return null;
}
else
{
try
{
rs=RecordStore.openRecordStore(rsname,true);
return rs;
}
catch (Exception erro)
{
return null;
}
}
}
public static RecordStore openRSExisted(String rsname)
{
RecordStore rs=null;
if (rsname.length()>32)
{
return null;
}
else
{
try
{
rs=RecordStore.openRecordStore(rsname,false);
return rs;
}
catch(Exception erro)
{
return null;
}
}
}
public static boolean deletRS(String rsname)
{
if(rsname.length()>32)
{
return false;
}
else
{
try
{
RecordStore.deleteRecordStore(rsname);
return true;
}
catch(Exception erro)
{
return false;
}
}
}
}
//RMSUtil.java
//------------------------------
package src;
import javax.microedition.rms.*;
//数据库操作公共类
public class RMSUtil
{
public static RecordStore openRSAnyway(String rsname)
{
RecordStore rs=null;
if(rsname.length()>32)
{
return null;
}
else
{
try
{
rs=RecordStore.openRecordStore(rsname,true);
return rs;
}
catch (Exception erro)
{
return null;
}
}
}
public static RecordStore openRSExisted(String rsname)
{
RecordStore rs=null;
if (rsname.length()>32)
{
return null;
}
else
{
try
{
rs=RecordStore.openRecordStore(rsname,false);
return rs;
}
catch(Exception erro)
{
return null;
}
}
}
public static boolean deletRS(String rsname)
{
if(rsname.length()>32)
{
return false;
}
else
{
try
{
RecordStore.deleteRecordStore(rsname);
return true;
}
catch(Exception erro)
{
return false;
}
}
}
}
//------------------------------
//WelcomeCanvas.java
//------------------------------
package src;
import java.io.IOException;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.media.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
public class WelcomeCanvas extends Canvas
{
private Display display;
private CrazyPuzzleMIDlet mainMIDlet;
private Image img;
private int dispWidth;
private int dispHeight;
private int imgState;
private Player player;
//**构造函数
public WelcomeCanvas(Display disp,CrazyPuzzleMIDlet midlet)
{
this.display=disp;
this.mainMIDlet=midlet;
this.setFullScreenMode(true);
dispWidth=this.getWidth();
dispHeight=this.getHeight();
imgState=1;
//播放开头音乐
try
{
InputStream in ;
in= getClass().getResourceAsStream("/res/welcome.mid");
player = Manager.createPlayer(in,"audio/midi");
player.setLoopCount(1);
player.start();
}
catch(IOException e){}
catch(MediaException e){}
}
// **角色创建函数,以整张图
private Image creatImage(String fileName)
{
Image img=null;
try
{
img=Image.createImage(fileName);
}
catch (Exception exp)
{
System.out.println(exp);
}
return img;
}
//**绘图
public void paint(Graphics g)
{
switch(imgState)
{
case 1:
img=creatImage("/res/flash1.png");
g.setColor(1,16,57);
break;
case 2:
img=creatImage("/res/flash2.png");
break;
case 3:
img=creatImage("/res/flash3.png");
g.setColor(255,255,255);
break;
}
g.fillRect(0,0,dispWidth,dispHeight);
g.drawImage(img,(dispWidth-img.getWidth())/2,(dispHeight-img.getHeight())/2,0);
}
protected void keyPressed(int keycode)
{
//conti=false;
if(imgState!=3)
{
imgState++;
repaint();
}
else
{
ListChoiceScreen listChoiceScreen=new ListChoiceScreen(display,mainMIDlet);
display.setCurrent(listChoiceScreen);
//停止播放音乐
try
{
if(player!=null)
{
player.stop();
}
}
catch(Exception erro)
{}
}
}
}
//WelcomeCanvas.java
//------------------------------
package src;
import java.io.IOException;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.media.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
public class WelcomeCanvas extends Canvas
{
private Display display;
private CrazyPuzzleMIDlet mainMIDlet;
private Image img;
private int dispWidth;
private int dispHeight;
private int imgState;
private Player player;
//**构造函数
public WelcomeCanvas(Display disp,CrazyPuzzleMIDlet midlet)
{
this.display=disp;
this.mainMIDlet=midlet;
this.setFullScreenMode(true);
dispWidth=this.getWidth();
dispHeight=this.getHeight();
imgState=1;
//播放开头音乐
try
{
InputStream in ;
in= getClass().getResourceAsStream("/res/welcome.mid");
player = Manager.createPlayer(in,"audio/midi");
player.setLoopCount(1);
player.start();
}
catch(IOException e){}
catch(MediaException e){}
}
// **角色创建函数,以整张图
private Image creatImage(String fileName)
{
Image img=null;
try
{
img=Image.createImage(fileName);
}
catch (Exception exp)
{
System.out.println(exp);
}
return img;
}
//**绘图
public void paint(Graphics g)
{
switch(imgState)
{
case 1:
img=creatImage("/res/flash1.png");
g.setColor(1,16,57);
break;
case 2:
img=creatImage("/res/flash2.png");
break;
case 3:
img=creatImage("/res/flash3.png");
g.setColor(255,255,255);
break;
}
g.fillRect(0,0,dispWidth,dispHeight);
g.drawImage(img,(dispWidth-img.getWidth())/2,(dispHeight-img.getHeight())/2,0);
}
protected void keyPressed(int keycode)
{
//conti=false;
if(imgState!=3)
{
imgState++;
repaint();
}
else
{
ListChoiceScreen listChoiceScreen=new ListChoiceScreen(display,mainMIDlet);
display.setCurrent(listChoiceScreen);
//停止播放音乐
try
{
if(player!=null)
{
player.stop();
}
}
catch(Exception erro)
{}
}
}
}