Java随机Prim算法和A*算法生成随机迷宫

程序功能:

1,随机生成迷宫地图:游戏中需要随机生成迷宫地图,地图大小更改可操作,地图路径的求解,引入java.util.Random类,利用Random类提供的生成随机数方法,随机生成障碍物、通路等状态。迷宫地图采用二维数组进行表示与存储。

2,判断玩家闯关是否成功:根据玩家的当前位置是否位于地图的出口点来判断玩家闯关是否成功。如果成功则根据游戏步数修改本次游戏积分。

3,游戏主控模块:游戏的主控模块是一个基于用户输入的键位控制模块。输入“←↑↓→”则根据是否能进行移动来更新游戏界面和当前位置,前提条件是游戏未结束。输入W/S则相应增加/减小迷宫的大小;输入"Y"则显示迷宫路径,输入“X”则刷新迷宫;若游戏结束,则退出游戏主控模块,输出玩家的输赢状态;否则,主控模块根据用户输入的方向键,不断修改地图状态及更新玩家积分。

程序设计思路:

1,prim算法生成随机迷宫

2,A*算法求解迷宫

3,迷宫游戏窗口与面板初始化和设计

目录

1,Maze类(随机Prim方法)

2,AStar类(A*算法)

3,MazePanel类:

4,Main类


其中:0表示障碍物,1表示通路,2表示当前位置。

游戏默认迷宫四周由障碍物围绕,入口点位于地图的左上角点,出口点位于地图右下角点。

用户在控制台输入方向键“←↑↓→”控制移动;输入“x”字符,表示提前退出游戏。

程序运行结果

迷宫利用率较大

 

1,Maze类(随机Prim方法)

具体步骤:

1.让迷宫全是墙.
2.选一个单元格作为迷宫的通路,然后把它的邻墙放入列表
3.当列表里还有墙时
    1.从列表里随机选一个墙,如果这面墙分隔的两个单元格只有一个单元格被访问过
          1.那就从列表里移除这面墙,即把墙打通,让未访问的单元格成为迷宫的通路
          2.把这个格子的墙加入列表
    2.如果墙两面的单元格都已经被访问过,那就从列表里移除这面墙

代码实现:

package com.company;

import java.util.Random;

class Maze {
    // 初始化一个地图 默认所有路不通
    //最终产生的二维数组大小实际为(2width+1) * (2height+1)
    private static int width;
    private static int height;
    public static int[][] map;// 存放迷宫的数组
    private static int r;
    private static int c;

    Maze(int r0, int c0) {
        width = r0;
        height = c0;
        r = 2 * width + 1;
        c = 2 * height + 1;
        map = new int[r][c];
    }

    public static int[][] Init() {
        for (int i = 0; i < r; i++) // 将所有格子都设为墙
            for (int j = 0; j < c; j++)
                map[i][j] = 0;// 0 为墙 1为路
        // 中间格子放为1
        for (int i = 0; i < width; i++)
            for (int j = 0; j < height; j++)
                map[2 * i + 1][2 * j + 1] = 1;// 0 为墙 1为路
        // 普里姆算法
        rdPrime();
        return map;
    }

    public static void rdPrime() {
        // ok存放已访问队列,not存放没有访问队列
        int[] ok, not;
        int sum = width * height;
        int count = 0;// 记录访问过点的数量
        ok = new int[sum];
        not = new int[sum];
        // width上各方向的偏移 height各方向的偏移 0左 1右 3上 2下
        int[] offR = {-1, 1, 0, 0};
        int[] offC = {0, 0, 1, -1};

        // 四个方向的偏移 左右上下
        int[] offS = {-1, 1, width, -width}; // 向上向下移动都是变化一行
        // 初始化 ok中0代表未访问,not中0代表未访问
        for (int i = 0; i < sum; i++) {
            ok[i] =0;
            not[i] = 0;
        }
        // 起点
        Random rd = new Random();
        ok[0] = rd.nextInt(sum);// 起始点
        int pos = ok[0];
        // 第一个点存入
        not[pos] = 1;
        while (count < sum) {
            // 取出现在的点
            int x = pos % width;
            int y = pos / width;// 该点的坐标
            int off
  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
生成迷宫的一种常见算法是基于深度优先遍历的随机迷宫生成算法。该算法的基本思路是从一个起始点出发,随机选择一个相邻的未被访问过的点,将其标记为已访问,并将两点之间的墙壁打通。然后以新访问的点为起点继续随机选择未访问过的点,直到所有的点都被访问过。 在Java中,可以使用二维数组表示迷宫地图。数组中的每个元素表示一个格子,可以包含四面墙壁状态的信息(例如用0表示墙壁存在,用1表示墙壁不存在),以及是否被访问过的信息(例如用0表示未被访问过,用1表示已被访问过)。以下是一个基于深度优先遍历的随机迷宫生成算法示例代码: ``` java import java.util.Random; public class MazeGenerator { private int width; // 迷宫宽度 private int height; // 迷宫高度 private int[][] maze; // 迷宫地图 private Random random; // 随机数生成器 // 构造函数 public MazeGenerator(int width, int height) { this.width = width; this.height = height; maze = new int[height][width]; random = new Random(); generateMaze(0, 0); // 从左上角的格子开始生成迷宫 } // 生成迷宫 private void generateMaze(int row, int col) { maze[row][col] = 1; // 标记当前格子已访问过 // 随机顺序访问邻居格子 int[] directions = {0, 1, 2, 3}; // 上、右、下、左 shuffle(directions); // 随机打乱顺序 for (int direction : directions) { int newRow = row; int newCol = col; switch (direction) { case 0: // 上 newRow--; break; case 1: // 右 newCol++; break; case 2: // 下 newRow++; break; case 3: // 左 newCol--; break; } // 判断新格子是否在迷宫范围内且未被访问过 if (newRow >= 0 && newRow < height && newCol >= 0 && newCol < width && maze[newRow][newCol] == 0) { // 打通两格之间的墙壁 if (direction == 0) { // 上 maze[row][col] &= ~1; // 当前格子的上墙壁打通 maze[newRow][newCol] &= ~4; // 新格子的下墙壁打通 } else if (direction == 1) { // 右 maze[row][col] &= ~2; // 当前格子的右墙壁打通 maze[newRow][newCol] &= ~8; // 新格子的左墙壁打通 } else if (direction == 2) { // 下 maze[row][col] &= ~4; // 当前格子的下墙壁打通 maze[newRow][newCol] &= ~1; // 新格子的上墙壁打通 } else if (direction == 3) { // 左 maze[row][col] &= ~8; // 当前格子的左墙壁打通 maze[newRow][newCol] &= ~2; // 新格子的右墙壁打通 } generateMaze(newRow, newCol); // 递归访问新格子 } } } // 随机打乱数组元素的顺序 private void shuffle(int[] array) { for (int i = array.length - 1; i > 0; i--) { int j = random.nextInt(i + 1); int temp = array[i]; array[i] = array[j]; array[j] = temp; } } // 打印迷宫地图 public void printMaze() { for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { System.out.print(maze[i][j] + " "); } System.out.println(); } } // 测试代码 public static void main(String[] args) { MazeGenerator generator = new MazeGenerator(10, 10); generator.printMaze(); } } ``` 运行上述代码,可以生成一个10x10的迷宫地图,并打印出来。你可以根据自己的需要修改迷宫大小,或者将迷宫地图保存为图片等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值