`
forthebreeze
  • 浏览: 3800 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

手机拼图游戏的实现

阅读更多
    最近在做一个手机游戏,感觉创意不够,只是把各种游戏拼凑在一起。其中一个是手机拼图游戏,现在把主要的源代码发在这里。
    写这个小程序我的感觉是,最关键的是弄清程序的流程,采用状态机的方法,这样就能够避免写代码的时候混乱不清。
package Level;

import Handler.Handler;
import Main.Main;
import Midlet.Midlet;
import Pic.GifDecoder;
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.TiledLayer;
public class Level3 extends GameCanvas implements Runnable{
   
    public boolean end=false;
    private int state=0;
    private LayerManager LM;
    private TiledLayer TL;
    private TiledLayer Mess;
    private TiledLayer Board;
    private Image pintu;
    private int screen=1;              //三幅图的切换显示
    /*1为打乱的图片,2为原图,3为拼凑板*/
    private boolean moving;            //只是放置
    private int move=0;                //移动的图块序号
    private int origin=0;              //拼图板的原始图块序号
    private boolean replacing;         //交换
    private int r11,r12;
    private int r21,r22;
    private int count=0;               //拼图吻合的数目
    private int[][]temp;               //记录随机混乱的数组
    private int[][]dst;                //拼图数据
    private int x1,y1;                 //随机图中的移动左上坐标
    private int i1,j1;                 //相对坐标
    private int x2,y2;                 //版图中的移动左上坐标
    private int i2,j2;                 //相对坐标
    private int x,y;                   //作为移动的统一处理
    private int frameGif=0;
    private static int X=4;
    private static int Y=8;
    public Level3(){
        super(false);
        setFullScreenMode(true);
        Display.getDisplay(Midlet.instance).setCurrent(this);
        Main.instance.pause=true;
        Main.g=getGraphics();
        new Thread(this).start();
    }
 
    private void drawLoad(){
        new Thread(new Runnable() {
            public void run() {load();}
        }).start();
        Main.Comp.drawWait(Main.bg,Main.wait,Main.width,Main.height,"正在初始化,请稍等。",Main.g);
    }   
   
    private void load(){
        try{
            pintu=Image.createImage("/Res/Picture/Level3/pintu.png");
        }catch(IOException e){}
        LM=new LayerManager();
        TL=new TiledLayer(X,Y,pintu,pintu.getWidth()/X,pintu.getHeight()/Y);
        Mess=new TiledLayer(X,Y,pintu,pintu.getWidth()/X,pintu.getHeight()/Y);
        Board=new TiledLayer(X,Y,pintu,pintu.getWidth()/X,pintu.getHeight()/Y);
        temp=generateRandom();
        dst=new int[X][Y];
        for(int i=0;i<X;i++)
            for(int j=0;j<Y;j++){
                TL.setCell(i,j,X*j+i+1);
                Board.setCell(i,j,0);
                Mess.setCell(i,j,temp[i][j]);
                dst[i][j]=0;
            }
        LM.append(TL);
        LM.append(Board);
        LM.append(Mess);
        TL.setVisible(false);
        Board.setVisible(false);
        Mess.setVisible(true);
        state=1;
        x=Main.instance.width/2-pintu.getWidth()/2;
        y=Main.instance.height/2-pintu.getHeight()/2;
        i1=i2=0;j1=j2=0;x1=x2=x;y1=y2=y;
        System.out.println("资源装载完毕!");
    }
   
    private int[][] generateRandom(){
        int[][]temp=new int[X][Y];
        Random random=new Random();
        for(int i=0;i<X;i++)
            for(int j=0;j<Y;j++)
                temp[i][j]=X*j+i+1;
        int j,k,t;
        for(int i=0;i<X*Y;i++){
            j=random.nextInt(X*Y);
            k=random.nextInt(X*Y);
            t=temp[j/Y][j%Y];
            temp[j/Y][j%Y]=temp[k/Y][k%Y];
            temp[k/Y][k%Y]=t;
        }
        return temp;
    }
   
    public void keyPressed(int keyCode){
    switch(state){
      case 1:
        switch(screen){
          //打乱的拼图界面
          case 1:
           switch(keyCode){
             case -7:
               end=true;
               Display.getDisplay(Midlet.instance).setCurrent(Main.instance);
               Main.instance.pause=false;
               Main.instance.curState=3;
               new Thread(Main.instance).start();                       
               break;
            case -6:
               Board.setVisible(true);
               Mess.setVisible(false);
               TL.setVisible(false);
               screen=3;
               x=x2;y=y2;
               break;
            case KEY_STAR:
               Board.setVisible(false);
               Mess.setVisible(false);
               TL.setVisible(true);
               screen=2;
               x=x1;y=y1;
               break;
            case KEY_NUM4:
            case -3:
                i1--;
                if(i1<0)i1=X-1;
                x1=Main.instance.width/2-pintu.getWidth()/2+i1*pintu.getWidth()/X;
                y1=Main.instance.height/2-pintu.getHeight()/2+j1*pintu.getHeight()/Y;
                break;
           case KEY_NUM6:
           case -4:
                i1++;
                if(i1>X-1)i1=0;
                x1=Main.instance.width/2-pintu.getWidth()/2+i1*pintu.getWidth()/X;
                y1=Main.instance.height/2-pintu.getHeight()/2+j1*pintu.getHeight()/Y;              
               break;
            case KEY_NUM2:
            case -1:
                j1--;
                if(j1<0)j1=Y-1;
                x1=Main.instance.width/2-pintu.getWidth()/2+i1*pintu.getWidth()/X;
                y1=Main.instance.height/2-pintu.getHeight()/2+j1*pintu.getHeight()/Y;
                break;
            case KEY_NUM8:
            case -2:
                j1++;
                if(j1>Y-1)j1=0;
                x1=Main.instance.width/2-pintu.getWidth()/2+i1*pintu.getWidth()/X;
                y1=Main.instance.height/2-pintu.getHeight()/2+j1*pintu.getHeight()/Y;                 
                break;
           case KEY_NUM5:
           case -5:
               if(temp[i1][j1]==0)moving=false;
               else{
                   //转换屏幕导航
               Board.setVisible(true);
               Mess.setVisible(false);
               TL.setVisible(false);
               screen=3;
               x=x2;y=y2;
               moving=true;
               move=temp[i1][j1];
               r11=i1;r12=j1;
               //设置显示
               Board.setCell(i2,j2,move);
               return;
               }
           }
           x=x1;y=y1;
           break;
        //拼图板界面
        case 3:
            if(moving||replacing){
                origin=dst[i2][j2];
            }
           switch(keyCode){
             case -7:
               end=true;
               Display.getDisplay(Midlet.instance).setCurrent(Main.instance);
               Main.instance.pause=false;
               Main.instance.curState=3;
               new Thread(Main.instance).start();                       
               break;
            case -11:
            case -10:
               LM.insert(Mess,0);
               Board.setVisible(false);
               TL.setVisible(false);
               Mess.setVisible(true);
               screen=1;
               x=x1;
               y=y1;
               return;
            case KEY_STAR:
               LM.insert(TL,0);
               Board.setVisible(false);
               Mess.setVisible(false);
               TL.setVisible(true);
               screen=2;
               break;
            case KEY_NUM4:
            case -3:
            if(moving||replacing){
               Board.setCell(i2,j2,origin);
            }               
                i2--;
                if(i2<0)i2=X-1;
                x2=Main.instance.width/2-pintu.getWidth()/2+i2*pintu.getWidth()/X;
                y2=Main.instance.height/2-pintu.getHeight()/2+j2*pintu.getHeight()/Y;
                break;
           case KEY_NUM6:
           case -4:
            if(moving||replacing){
               Board.setCell(i2,j2,origin);
            }              
                i2++;
                if(i2>X-1)i2=0;
                x2=Main.instance.width/2-pintu.getWidth()/2+i2*pintu.getWidth()/X;
                y2=Main.instance.height/2-pintu.getHeight()/2+j2*pintu.getHeight()/Y;                
               break;
            case KEY_NUM2:
            case -1:
            if(moving||replacing){
               Board.setCell(i2,j2,origin);
            }               
                j2--;
                if(j2<0)j2=Y-1;
                x2=Main.instance.width/2-pintu.getWidth()/2+i2*pintu.getWidth()/X;
                y2=Main.instance.height/2-pintu.getHeight()/2+j2*pintu.getHeight()/Y;
                break;
            case KEY_NUM8:
            case -2:
            if(moving||replacing){
               Board.setCell(i2,j2,origin);
            }               
                j2++;
                if(j2>Y-1)j2=0;
                x2=Main.instance.width/2-pintu.getWidth()/2+i2*pintu.getWidth()/X;
                y2=Main.instance.height/2-pintu.getHeight()/2+j2*pintu.getHeight()/Y;                 
                break;    
           case KEY_NUM5:
           case -5:
               if(!moving){
                   if(replacing==false){
                       replacing=true;
                       move=dst[i2][j2];
                       r11=i2;r12=j2;
                       return;
                   }
                   if(replacing){
                       dst[r11][r12]=origin;
                       dst[i2][j2]=move;
                       Board.setCell(r11,r12,origin);
                       Board.setCell(i2,j2,move);
                       replacing=false;
                       check();
                   }                  
               }else{
                   //粘贴后二者替换
                  moving=false;
                  dst[i2][j2]=move;
                  temp[r11][r12]=origin;
                  Mess.setCell(r11,r12,origin);
                  Board.setCell(i2,j2,move);
                  check();
               }
                break;
           }
            if(moving||replacing){
               Board.setCell(i2,j2,move);
            }          
           x=x2;y=y2;
           break;
        //原图界面
        case 2:
           switch(keyCode){
             case -7:
               end=true;
               Display.getDisplay(Midlet.instance).setCurrent(Main.instance);
               Main.instance.pause=false;
               Main.instance.curState=3;
               new Thread(Main.instance).start();                       
               break;
            case -6:
               LM.insert(Board,0);
               Board.setVisible(true);
               Mess.setVisible(false);
               TL.setVisible(false);
               screen=3;
               x=x2;y=y2;
               break;
            case -11:
            case -10:
               LM.insert(Mess,0);
               Board.setVisible(false);
               TL.setVisible(false);
               Mess.setVisible(true);
               screen=1;
               break;
            case KEY_STAR:
               LM.insert(TL,0);
               Board.setVisible(false);
               Mess.setVisible(false);
               TL.setVisible(true);
               screen=2;
               x=0;y=0;
               break;
           }           
          break;
        }
        break;
    case 2:
        Handler.level=1;
        end=true;
        Display.getDisplay(Midlet.instance).setCurrent(Main.instance);
        Main.instance.pause=false;
        Main.instance.curState=5;
        new Thread(Main.instance).start();        
        break;
        }
    }

    private void drawPass(){
        if(Handler.win==null){
            Handler.win=new GifDecoder();
            Handler.win.read(getClass().getResourceAsStream("/Res/Picture/Main/win.gif"));
            frameGif=0;
        }
        Main.g.setColor(0);
        Main.g.fillRect(0,0,Main.instance.width,Main.instance.height);
        Main.g.drawImage(Handler.win.getFrame(frameGif),Main.instance.width/2,Main.instance.height/2,Main.g.HCENTER|Main.g.VCENTER);
        frameGif++;
        if(frameGif>Handler.win.getFrameCount()-1)frameGif=0;
        Main.g.setColor(0xffff);
        Main.g.drawString("过关成功。",Main.instance.width/2,3*Main.instance.height/4,Main.g.HCENTER|Main.g.TOP);
    }   
   
    private void drawBlock(){
        Main.g.setColor(0xffff);
        Main.g.fillRect(0,0,Main.instance.width,Main.instance.height);
        LM.paint(Main.g,Main.instance.width/2-pintu.getWidth()/2,Main.instance.height/2-pintu.getHeight()/2);
        for(int i=0;i<=X;i++){
            //画竖线
            Main.g.setColor(0);
            Main.g.drawLine(Main.instance.width/2-pintu.getWidth()/2+pintu.getWidth()/X*i,Main.instance.height/2-pintu.getHeight()/2,Main.instance.width/2-pintu.getWidth()/2+pintu.getWidth()/X*i,Main.instance.height/2+pintu.getHeight()/2);
        }
        for(int i=0;i<=Y;i++){
            //画横线
            Main.g.setColor(0);
            Main.g.drawLine(Main.instance.width/2-pintu.getWidth()/2,Main.instance.height/2-pintu.getHeight()/2+pintu.getHeight()/Y*i,Main.instance.width/2+pintu.getHeight()/2,Main.instance.height/2-pintu.getHeight()/2+pintu.getHeight()/Y*i);           
        }
        if(screen!=2){
            Main.g.setColor(0xff0000);
            Main.g.drawRect(x,y,pintu.getWidth()/X,pintu.getHeight()/Y);
        }       
    }
   
    public void check(){
        count=0;
        for(int i=0;i<X;i++)
            for(int j=0;j<Y;j++)
                if(dst[i][j]==X*j+i+1)count++;
        if(count==X*Y)state=2;
    }
   
    public void run() {
        Handler.instance.playAudio("/Res/music/Level3/3.mid");   
        while(!end){
            switch(state){
                case 0:
                    drawLoad();
                    break;
                case 1:
                    drawBlock();
                    break;
                case 2:
                    drawPass();
                    break;
            }
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){}
            flushGraphics();
        }
    }
}
分享到:
评论

相关推荐

    手机拼图游戏

    本项目以"手机拼图游戏"为主题,旨在分享一种基于Java语言的手机游戏编写基础,帮助初学者快速理解游戏开发的基本流程和技巧。下面,我们将详细探讨相关知识点。 首先,Java作为Android平台的主要开发语言,其强大...

    基于App Inventor的九宫格拼图游戏设计与实现.pdf

    1. App Inventor软件:App Inventor是一款图形化界面的手机编程软件,不需要太多编程基础,就可以轻松开发出属于自己的拼图游戏。 2. 九宫格拼图游戏设计:游戏设计思路包括准备拼图素材、游戏布局、游戏开始时随机...

    基于Android的拼图游戏APP源码,Android拼图游戏APP源码,Android小游戏源码

    总的来说,这个基于Android的拼图游戏APP源码为我们提供了深入学习Android开发的机会,涵盖了从基础的UI设计到高级的游戏逻辑实现等多个方面。通过对源码的阅读和学习,开发者可以提升自己的Android编程技能,并且对...

    C#写的手机拼图游戏能实现游戏功能

    标题中的“C#写的手机拼图游戏能实现游戏功能”表明这是一个使用C#编程语言开发的手机应用程序,其核心功能是拼图游戏。C#是一种广泛应用于桌面、Web以及移动平台开发的面向对象的编程语言,由微软公司推出,特别...

    基于Android的拼图游戏

    《基于Android的拼图游戏开发详解》 在移动设备领域,Android系统因其开源特性与广泛的应用,成为开发者们实现各种创意应用的首选平台。本文将深入探讨一款基于Android的拼图游戏,它不仅提供了多种难度选择,还有...

    手机拼图游戏附源代码

    【标题】:“手机拼图游戏附源代码” 这个标题揭示了资源的核心内容——一个手机上的拼图游戏,并且提供有源代码。这可能是为开发者或编程学习者准备的一个项目,尤其是对Java 2 Micro Edition (J2ME)感兴趣的人。...

    华容道手机拼图游戏(经典)

    《华容道手机拼图游戏(经典)》是一款基于中国古代益智游戏的现代数字化实现,由ktoolbar开发工具精心打造。这款应用将传统的华容道游戏与现代科技相结合,为玩家带来全新的游戏体验。 华容道游戏源于中国,历史...

    java手机游戏拼图

    本篇文章将深入探讨如何利用J2ME技术创建一个简单的手机拼图游戏,以帮助初学者了解游戏开发的基本流程和关键技巧。 1. **J2ME简介** J2ME是Java平台的一个子集,设计用于嵌入式设备和移动设备,如手机和平板电脑...

    J2ME 手机 拼图 游戏

    综上所述,这个J2ME手机拼图游戏的实现涉及了J2ME的基础架构、游戏逻辑、数据持久化和图像处理等多个核心知识点。通过理解并分析这些组件,我们可以学习到如何在移动平台上构建一个完整的互动娱乐应用。对于想要深入...

    android版拼图游戏源码

    【Android版拼图游戏源码】是一个专门为Android平台开发的游戏应用程序,它提供了拼图游戏的完整实现,包括源代码和内部注释。这个游戏共有9个关卡,这意味着玩家可以通过不同难度级别的拼图来挑战自己的思维和解决...

    Js拼图游戏实现.zip

    在"Js拼图游戏实现"这个项目中,你将能够找到一个完整的JavaScript拼图游戏实例,包括HTML、CSS和JavaScript代码。通过研究这个源码,你可以学习到上述提到的各种技术,并理解它们如何协同工作,创建出一个交互式的...

    微信小程序拼图游戏.zip

    本项目“微信小程序拼图游戏.zip”显然是一个基于微信小程序平台开发的拼图游戏。 开发微信小程序涉及的主要知识点包括: 1. **微信小程序框架**:微信小程序使用自家的WXML(Weixin Markup Language)和WXSS...

    html5微信手机过关拼图游戏源码下载

    通过JavaScript,我们可以控制Canvas元素,实现拼图游戏中的图像切割、移动、旋转和拼接等功能。 2. **JavaScript**:JavaScript是实现游戏逻辑的主要编程语言。在拼图游戏中,JavaScript用于处理用户的触摸事件...

    J2ME开发的手机拼图游戏

    本项目是一个基于J2ME开发的手机拼图游戏,它证明了即使在资源有限的移动设备上,也可以实现趣味性和交互性良好的游戏体验。 **J2ME架构与核心技术** J2ME由两部分组成:Configuration(配置)和Profile(配置文件...

    Java拼图游戏手机版

    4. **游戏逻辑**:实现拼图游戏的关键在于正确的碎片交换算法,确保每次操作都是有效的,并在正确的位置上锁定碎片。 5. **状态保存**:为了方便玩家,游戏应支持保存进度,以便玩家下次可以继续未完成的游戏。 6. *...

    js拼图游戏.rar

    【标题】"js拼图游戏.rar"所涉及的是一个基于JavaScript实现的拼图游戏项目,这类游戏通常通过将图片切割成多个小块并打乱顺序,玩家需要通过拖动来恢复原图。JavaScript是一种广泛应用于网页开发的脚本语言,它能够...

    JS拼图游戏源码

    【JS拼图游戏源码】是一个使用JavaScript编程语言开发的互动娱乐项目,旨在提供一个基于网页的拼图游戏体验。这款游戏的核心是通过编程实现图片的分割、打乱和重组,让玩家通过移动拼块来完成游戏。以下是关于这个...

Global site tag (gtag.js) - Google Analytics