程序功能:
1,随机生成迷宫地图:游戏中需要随机生成迷宫地图,地图大小更改可操作,地图路径的求解,引入java.util.Random类,利用Random类提供的生成随机数方法,随机生成障碍物、通路等状态。迷宫地图采用二维数组进行表示与存储。
2,判断玩家闯关是否成功:根据玩家的当前位置是否位于地图的出口点来判断玩家闯关是否成功。如果成功则根据游戏步数修改本次游戏积分。
3,游戏主控模块:游戏的主控模块是一个基于用户输入的键位控制模块。输入“←↑↓→”则根据是否能进行移动来更新游戏界面和当前位置,前提条件是游戏未结束。输入W/S则相应增加/减小迷宫的大小;输入"Y"则显示迷宫路径,输入“X”则刷新迷宫;若游戏结束,则退出游戏主控模块,输出玩家的输赢状态;否则,主控模块根据用户输入的方向键,不断修改地图状态及更新玩家积分。
程序设计思路:
1,prim算法生成随机迷宫
2,A*算法求解迷宫
3,迷宫游戏窗口与面板初始化和设计
目录
其中: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