一  项目简介

这是一个基于原生JavaScript开发的随机迷宫游戏,使用深度优先搜索(DFS)算法生成独一无二的迷宫。游戏采用Canvas绘制,支持多种操作模式和特殊技能,带来流畅有趣的游戏体验。

**在线体验:https://yunshangtool.cn/Educational-entertaining/random-maze-generator/

二 游戏玩法

- **目标:** 控制发光的绿色光点从左上角起点到达右下角红色出口
- **控制方式:** 
  - 方向键 (↑↓←→) 或 WASD - 智能滑行到尽头
  - Shift + 方向键 - 精细单步移动
  - 空格键 - 激活穿墙术(每局1次)

三 亮点功能

1. **深度优先搜索算法生成迷宫**
   - 每次生成的迷宫都独一无二
   - 保证从起点到终点有可通路径

2. **双模式移动系统**
   - **滑行模式:** 一键滑到底,快速通过长通道
   - **单步模式:** 精确控制,适合复杂区域

3. **穿墙术技能**
   - 按空格键激活,光点变橙色
   - 可穿过一堵墙,增加策略性
   - 每局限用1次,需谨慎使用

4. **炫酷视觉效果**
   - 发光的绿色光点(主角)
   - 持续的呼吸动画效果
   - 穿墙模式下变为橙色火焰

5. **专业胜利弹窗**
   - 五彩纸屑飘落动画
   - 详细游戏数据统计
   - 智能鼓励文字

四 核心算法详解

### 1. 深度优先搜索(DFS)生成迷宫

迷宫生成是整个项目的核心,使用经典的DFS算法

generateMaze() {
    // 1. 初始化:所有格子都有四面墙
    for (let y = 0; y < this.rows; y++) {
        for (let x = 0; x < this.cols; x++) {
            this.maze[y][x] = {
                visited: false,
                walls: { top: true, right: true, bottom: true, left: true }
            };
        }
    }
    // 2. DFS遍历
    const stack = [];
    stack.push({ x: 0, y: 0 });
    this.maze[0][0].visited = true;
    while (stack.length > 0) {
        const current = stack[stack.length - 1];
        const neighbors = this.getUnvisitedNeighbors(current.x, current.y);
        if (neighbors.length > 0) {
            // 随机选择一个未访问的邻居
            const next = neighbors[Math.floor(Math.random() * neighbors.length)];
            // 移除两个格子之间的墙
            this.removeWall(current, next);
            // 标记为已访问并入栈
            this.maze[next.y][next.x].visited = true;
            stack.push(next);
        } else {
            // 回溯
            stack.pop();
        }
    }
}

**算法原理:**
1. 从起点开始,标记为已访问
2. 随机选择一个未访问的邻居格子
3. 移除当前格子和邻居之间的墙
4. 将邻居标记为已访问,加入栈
5. 如果没有未访问的邻居,回溯到上一个格子
6. 重复直到所有格子都被访问

这样生成的迷宫具有以下特点:
- ✅ 保证所有格子连通
- ✅ 没有循环路径(树形结构)
- ✅ 从起点到终点有唯一最短路径

### 2. 智能滑行系统

movePlayerToEnd(dx, dy) {
    let steps = 0;
    // 持续向该方向移动,直到碰墙
    while (this.canMove(this.playerPos.x, this.playerPos.y, dx, dy)) {
        this.playerPos.x += dx;
        this.playerPos.y += dy;
        steps++;
    }
    return steps;
}

滑行系统让玩家按一次方向键就能滑到该方向的尽头,大大减少了重复按键的繁琐感。

3. 穿墙术实现

// 激活穿墙模式
if (key === ' ' && this.wallPassRemaining > 0) {
    this.wallPassActive = !this.wallPassActive;
}
// 穿墙移动
if (this.wallPassActive && this.wallPassRemaining > 0) {
    // 忽略墙壁检测,直接移动
    this.playerPos.x += dx;
    this.playerPos.y += dy;
    this.wallPassRemaining--;
    this.wallPassActive = false;
}

穿墙术通过临时跳过墙壁检测来实现,激活时光点颜色从绿色变为橙色,提供清晰的视觉反馈。

### 4. Canvas动画渲染

startAnimation() {
    const animate = () => {
        this.render();
        requestAnimationFrame(animate);
    };
    animate();
}
render() {
    // 绘制迷宫
    // 绘制发光光点(带闪烁效果)
    const time = Date.now() / 1000;
    const pulse = Math.sin(time * 3) * 0.3 + 0.7;
    // 绘制光晕、核心、闪烁...
}

使用 `requestAnimationFrame` 实现60FPS的流畅动画,光点持续闪烁,带来生动的视觉效果。

## UI/UX设计亮点

### 1. 渐变配色方案

采用现代流行的紫色渐变主题:
- 主色:`#667eea` → `#764ba2`
- 辅色:粉色、橙色、蓝色渐变按钮
- 背景:纯白色,简洁专业

2. 响应式布局

@media (max-width: 768px) {
    .header-content {
        flex-direction: column;
    }
    .game-info {
        flex-direction: column;
    }
}

完美适配移动端,自动调整布局。

3. 微交互设计

- 按钮悬停效果(上浮 + 阴影)
- Logo浮动动画
- 穿墙模式激活时的缩放动画
- 胜利弹窗的五彩纸屑

四 游戏攻略

### 新手技巧

1. **先熟悉滑行模式:** 在宽敞区域使用滑行,快速探索
2. **困住时用单步模式:** Shift + 方向键精确控制
3. **不要急着用穿墙术:** 保留到真正需要时再用
4. **观察迷宫结构:** 尽量走主干道,避免死胡同

### 高级策略

1. **路径规划:** 观察终点方向,优先选择靠近终点的路径
2. **穿墙时机:** 在接近终点但被墙阻隔时使用效果最佳
3. **减少步数:** 尽量使用滑行模式,减少单步移动

**点赞收藏是对我最大的鼓励!**

欢迎访问:https://yunshangtool.cn/ 主网站

- 您的每一个点赞都是我继续分享的动力

- 收藏这个项目,随时可以回来学习参考

- 分享给更多同学,一起进步成长