⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 picture.java

📁 利用J2ME在手机上实现的简单的拼图游戏。
💻 JAVA
字号:
package picturepuzzle;

import javax.microedition.lcdui.*;
import java.util.Vector;

/**
 * <p>Title: PicturePuzzle</p>
 *
 * <p>Description: 拼图游戏</p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: Star Group</p>
 *
 * @author 王耀
 * @version 1.0
 */
public class Picture {
  public static final short STATE_PUZZLE =1;   //游戏进行当中
  public static final short STATE_VIEW_IMAGE = 2;  //查看原图片
  public static final short STATE_FINISHED = 3;   //游戏结束
  private Image imgSource;  //大图片

  private Image[] imgMatrix = new Image[9];  //被分割后的小图片
  private int nWidth;  //小图片的宽
  private int nHeight; //小图片的高

  private short[][] nIndex = new short[3][3];   //图片索引,标识九宫格上对应的单元的图片索引号

  private short nState;  //游戏的状态

  private int nHideX;  //被隐藏的方块的X值(0~2)
  private int nHideY;  //被隐藏的方块的Y值(0~2)

  private int nStep = 0;  //游戏中用户移动方块的步数

  public Picture(Image img) {
    nState = this.STATE_PUZZLE;
    imgSource = img;
    nWidth = imgSource.getWidth()/3;
    nHeight = imgSource.getHeight()/3;
    nHideX = 2;
    nHideY = 2;
    //首先从事先存储好的数组当中随机选取一组用于初始化数组nIndex
    short[][] puzzle = {
        {2, 7, 5, 1, 0, 6, 4, 3, 8},
        {1, 6, 7, 5, 2, 3, 4, 0, 8},
        {1, 6, 0, 3, 2, 7, 5, 4, 8},
        {2, 5, 0, 6, 4, 7, 3, 1, 8}
    };
    int n = (int) (System.currentTimeMillis() % 4);
    for(int i=0;i<3;i++)
      for(int j=0;j<3;j++){
        nIndex[i][j] =puzzle[n][3*i+j];
      }
    //初始化imgMatrix[]
    for(int i=0;i<9;i++){
      try{
        imgMatrix[i] = Image.createImage(nWidth, nHeight);
        Graphics g = imgMatrix[i].getGraphics();
        int x = -(i % 3) * nWidth;
        int y = -(i/ 3) * nHeight;
        g.drawImage(imgSource, x, y, Graphics.TOP | Graphics.LEFT);
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * drawImage:绘图函数
   *           根据屏幕大小在适当的位置上绘制图片
   */
  public void drawImage(Graphics gx,int width, int height) {
    int xPos = (width - imgSource.getWidth()) / 2;
    int yPos = (PicPuzzleCanvas.PIC_MAXSIZE - imgSource.getHeight())/2;
    switch(nState){
      case STATE_PUZZLE:
        //首先画出当前的图片数组
        for (int i = 0; i < 3; i++)
          for (int j = 0; j < 3; j++) {
            int index = nIndex[i][j];
            gx.drawImage(imgMatrix[index], xPos + j * nWidth, yPos + i * nHeight,
                         Graphics.TOP | Graphics.LEFT);
          }
        //然后,置黑被隐藏的方块
        gx.setColor(0, 0, 0);
        gx.fillRect( xPos + nHideY * nWidth,  yPos + nHideX * nHeight, nWidth, nHeight);

        //最后画线条
        gx.setColor(255,255,255);
        for (int i = 0; i <= 3; i++) {
          gx.drawLine( xPos,  yPos + i * nHeight,  xPos + 3 * nWidth,  yPos + i * nHeight);
          gx.drawLine( xPos + i * nWidth, yPos ,  xPos + i * nWidth,  yPos + 3 * nHeight);
        }
        break;

      case STATE_VIEW_IMAGE:
        gx.drawImage(this.imgSource, xPos,yPos,Graphics.TOP | Graphics.LEFT);
        break;

      case STATE_FINISHED:
        gx.drawImage(this.imgSource, xPos,yPos,Graphics.TOP | Graphics.LEFT);
        break;
    }
  }

  /**
   * setPuzzleState:将游戏状态设为运行状态,用户此时可以拼图
   */
  public void setPuzzleState() {
    if(nState == this.STATE_FINISHED)
      return;
    else{
      nState = this.STATE_PUZZLE;
    }
  }

  /**
   * setViewPicState:将游戏状态设为查看原始图片状态
   */
  public void setViewPicState() {
    if (nState == this.STATE_FINISHED)
      return;
    else {
      nState = this.STATE_VIEW_IMAGE;
    }

  }

  /**
   * getState:获取当前的游戏状态
   */
  public short getState() {
    return nState;
  }

  /**
   * getStep:获取当前游戏进行的步数
   */
  public int getStep() {
    return nStep;
  }

  /**
   * bIsFinished:判断游戏是否结束
   */
  public boolean bIsFinished() {
    for(int i=0; i<3; i++)
      for(int j=0; j<3; j++){
        if(nIndex[i][j] != i*3+j)
          return false;
      }
    nState = this.STATE_FINISHED;
    return true;
  }

  /**
   * move:移动图片
   */
  public void move(int x, int y) {
    if(nState != this.STATE_PUZZLE)
      return;
    if(x == nHideX && y == nHideY)
      return;
    boolean bMoved = false;
    if(( (x-1) == nHideX && y == nHideY) ||
         ((x+1) == nHideX && y == nHideY) ||
         (x == nHideX && (y-1) == nHideY) ||
         (x == nHideX && (y+1) == nHideY) ){
        swapPic(x,y);
        bMoved = true;
    }

    if(bMoved){
      nStep++;
      if(bIsFinished())
        nState = this.STATE_FINISHED;
    }
  }

  /**
   * swapPic:交换图片和空格的位置
   *
   * @param x int
   * @param y int
   */
  private void swapPic(int x, int y) {
    short temp = nIndex[x][y];
    nIndex[x][y] = nIndex[nHideX][nHideY];
    nIndex[nHideX][nHideY] = temp;
    nHideX = x;
    nHideY = y;
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -