Javascript编写俄罗斯方块思路及实例


Posted in Javascript onJuly 07, 2015

俄罗斯方块这个游戏也做了移动端的兼容, 这个游戏难点是怎么翻转方块, 自己实现的方式是把方块放到一个二维数组, 然后逆时针旋转二维数组。

也有别的方法,比如直接用一个全局变量代表一个方向, 翻转的时候根据这个变量转动方块, 但是代码要写更多。

在文库搜索到了一篇关于算法的文章, ....看着好心塞:

Javascript编写俄罗斯方块思路及实例

游戏截图PC端:

Javascript编写俄罗斯方块思路及实例

游戏截图移动端:

Javascript编写俄罗斯方块思路及实例

模板引擎用了HandlebarsJS,  为了更好的模块化,也用了requireJS....没用好;

运行下面代码

var cfg = {
  width:14,
  height:20,
  time : 400
};
requirejs.config({
  baseUrl: 'libs',
  paths: {
    app: '../app'
  }
});

requirejs(["app/controller/mainController","app/view/mobileDOM","app/util"], function(con, mobileDOM, util) {

  if(util.isMobile()) {
    mobileDOM.addDOM();
  };
  con();
});

游戏主要有三个模型层: 游戏方块的模型层, 游戏分数的模型层, 游戏整体界面结构模型层;

控制层就一个, 就是用户点击游戏开始的按钮, 游戏就开始了, 如果是PC,就会监听keydown事件, 如果是移动端, 就新建四个方向键的DOM, 监听方向键的点击事件,事件会使当前方块的数据模型发生旋转, 至于显示,那是view层的事情,先不用管, 主要的逻辑包括方块的随机生成, 方块的碰撞检测,方块的消除,分数的增加, 重新随机生成方块等:

运行下面代码

define(["app/util"],function(util) {
  //分数模块,游戏开始的时候会用到;
  var score = {};
  require(["app/model/score"],function(defineScore) {
    score = defineScore;
  });

  var startGame = function() {
    //把当前的input元素禁用;
    $(this).attr("disabled","true");
    requirejs(["app/model/data","app/view/init","app/model/Block"], function(data, view, Block){
      //初始化方块;
      var block = new Block;
      var mapData = {};

      //方块发生改变的时候,我们用回调重新渲染界面;
      block.onupdate( function() {
        var blockData = this.get();
        //把数据格式转化成map数据;
        mapData = data.extend(blockData);
        $("#table").html( view( mapData ) );
      });

      block.testTouch = data.testTouch;

      //如果元素触底了或者是元素已经被卡主不能动的情况下;
      block.onend(function() {
        //这个说明当前的block触底了
        data.set( mapData );
        //我们需要重新生成一个方块, 直接调用newBlock即可;
        block.newBlock();
        //通过data计算,如果有连接起来的一条线,就执行SCORE回调, 随之会更新当前界面的分值;
        //如果方块跑到了最上面就是游戏失败了;
        data.oncalculate( score.addScore , block.destory.bind(block));
      });

      //现在才开始绑定事件
      if(!util.isMobile()) {
        $(window).keydown(function(ev) {
          if(ev.keyCode === 37) {
            block.add(block.moveLeft,"left");
          }else if( ev.keyCode === 39 ) {
            block.add(block.moveRight,"right");
          }else if( ev.keyCode === 40 ) {
            block.add(block.moveDown,"down");
          }else if( ev.keyCode === 38 ) {
            block.rotate();
          };
        });
      }else{
        $(".arrow-up").tap(function() {
          block.rotate();
        });
        $(".arrow-down").tap(function() {
          block.add(block.moveDown,"down");
        });
        $(".arrow-left").tap(function() {
          block.add(block.moveLeft,"left");
        });
        $(".arrow-right").tap(function() {
          block.add(block.moveRight,"right");
        });
      };
    });
  };

  //绑定界面事件 ,keyDown;
  var bindEvent = function() {
    //start....
    $("#start").click(startGame)
  };
  //为移动端添加DOM节点,
  //然后绑定移动端的事件;

  return function() {
    bindEvent();
  };
});

游戏的主要窗口直接看成是二维数组, 所有要显示的方块都是数组中的数据, 通过模板引擎, 一秒钟更新一次data到view, 模板如下:

运行下面代码

<script type="text/x-handlebars-template" id="tpl-td">
    {{#each this}}
      <tr>
        {{#each this}}
          <td class="{{#if this}}block{{/if}}">
          </td>
        {{/each}}
      </tr>
    {{/each}}
  </script>

为了让整体的内容和提示更加美观,用了提示插件 zepto.alert和bootStrap;

在线DEMO:打开

Javascript 相关文章推荐
简单的前端js+ajax 购物车框架(入门篇)
Oct 29 Javascript
禁用Enter键表单自动提交实现代码
May 22 Javascript
js实现简单选项卡与自动切换效果的方法
Apr 10 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
Aug 26 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
Jun 12 Javascript
DIV+CSS+jQ实现省市联动可扩展
Jun 22 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
JavaScript中的遍历详解(多种遍历)
Apr 07 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
Vue实现回到顶部和底部动画效果
Jul 31 Javascript
js实现适配移动端的拖动效果
Jan 13 Javascript
Node.js API详解之 V8模块用法实例分析
Jun 05 Javascript
javascript实现控制div颜色
Jul 07 #Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 #Javascript
JavaScript中判断两个字符串是否相等的方法
Jul 07 #Javascript
javascript中数组方法汇总
Jul 07 #Javascript
jQuery原型属性和原型方法详解
Jul 07 #Javascript
在JavaScript中访问字符串的子串
Jul 07 #Javascript
jQuery.each使用详解
Jul 07 #Javascript
You might like
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
帝国cms常用标签汇总
2015/07/06 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
python修改注册表终止360进程实例
2014/10/13 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
详解python中asyncio模块
2018/03/03 Python
详解python单元测试框架unittest
2018/07/02 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
django 微信网页授权登陆的实现
2019/07/30 Python
Python 合并拼接字符串的方法
2020/07/28 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
公司保密承诺书
2014/03/27 职场文书
任命书怎么写
2014/06/04 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
捐书倡议书
2014/08/29 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
员工试用期工作总结
2019/06/20 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Nginx源码编译安装过程记录
2021/11/17 Servers