js推箱子小游戏步骤代码解析

 更新时间:2018年01月10日 08:45:52   投稿:laozhang  
本篇文章通过代码分析给大家讲解了JS制作推箱子小游戏的步骤以及要点,需要的朋友参考学习下吧。

推箱子小游戏大家肯定都玩过,之所以写这篇文章,是觉得这个小游戏足够简单好理解

demo:

步骤解析:

本文代码已经放在了github上面了,里面也进行了很详细的代码注释,可以copy下来,在本地运行一下看看。

1. 渲染地图

html结构:

html结构十分简单,只要弄一堆div,来放置地图的class就可以了,我这里初始化了12*9个div,地图里最多九行高度。
这些div都是同样大小,地图渲染出来区别的只是颜色的不同。

地图函数:

 var box=$('.box div'); //地图使用的div集合
 function create(){ //创建地图函数
 box.each(function(index){ //index的数量是固定的,是box div下面div的数量
  // 每次创建地图初始化div
  box.eq(index).removeClass();
 });
 box.each(function(index,element){ //循环整个div的数量 二维数组里数量不够的 默认为空白
 //level为关卡数 根据关卡渲染地图 builder为二维数组,为地图关卡
  if(builder[level][index]){ //过滤0
   box.eq(index).addClass('type'+builder[level][index]);
  }
 });
 box.eq(origin[level]).addClass("pusher"); //推箱人 皮卡丘位置
 }
 //第一关的地图长这样(下面只是栗子,不是代码),0代表不可抵达区域,1代表目标(要被推到的地方),
 //2代表普通路径(可以走的),3代表墙,4代表箱子
 [0,0,0,0,3,3,3,0,0,0,0,0,
 0,0,0,0,3,1,3,0,0,0,0,0,
 0,0,0,0,3,2,3,3,3,3,0,0,
 0,0,3,3,3,4,2,4,1,3,0,0,
 0,0,3,1,2,4,2,3,3,3,0,0,
 0,0,3,3,3,3,4,3,0,0,0,0,
 0,0,0,0,0,3,1,3,0,0,0,0,
 0,0,0,0,0,3,3,3,0,0,0,0] 

2. 捕获键盘事件,判断是否可以移动
使用$(document).keydown()jqery事件,捕获键盘事件。

捕获键盘事件,上下左右以及wsad。

 $(document).keydown(function (e) {
 var key=e.which;
 switch(key){
 //col 的值为12,上下移动要12个div为一个周期
 //方向键上或者w
 case 87:
 case 38:
  move(-col);//判断移动函数
 break;
 //方向键下或者s
 case 83:
 case 40:
  move(col);
 break;
 //方向键左或者a
 case 65:
 case 37:
  move(-1);
 break;
 //方向键右或者d
 case 68:
 case 39:
  move(1);
 break;
 }
 setTimeout(win,500); //按键之后调判断是否过关
 });

判断是否可以移动。
分为两个判断条件:一个是推箱子,一个是不推箱子 自然移动,否则不移动皮卡丘。

 function move(step){ //是否移动判断
   // 分为两个判断条件一个是推箱子,一个是不推箱子 自然移动。 否则不移动皮卡丘
   //step 上下是12个div一个周期,左右是1个div positin是皮卡丘的原来位置
  var pikaqiu1=box.eq(position);//皮卡丘现在的地方
  var pikaqiu2=box.eq(position+step);//皮卡丘要去的下一个地方
  var pushBox=box.eq(position+step*2);//箱子要去的下一个地方
  if(!pikaqiu2.hasClass('type4')&&( pikaqiu2.hasClass('type1')||pikaqiu2.hasClass('type2'))){ //自然移动
   //判断:如果下一个div的class不包含type4(箱子),并且 下一个div含有type1(目标位置),或者type2(普通路径)
   //这一步和下一步判断是否有type4的原因是普通路径会变成有type4的路径,这时候就会出现问题
   pikaqiu1.removeClass("pusher"); //移除当前皮卡丘
   pikaqiu2.addClass("pusher");//移动皮卡丘到下一个位置
   position=position+step;//增加position值
  }
  else if((pikaqiu2.hasClass('type4'))&&(!pushBox.hasClass('type4'))&&(pushBox.hasClass('type1')|| pushBox.hasClass('type2')) ) {
   //推箱子 
   //如果下一个div的class包含type4(箱子)并且 不包含重叠type4(箱子) 并且 包含class type1(目标位置)或者 包含type2(空路)
   pikaqiu2.removeClass('type4');//移除当前箱子
   pikaqiu1.removeClass("pusher");//移除当前皮卡丘
   pushBox.addClass('type4');//移动箱子到下一个位置
   pikaqiu2.addClass("pusher").addClass("type2");//
   //本来是type4 移除之后,这里没有class了,要变成普通路径
   position=position+step;//增加position值 
  }
 } 

3.胜利判断:
每次移动都要调用这个胜利判断。

function win(){ //胜利条件判断
 if($(".type1.type4").length===goal){ //推的箱子与关卡设置通过箱子的数量对比
  if(level<9) {
   alert("666,挑战下一关吧--OBKoro1");
   level++; //关卡+1
   goal = goalList[level];
   position = origin[level];
   create();
  }else {
   alert("厉害啊 大佬 通关了都");
  }
 }
}

代码地址

demo地址

相关文章

  • javascript打开新窗口同时关闭旧窗口

    javascript打开新窗口同时关闭旧窗口

    因业务需要,在网上查找这个问题的解决办法,但是昏天黑地地搞了半天,找到的方法虽然可以实现功能,但是总是会跳出讨厌的“关闭窗口”的提示框,郁闷。
    2009-01-01
  • HTML+CSS+JS实现抓娃娃机游戏

    HTML+CSS+JS实现抓娃娃机游戏

    这篇文章主要介绍了如何利用HTML+CSS+JS制作抓娃娃机游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Vuex模块化应用实践示例

    Vuex模块化应用实践示例

    这篇文章主要介绍了Vuex模块化应用实践示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • openlayers 3实现车辆轨迹回放

    openlayers 3实现车辆轨迹回放

    这篇文章主要为大家详细介绍了openlayers 3实现车辆轨迹回放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 监控 url fragment变化的js代码

    监控 url fragment变化的js代码

    url 里面的 #后面的部分 可以实现无刷新的改变url 的值。这个特点非常有用。比如视频网站土豆中的豆单,你进入视频列表以后,点击播放某个视频。
    2010-04-04
  • js实现精确到秒的倒计时效果

    js实现精确到秒的倒计时效果

    这篇文章主要为大家详细介绍了js实现精确到秒的倒计时效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 为什么TypeScript的Enum会出现问题

    为什么TypeScript的Enum会出现问题

    TypeScript引入了很多静态编译语言的特性,今天有一个类型需要着重讨论下,这就是enum,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 微信小程序实现底部弹出框封装

    微信小程序实现底部弹出框封装

    这篇文章主要为大家详细介绍了微信小程序底部弹出框封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Firefox下提示illegal character并出现乱码的原因

    Firefox下提示illegal character并出现乱码的原因

    Firefox下提示illegal character并出现乱码的问题,时间是是因为编码的问题导致。
    2010-03-03
  • Js之如何移除Array/数组中指定元素

    Js之如何移除Array/数组中指定元素

    这篇文章主要介绍了Js之如何移除Array/数组中指定元素问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论