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());

            }
        }

    }

 

运行效果图:

效果图
运行效果图

源码下载:https://download.csdn.net/download/qq_40087987/10673556

素材来源:https://blog.csdn.net/bide_tootight/article/details/79459116

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
推箱子小游戏是一个经典的益智游戏,玩家需要将箱子推到指定的位置才能过关。以下是一个简单的Java代码示例,实现了推箱子小游戏的基本功能。 首先,我们需要定义一个地图类来表示游戏的地图,包括地图的大小、障碍物位置、目标位置、箱子位置等信息。 ```java public class Map { private int width; // 地图宽度 private int height; // 地图高度 private int[][] map; // 地图数据,0表示空地,1表示障碍物,2表示目标位置,3表示箱子位置 public Map(int width, int height, int[][] map) { this.width = width; this.height = height; this.map = map; } public int getWidth() { return width; } public int getHeight() { return height; } public int[][] getMap() { return map; } public void setMap(int[][] map) { this.map = map; } } ``` 接下来,我们需要定义一个玩家类来表示玩家,包括玩家的位置信息和移动方法。 ```java public class Player { private int x; // 玩家横坐标 private int y; // 玩家纵坐标 public Player(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public void move(int dx, int dy) { // 玩家移动方法,dx表示横向移动距离,dy表示纵向移动距离 this.x += dx; this.y += dy; } } ``` 最后,我们需要定义一个游戏类来控制游戏的流程,包括初始化地图、显示地图、处理玩家移动等。 ```java import java.util.Scanner; public class Game { private Map map; // 地图 private Player player; // 玩家 public Game(Map map, Player player) { this.map = map; this.player = player; } public void initMap() { // 初始化地图 int[][] m = { {1, 1, 1, 1, 1}, {1, 0, 3, 2, 1}, {1, 0, 0, 0, 1}, {1, 2, 3, 0, 1}, {1, 1, 1, 1, 1} }; map.setMap(m); } public void showMap() { // 显示地图 int[][] m = map.getMap(); for (int i = 0; i < map.getHeight(); i++) { for (int j = 0; j < map.getWidth(); j++) { if (i == player.getY() && j == player.getX()) { System.out.print("P"); // 玩家位置 } else if (m[i][j] == 0) { System.out.print(" "); // 空地 } else if (m[i][j] == 1) { System.out.print("#"); // 障碍物 } else if (m[i][j] == 2) { System.out.print("O"); // 目标位置 } else if (m[i][j] == 3) { System.out.print("*"); // 箱子位置 } } System.out.println(); } } public boolean isWin() { // 判断是否过关 int[][] m = map.getMap(); for (int i = 0; i < map.getHeight(); i++) { for (int j = 0; j < map.getWidth(); j++) { if (m[i][j] == 2 || m[i][j] == 3) { return false; // 还有目标位置或箱子位置未被覆盖 } } } return true; } public void run() { Scanner scanner = new Scanner(System.in); while (true) { showMap(); if (isWin()) { System.out.println("恭喜你过关了!"); break; } System.out.print("请输入移动方向:"); String input = scanner.nextLine(); int dx = 0, dy = 0; if (input.equals("w")) { dy = -1; // 上 } else if (input.equals("s")) { dy = 1; // 下 } else if (input.equals("a")) { dx = -1; // 左 } else if (input.equals("d")) { dx = 1; // 右 } int[][] m = map.getMap(); int x = player.getX() + dx; int y = player.getY() + dy; if (m[y][x] == 0 || m[y][x] == 2) { // 空地或目标位置,玩家可以移动 player.move(dx, dy); } else if (m[y][x] == 3) { // 箱子位置,判断箱子移动是否合法 int bx = x + dx; int by = y + dy; if (m[by][bx] == 0 || m[by][bx] == 2) { // 箱子可以移动 player.move(dx, dy); m[y][x] = 0; m[by][bx] = 3; } } } } public static void main(String[] args) { Map map = new Map(5, 5, new int[5][5]); Player player = new Player(2, 1); Game game = new Game(map, player); game.initMap(); game.run(); } } ``` 上述代码实现了一个简单的推箱子小游戏,玩家可以通过输入w、s、a、d来移动,将箱子推到目标位置即可过关。可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值