js+canvas手撸一个迷宫小游戏

本文介绍了一款使用JavaScript和Canvas构建的H5迷宫小游戏,通过连通图确保游戏可玩性和随机性。游戏流程包括生成迷宫、移动者和终点,以及计时器控制。在连通图方案中,随机连接相邻节点,直至起点与终点连通,保证可抵达性。此外,文章提供了一个替代方案,通过从起点遍历所有节点来生成迷宫。
摘要由CSDN通过智能技术生成

更多精彩文章请访问我的个人博客(zhuoerhuobi.cn)


纯H5的小游戏,放在了404页面,增添了网站的有趣性。点此试玩

一、项目分析

游戏构成要素
  1. 三级迷宫(重点)
  2. 移动者
  3. 终点
  4. 计时器
游戏流程
  1. 生成小尺寸迷宫
  2. 在迷宫中生成移动者和终点
  3. 用户开始游戏,移动者开始移动,计时器开始计时
  4. 移动者抵达终点,重新生成中尺寸迷宫,以及新的移动者和终点
  5. 移动者抵达终点,重新生成大尺寸迷宫,以及新的移动者和终点
  6. 移动者抵达终点,计时器停止计时,页面提示通关信息和通关时间,点击确定后跳转回首页
核心要素(迷宫)

要保证迷宫的可抵达性、随机性、一定的趣味性(复杂度)。

实现方案:连通图。随机的对任意两个相邻的不连通的节点,进行连通操作,直到起点与终点在同一连通图中。

该方案保证了随机性、可抵达性,根据测试,趣味性尚可,在大尺寸迷宫难度下具有一定难度。

替代方案:从起点随机遍历所有未抵达的节点,直到所有节点可抵达。

该方案保证了随机性、可抵达性(并且唯一),根据测试,复杂度较高,容易出现很长的死胡同(因为遍历产生的特性),但是道路唯一,不存在环路。

二、代码实现

生成迷宫

先用线条画出指定大小的格子棋盘。

var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = 800;
canvas.height = 800;
$("#canvasDiv").append(canvas);

var boardSize = 14;  //将迷宫大小设置为变量,便于关卡变化
var piecePos;
var tree;
var reachable;
var startTime;
var costTime;
var mission;

//将画线抽象成一个动作
function drawLine(ctx, startX, startY, endX, endY) {
   
    ctx.beginPath();
    ctx.moveTo(startX, startY);
    ctx.lineTo(endX, endY);
    ctx.stroke();
    ctx.closePath();
}

function drawChessBoard() {
   
    ctx.strokeStyle="#202935";
    ctx.lineWidth = 3;
    drawLine(ctx,15,15,15,15+30*boardSize);
    drawLine(ctx,15,15,15+30*boardSize,15);
    for (var i = 1; i < boardSize; i++) {
   
        ctx.strokeStyle="grey";
        ctx.lineWidth = 2;
        drawLine(ctx,15+i*30,15,15+i*30,15+30*boardSize);
        drawLine(ctx,15,15+i*30,15+30*boardSize,15+i*30);
    }
    ctx.strokeStyle="#202935";
    ctx.lineWidth = 3;
    drawLine(ctx,15+boardSize*30,15,15+30*boardSize,15+30*boardSize);
    drawLine(ctx,15,15+30*boardSize,15+30*boardSize,15+30*boardSize);
}

接下来逻辑上用二维数组代表迷宫,对其使用并查集操作生成迷宫。界面上擦掉连通的节点之间的“墙”。

//tree是表示同一子连通图的树,根节点相同则表示相互连通
function root(i) {
   
    if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值