1. 程式人生 > >java寫的推箱子

java寫的推箱子

javaFX寫的介面  大家可以一起探討學習

核心程式碼:

 /**
     * 判斷小人是否可以移動
     *
     * @param x1 小人下一步的x軸
     * @param y1 小人下一步的y軸
     * @param x2 小人下二步的x軸
     * @param y2 小人下二步的y軸
     * @return
     */
    boolean tryMove(int x1, int y1, int x2, int y2) {
        if (x1 < 0 || x2 < 0 || y1 < 0 || y2 < 0) return false;//若果超出地圖的左上,不通過
        //若果超出地圖的右下,不通過
        if (x1 > Config.map_width || x2 > Config.map_width || y1 > Config.map_height || y2 > Config.map_height)
            return false;
        if (curMap[x1][y1] == 1) return false; //如果小人前面是牆不通過
        if (curMap[x1][y1] == 3 || curMap[x1][y1] == 5) { //小人下一步是箱子 需要判斷箱子前面有沒有障礙物(箱子/牆)
            if (curMap[x2][y2] == 1 || curMap[x2][y2] == 3 || curMap[x2][y2] == 5) {
                return false;
            } else { //沒有障礙 小人前面的箱子前進一步
                curMap[x2][y2] = 3;
            }
        }
        //如果都沒判斷成功小人前進一步
        curMap[x1][y1] = 4;//更改地圖對應座標點的值
        //移動之前的座標
        int v = oriMap[manX][manY];
        if (v != 2) {//若果剛開始小人位置不是球的話
            if (v == 5) {//可能是5 既有箱子又有球
                v = 2;//若果小人本身就在球上面的話移開之後還是顯示陷進
            } else {
                v = 0;//小人移開之後之前小人的位置改為地板
            }
        }
        //重置小人位置的地圖引數
        curMap[manX][manY] = v;
        //小人移動 重置小人的座標
        manX = x1;
        manY = y1;
        //返回true 代表小人移動了
        return true;
    }
/**
     * 繪製地圖
     */
    public void drawMap() {

        Image image = Config.block;//初始圖片
        double W = image.getWidth();
        double H = image.getHeight();

        for (int i = 0; i < curMap.length; i++) {//行
            for (int j = 0; j < curMap[i].length; j++) {//列

                image = Config.block;//初始圖片
                //繪製地板
                pen.drawImage(image, j * W, i * H);

                switch (curMap[i][j]) {
                    case 1://繪製牆壁
                        image = Config.wall;
                        break;
                    case 2://繪製球
                        image = Config.ball;
                        break;
                    case 3://繪製箱子
                        image = Config.box;
                        break;
                    case 4://繪製小人
                        image = this.curMan;
                        manX = i;
                        manY = j;
                        break;
                    case 5://繪製箱子
                        image = Config.box;
                        break;
                    default:
                        break;
                }

                //每個圖片不一樣寬 需要在對應地板的中心繪製地圖
                pen.drawImage(image, W * j - (image.getWidth() - W) / 2, H * i - (image.getHeight() - H), image.getWidth(), image.getHeight());

            }
        }

    }

執行效果圖:

效果圖
執行效果圖