【Animate】 As3脚本制作随机生成迷宫算法可视化

【Animate】 As3脚本制作随机生成迷宫算法可视化

temp

  1. 创建一个动画剪切元件,随便画个小球
  2. 在创建一个动画剪切元件,把之前的小球拖进来,并赋值实例名wa
  3. 然后添加以下动作脚本,不要添加帧数

image-20230211225812848

var sp:Shape = new Shape;	// 画布对象
var i,j,k:int;				// 索引数字
var d:int = 20;				// 方格大小
var s:Number = 1.5;			// 调整数字
var x0:int = 0;				// 横向位置
var y0:int = 0;				// 纵向位置
var x1:int = 30;			// 横向边界
var y1:int = 30;			// 纵向边界
var t0:int = 1;				// 计数变量
var num:int = x1*y1;		// 总数变量
var maze:Array = new Array;	// 迷宫数组
var pass:Array = new Array;	// 路径数组
// 方向数组
var dir:Array = new Array([1,0],[0,1],[-1,0],[0,-1]);
addChild(sp);	// 添加到舞台
// 设置样式
sp.graphics.lineStyle(2,0x000000);
sp.graphics.moveTo(x0,y0);
// 绘制闭合迷宫
for (i = 0; i < x1; i++) {
	for (j = 0; j < y1; j++) {
		sp.graphics.drawRect(i*d,j*d,d,d);
	}
}
// 初始化迷宫数组
for (i = 0; i < x1; i++) {
	var rmaze:Array = new Array;
	for (j = 0; j < y1; j++) {
		rmaze.push(0);
	}
	maze.push(rmaze);
}
maze[x0][y0] = -1;	// 标记初始位置
trace(dir);
sp.graphics.lineStyle(2,0xfffffb);
// 判断位置是否合法
function check(px:int,py:int):Boolean {
	return px >= 0 && py >= 0 && px < x1 && py < y1 &&
		maze[px][py] == 0;
}
// 判断位置是否非死角
function alive(px:int,py:int):Boolean {
	return check(px+dir[0][0],py+dir[0][1]) || 
		check(px+dir[1][0],py+dir[1][1]) || 
		check(px+dir[2][0],py+dir[2][1]) || 
		check(px+dir[3][0],py+dir[3][1]);
}
// 按帧监听时间响应
stage.addEventListener(Event.ENTER_FRAME,Draw);
function Draw(e:Event):void
{
	if (t0 < num) {
		// 确保非死角
		if (!alive(x0,y0)) {
			for (i = 0; i < pass.length; i++) {
				for (k = 0; k < 4; k++) {
					if (alive(pass[i][0]+dir[k][0],pass[i][1]+dir[k][1])) {
						x0=pass[i][0]+dir[k][0];
						y0=pass[i][1]+dir[k][1];
						break;
					}
				}
				if (alive(x0,y0)) break;
			}
		}
		k = int(4*Math.random())+1;
		// 确保可以破墙
		while (!check(x0+dir[k-1][0],y0+dir[k-1][1]))
			k = int(4*Math.random())+1;
		switch (k) {	// 涂掉墙壁
			case 1:
				sp.graphics.moveTo(x0*d+d,y0*d+s);
				sp.graphics.lineTo(x0*d+d,y0*d+d-s);
				break;
			case 2:
				sp.graphics.moveTo(x0*d+s,y0*d+d);
				sp.graphics.lineTo(x0*d+d-s,y0*d+d);
				break;
			case 3:
				sp.graphics.moveTo(x0*d,y0*d+s);
				sp.graphics.lineTo(x0*d,y0*d+d-s);
				break;
			case 4:
				sp.graphics.moveTo(x0*d+s,y0*d);
				sp.graphics.lineTo(x0*d+d-s,y0*d);
				break;
		}
		x0 += dir[k-1][0];
		y0 += dir[k-1][1];
		// 移动小球
		wa.x = x0*d;
		wa.y = y0*d;
		maze[x0][y0] = k;			// 标记迷宫
		var p = new Array(x0,y0);
		pass.push(p);				// 记录路径
		trace(p);
		trace(t0);
	}
	t0++;
}

参考: 迷宫生成随机拆墙算法-MATLAB实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值