📄 picture.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 + -