import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class Puzzle extends Applet implements MouseListener, KeyListener,
Runnable {
Image[] myImage = new Image[9];
//9个用来装入每个拼图的图片对象
Image myImageAll;
//总的大图片
int myImageNo[][] = new int[3][3];
//标志现在各个拼图的排列情况
final int NO_IMAGE = -1;
//此位置没有拼图
final int IMAGE_WIDTH = 120;
//每张小图的宽
final int IMAGE_HEIGHT = 120;
//每张小图的高
final int DIRECTION_UP = 1;
final int DIRECTION_DOWN = 2;
final int DIRECTION_LEFT = 3;
final int DIRECTION_RIGHT = 4;
final int DIRECTION_NONE = -1;
final int DELTAX = 120;
//标志提示信息区的宽度
boolean bWantStartNewGame = false;
//游戏是否结束,是否需要开始新游戏
int nStep = 0;
//已经走的步数
int nTime = 0;
//已经玩过的时间,以秒为单位
Thread thTimer;
//计时器线程
int nScore = 0;
//玩家所得的分数
int NumOfImage = 0;
//拼图底图所使用的图片的个数
String ImageName[] = new String[9];
//记录拼图底图的名字
boolean bOnShowAll = false;
//预览的开关
AudioClip myAudioClip1, myAudioClip2;
//装载要播放的声音对象
public void init() {
String param = getParameter("NumOfImage");
try {
NumOfImage = Integer.parseInt(param);
} catch (Exception e) {
NumOfImage = 1;
System.out.println("无法将参数值转换为整型。");
}
for (int i = 0; i < NumOfImage; i++) {
ImageName[i] = getParameter("Image" + (i + 1)) + ".jpg";
System.out.println(ImageName[i]);
if (ImageName[i] == null)
ImageName[i] = "puzzle.jpg";
}
System.out.println(param);
MediaTracker mediaTracker = new MediaTracker(this);
myImageAll = getImage(getDocumentBase(), "PuzzleImage/" + ImageName[0]);
//装载总的大图片
mediaTracker.addImage(myImageAll, 1);
try {
mediaTracker.waitForID(1);
} catch (Exception e) {
System.out.println("图片装载出错");
}
if (mediaTracker.isErrorAny())
System.out.println("图片装载出错");
for (int i = 0; i < 9; i++) {
myImage[i] = createImage(IMAGE_WIDTH, IMAGE_HEIGHT);
Graphics g = myImage[i].getGraphics();
int nRow = i % 3;
int nCol = i / 3;
g.drawImage(myImageAll, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, nRow
* IMAGE_WIDTH, nCol * IMAGE_HEIGHT, (nRow + 1)
* IMAGE_WIDTH, (nCol + 1) * IMAGE_HEIGHT, this);
System.out.println("init " + i);
// myImageAll.getGraphics().clipRect(1,1,120,120);
// g.copyArea(1,1,120,120,0,0);
}
System.out.println("init over");
thTimer = new Thread(this);
//为线程分配内存空间
thTimer.start();
//开始线程
initData();
myAudioClip1 = getAudioClip(getCodeBase(), "Sound/move.mid");
myAudioClip2 = getAudioClip(getCodeBase(), "Sound/notmove.mid");
addMouseListener(this);
addKeyListener(this);
}
public void initImageAgain(int nImgNo) {
//nImgNo为要装载的图像是第几个图像。
if (nImgNo > NumOfImage) {
showStatus("你要的图片不存在!!");
return;
}
MediaTracker mediaTracker = new MediaTracker(this);
myImageAll = getImage(getDocumentBase(), "PuzzleImage/"
+ ImageName[nImgNo]);
mediaTracker.addImage(myImageAll, 1);
try {
mediaTracker.waitForAll();
} catch (Exception e) {
System.out.println("图片装载出错");
}
for (int i = 0; i < 9; i++) {
myImage[i] = createImage(IMAGE_WIDTH, IMAGE_HEIGHT);
Graphics g = myImage[i].getGraphics();
int nRow = i % 3;
int nCol = i / 3;
g.drawImage(myImageAll, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, nRow
* IMAGE_WIDTH, nCol * IMAGE_HEIGHT, (nRow + 1)
* IMAGE_WIDTH, (nCol + 1) * IMAGE_HEIGHT, this);
System.out.println("dfsdfdfdsdf" + i);
}
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
g.setColor(Color.white);
//将当前颜色变为白色
g.fillRect(0, 0, DELTAX, IMAGE_HEIGHT * 3);
//填充左边的提示信息区域
g.setFont(new Font("宋体", Font.PLAIN, 15));
//设置字体
g.setColor(Color.blue);
//设置颜色
g.drawString("步数:" + nStep, 5, 20);
g.drawString("现有图片" + NumOfImage + "张", 5, 60);
g.drawString("请按1-" + NumOfImage + "键改变图片", 5, 100);
//在坐标(10,20)画出字串,来显示现在走了多少步。
g.setColor(Color.white);
if (bOnShowAll) {
int x = DELTAX;
int y = 0;
g.drawImage(myImageAll, x, y, this);
return;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int x = i * IMAGE_WIDTH + DELTAX;
int y = j * IMAGE_HEIGHT;
if (myImageNo[i][j] == NO_IMAGE)
g.fill3DRect(x, y, IMAGE_WIDTH, IMAGE_HEIGHT, true);
else {
g.drawImage(myImage[myImageNo[i][j]], x, y, this);
g.drawRect(x, y, IMAGE_WIDTH, IMAGE_HEIGHT);
}
}
}
checkStatus();
if (bWantStartNewGame) {
//如果游戏结束,玩家将拼图的顺序排对之后
nScore = 1000 - nStep * 10 - nTime;
g.setColor(Color.blue);
g.drawString("请按任意键重新开始", 5, 140);
g.setColor(Color.red);
g.setFont(new Font("宋体", Font.PLAIN, 40));
g.drawString("你赢了" + nScore + "分", 70 + DELTAX, 160);
g.drawString("祝贺你!", 110 + DELTAX, 210);
}
}
public Puzzle() {
}
public void initData() {
int[] nHasDistrib = new int[9];
for (int i = 0; i < 9; i++)
nHasDistrib[i] = 0;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) {
int nCount = j * 3 + i;
int nImgNo = -1;
do {
nImgNo = (int) (Math.random() * 9);
} while (nHasDistrib[nImgNo] == 1);
//1代表已经分配了这张图片
myImageNo[i][j] = nImgNo;
nHasDistrib[nImgNo] = 1;
System.out.println("test..");
}
}
myImageNo[(int) (Math.random() * 3)][(int) (Math.random() * 3)] = NO_IMAGE;
nStep = 0;
nTime = 0;
//清空计时器
}
public int directionCanMove(int nCol, int nRow) {
if ((nCol - 1) >= 0)
if (myImageNo[nRow][nCol - 1] == NO_IMAGE)
return DIRECTION_UP;
if ((nCol + 1) <= 2)
if (myImageNo[nRow][nCol + 1] == NO_IMAGE)
return DIRECTION_DOWN;
if ((nRow - 1) >= 0)
if (myImageNo[nRow - 1][nCol] == NO_IMAGE)
return DIRECTION_LEFT;
if ((nRow + 1) <= 2)
if (myImageNo[nRow + 1][nCol] == NO_IMAGE)
return DIRECTION_RIGHT;
return DIRECTION_NONE;
}
public void move(int nCol, int nRow, int nDirection) {
switch (nDirection) {
case DIRECTION_UP:
myImageNo[nRow][nCol - 1] = myImageNo[nRow][nCol];
myImageNo[nRow][nCol] = NO_IMAGE;
break;
case DIRECTION_DOWN:
myImageNo[nRow][nCol + 1] = myIma