• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
素年已逝
博客园    首页    新随笔    联系   管理    订阅  订阅
【JavaScriptGame】迷宫(其二)

上篇说道,挖坑er已经成功打通迷宫。但自己亲力亲为未免有些太浪费时间,趁着愚人节来临之际,挖坑er还想量产更多迷宫,所以他必须提供制作方案,然后雇人完成打通迷宫的事情。

——————————————————分割线——————————————————

解决方案中,首先应该有整个迷宫的长度、宽度、格子大小(可选);

然后按房间顺序搭建迷宫,并给这些房间编上号;

至于雇来的人应该打通哪些墙壁,就根据房间的编号,计算出4面墙壁分别是否需要打通,并做相应的记录。

那么——

1 function Grid(left, top, right, bottom) {
2 this.left = left;
3 this.top = top;
4 this.right = right;
5 this.bottom = bottom;
6 }

left、top、right、bottom分别记录四面墙是否打通,打通为true,不打通为false?

用1代表true,0代表false如何?

4个变量都是0和1,组合在一起如何?

如图,我们根据left、top、right、bottom的顺序,将要打通的墙壁写为1,不打通的墙壁写为0,组合成一个二进制数,最终转换为十进制作为此格子的状态保存。

以上就是格子的16种可能性,仅用 0~15 这16个数就能表示出来了。

而且利用按位运算符,我们可以很方便的操作这些格子的状态。

要计算某一格子,例如上面的12,要判断左方向可以通过,只需要用按位与判断 12 & 8 是否大于 0 就行了:

12 & 8 = 8,即得左方向可以通过。

12 & 2 = 0,即得右方向不可通过。

要设置这个格子的某个方向可以通过,进行按位或运算即可:

12 | 8 = 12,因为之前左方向已经能够通过,所以格子状态未发生改变。

12 | 2 = 14,因为之前右方向不能通过,所以格子状态改变从1100改变为1110,即14。

但是通常情况下使用按位异或,将某方向能否通过设置成相反值更为灵活:

12 ^ 8 = 4,则得到左方向不能通过的状态。

12 ^ 2 = 14,得到了右方向可以通过的状态。

之后,挖坑er只要预先计算每个格子的状态,再将制作方案交给施工队,就可以按照顺序搭建迷宫了,对于管理性来说无疑是提升了一个大的层次。

不过问题又出来了,既然现在的顺序是先搭建迷宫格子,再打通墙壁,多余的墙壁为什么不能直接不搭建,而省去拆墙、运送废料之苦呢?

这关系到DOM的reflow问题,我们下篇再说。

DEMO下载
posted on 2011-03-31 12:37  素年已逝  阅读(260)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3