📄 matrix.java.svn-base
字号:
package jigsawpuzzle;
import javax.microedition.lcdui.*;
import java.util.*;
public class Matrix {
public static final int UP = 0;
public static final int DOWN = 1;
public static final int LEFT = 2;
public static final int RIGHT = 3;
private Image picture;
private int m;
private int n;
private int blockWidth;
private int blockHeight;
private Block[][] blocks;
private int hiddenI;
private int hiddenJ;
public Matrix(Image picture, int m, int n, int startX, int startY) {
this.picture = picture;
this.m = m;
this.n = n;
init(m, n, startX, startY);
breakUp();
}
public void init(int m, int n, int startX, int startY) {
blockWidth = picture.getWidth() / m;
blockHeight = picture.getHeight() / n;
blocks = new Block[m][n];
for (int i = 0; i < m; i++) {
blocks[i] = new Block[n];
for (int j = 0; j < n; j++) {
blocks[i][j] = new Block();
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
blocks[i][j].setKey(i * m + j);
blocks[i][j].setStartX(startX);
blocks[i][j].setStartY(startY);
}
}
hiddenI = m - 1;
hiddenJ = n - 1;
}
public void breakUp() {
Random rand = new Random();
for (int i = 0; i < 255; i++) {
moveTo((rand.nextInt() >>> 1) % 4);
}
for (int i = 0; i < getM(); i++) {
moveTo(Matrix.LEFT);
if (i == 0) {
for (int j = 0; j < getN(); j++) {
moveTo(Matrix.UP);
}
}
}
if (isFinish()) {
breakUp();
}
}
public void moveTo(int direction) {
switch (direction) {
case Matrix.UP:
if (getHiddenJ() < getN() - 1) {
blocks[getHiddenI()][getHiddenJ()].setStartY(blocks[getHiddenI()][getHiddenJ()].getStartY() + getBlockHeight());
blocks[getHiddenI()][getHiddenJ() + 1].setStartY(blocks[getHiddenI()][getHiddenJ() + 1].getStartY() - getBlockHeight());
Block temp = blocks[getHiddenI()][getHiddenJ()];
blocks[hiddenI][hiddenJ] = blocks[getHiddenI()][getHiddenJ() + 1];
blocks[hiddenI][hiddenJ + 1] = temp;
hiddenJ++;
}
break;
case Matrix.DOWN:
if (getHiddenJ() > 0) {
blocks[getHiddenI()][getHiddenJ()].setStartY(blocks[getHiddenI()][getHiddenJ()].getStartY() - getBlockHeight());
blocks[getHiddenI()][getHiddenJ() - 1].setStartY(blocks[getHiddenI()][getHiddenJ() - 1].getStartY() + getBlockHeight());
Block temp = blocks[getHiddenI()][getHiddenJ()];
blocks[hiddenI][hiddenJ] = blocks[getHiddenI()][getHiddenJ() - 1];
blocks[hiddenI][hiddenJ - 1] = temp;
hiddenJ--;
}
break;
case Matrix.LEFT:
if (getHiddenI() < getM() - 1) {
blocks[getHiddenI()][getHiddenJ()].setStartX(blocks[getHiddenI()][getHiddenJ()].getStartX() + getBlockWidth());
blocks[getHiddenI() + 1][getHiddenJ()].setStartX(blocks[getHiddenI() + 1][getHiddenJ()].getStartX() - getBlockWidth());
Block temp = blocks[getHiddenI()][getHiddenJ()];
blocks[hiddenI][hiddenJ] = blocks[getHiddenI() + 1][getHiddenJ()];
blocks[hiddenI + 1][hiddenJ] = temp;
hiddenI++;
}
break;
case Matrix.RIGHT:
if (getHiddenI() > 0) {
blocks[getHiddenI()][getHiddenJ()].setStartX(blocks[getHiddenI()][getHiddenJ()].getStartX() - getBlockWidth());
blocks[getHiddenI() - 1][getHiddenJ()].setStartX(blocks[getHiddenI() - 1][getHiddenJ()].getStartX() + getBlockWidth());
Block temp = blocks[getHiddenI()][getHiddenJ()];
blocks[hiddenI][hiddenJ] = blocks[getHiddenI() - 1][getHiddenJ()];
blocks[hiddenI - 1][hiddenJ] = temp;
hiddenI--;
}
break;
}
}
public boolean isFinish() {
for (int i = 0; i < getM(); i++) {
for (int j = 0; j < getN(); j++) {
if (blocks[i][j].getKey() != (i * getM() + j)) {
return false;
}
}
}
return true;
}
public Image getPicture() {
return picture;
}
public int getM() {
return m;
}
public int getN() {
return n;
}
public int getBlockWidth() {
return blockWidth;
}
public int getBlockHeight() {
return blockHeight;
}
public Block getBlockAt(int i, int j) {
return blocks[i][j];
}
public int getHiddenI() {
return hiddenI;
}
public int getHiddenJ() {
return hiddenJ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -