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

📄 puzzle.java

📁 这是一个拼图游戏。玩家应该将打散的小图拼成一张大图。 玩家可以通过鼠标和键盘来移动小图
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

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) {

⌨️ 快捷键说明

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