手机拼图游戏设计理念
发布时间:2024-09-25
发布时间:2024-09-25
手机拼图游戏设计理念
Canvas是个抽象类,为开发人员提供了一系列方法,用于处理界面显示,游戏动作,键盘事件和触摸屏事件。Canvas组件由Canvas类的子类负责创建,在子类中必须重写父类中的paint(Graphics)方法。Canvas组件是个可显示的组件,能够直接设置在屏幕上,下面的方法使Canvas组件以全屏的模式显示在屏幕上:
public void setFullScreenModel(Boolean mode)
如果Canvas组件以全屏的模式显示在屏幕上,那么添加到该组件上的命令对象将不可见,但是用户可以通过软件触发命令。
1.设计的要求:
(1)用户通过方向键来操作游戏:按住上键是使方框位置向正上方跳两格,按住下键是使方框向正下方跳两格,左键是使方框连续按照拼图顺序逆时针跳四格,右键是使方框按照拼图顺序顺时针跳四格,中键是使方框定格并使被定格的图片跳到空格上去。
(2)游戏没有暂停的功能,在游戏界面有两个计数的,一个是你当前所走的步数(移动的次数),另一个是花费的时间。当你将拼图拼完整后界面就会显示“Good Job!”,如果你一直没有拼完的话,界面也不会消失,也不会限制你,花费时间的计数一直在进行,界面是显示的是“Are you idiot?” 。
(3)在游戏界面上有七张图片,图片的整体是由一个番茄切割而成。
2. 类设计
游戏由两个类和一个接口组成
(1)主类是PictureMidlet,它继承了父类Midlet。负责创建菜单,处理命令事件。
(2)还有一个类是PictureCanvas,它继承了类GameCanvas和Runnable接口。扩展该类的Canvas组件能够响应用户按下键,释放键和持续按键等动作,而不再依赖于设备。按键动作有Runnable接口中定义的方法处理。
(3)Runnable接口定义了PictureCanvas组件上键盘事件的处理方法。
3.代码实现
import java.io.IOException;
public class PictureCanvas extends GameCanvas implements Runnable{
TiledLayer picLayer;
int picture[][]={{1,2},{3,4},{5,6},{7,8}};
int selected=7;
int takeOutTitle;
int screenWidth=this.getWidth();
int screenHeight=this.getHeight();
int x=(screenWidth-176)/2;
int y=(screenHeight-208)/2;
static int moveCnt=0;
static long costTime=0;
long gameStartTime,gameNowTime;
Graphics g=this.getGraphics();
public PictureCanvas(){
super(true);
try {
Image img = Image.createImage("/menu.png");
picLayer=new
TiledLayer(picture[0].length,picture.length,img,88,52);
picLayer.setPosition(x, y);
} catch (IOException ex) {
ex.printStackTrace();
}
initPicture();
takeOutTitle=picture[3][1];
picture[3][1]=0;
/**/
gameStartTime=System.currentTimeMillis();
Thread th=new Thread(this);
th.start();
}
public void initPicture(){
Random rnd=new Random();
for(int i=0;i<picture.length;i++){
for(int j=0;j<picture[i].length;j++){
int row=i,col=j;
int xrow=Math.abs(rnd.nextInt())%4;
int xcol=Math.abs(rnd.nextInt())%2;
if(row!=xrow||col!=xcol){
int t=picture[row][col];
picture[row][col]=picture[xrow][xcol];
picture[xrow][xcol]=t;
}
}
}
}
public void run() {
while(true){
input();
logic();
render();
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
gameNowTime=System.currentTimeMillis();
costTime=(gameNowTime-gameStartTime)/1000;
}
}
private void input() {
int keyState=this.getKeyStates();
switch(keyState){
case UP_PRESSED:
if(selected-2>0)selected-=2;
break;
case DOWN_PRESSED:
if(selected+2<=8)selected+=2;
break;
case LEFT_PRESSED:
if(selected-1>0)selected-=1;
break;
case RIGHT_PRESSED:
if(selected+1<=8)selected+=1;
break;
case FIRE_PRESSED:
int row=(selected-1)/2;
int col=(selected-1)%2;
int dir=isCanMove(row,col);
//System.out.println("dir="+dir);
switch(dir){
case 0:break;
case 1:
picture[row-1][col]=picture[row][col];
picture[row][col]=0;
moveCnt++;
break;
case 2:
picture[row+1][col]=picture[row][col];
picture[row][col]=0;
moveCnt++;
break;
case 3:
picture[row][col-1]=picture[row][col];
picture[row][col]=0;
moveCnt++;
break;
case 4:
picture[row][col+1]=picture[row][col];
picture[row][col]=0;
moveCnt++;
break;
}
break;
}
}
public int isCanMove(int sRow,int sCol){
int isCan=0;
//System.out.println("selected="+selected);
if(selected-2>0){
if(picture[sRow-1][sCol]==0)return 1;
}
if(selected+2<=8){
if(picture[sRow+1][sCol]==0)return 2;
}
if((selected-1)%2==1){
if(picture[sRow][sCol-1]==0)return 3;
}
if((selected-1)%2==0){
if(picture[sRow][sCol+1]==0)return 4;
}
return isCan;
}
public boolean isFinished(){
int index=1;
for(int i=0;i<picture.length;i++){
for(int j=0;j<picture[i].length;j++){
if(picture[i][j]==0){
if(takeOutTitle!=index)return false;
}
if(picture[i][j]!=index)return false;
index++;
}
}
return true;
}
private void logic() {
if(isFinished()){
System.out.println("Good Job!");
}
else
System.out.println("Are you idiot?");
}
private void render() {
g.setColor(192,192,192);
g.fillRect(0, 0, this.getWidth(),this.getHeight());
g.setColor(0);
g.drawString("移动的次数:" +moveCnt, x, 0, Graphics.TOP | Graphics.LEFT);
g.drawString("花费的时间:"+costTime, x, Font.getDefaultFont().getHeight(), Graphics.TOP | Graphics.LEFT);
for(int i=0;i<picture.length;i++){
for(int j=0;j<picture[i].length;j++){
picLayer.setCell(j, i,picture[i][j]);
}
}
picLayer.paint(g);
int x=((selected-1)%2)*88+this.x;
int y=((selected-1)/2)*52+this.y;
g.setColor(11,23,70);
g.drawRect(x, y, 88, 52);
this.flushGraphics();
}
}
4.运行效果