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常见表单应用技巧
Jan 09 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
Mar 24 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
Javascript中实现String.startsWith和endsWith方法
Jun 10 Javascript
js实现将选中值累加到文本框的方法
Aug 12 Javascript
jQuery实现可拖拽3D万花筒旋转特效
Jan 03 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
vue中如何创建多个ueditor实例教程
Nov 14 Javascript
vue.js实现只弹一次弹框
Jan 29 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
Jun 24 Javascript
js设计模式之代理模式及订阅发布模式实例详解
Aug 15 Javascript
微信小程序 checkbox使用实例解析
Sep 09 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数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
php文件上传简单实现方法
2015/01/24 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
JS实现多功能计算器
2020/10/28 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
Python列表生成器的循环技巧分享
2015/03/06 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python  Django 母版和继承解析
2019/08/09 Python
Python Process多进程实现过程
2019/10/22 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
在线课程:Skillshare
2019/04/02 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
了解AppleTalk协议吗
2014/04/01 面试题
实习自我鉴定
2013/12/15 职场文书
卖车协议书范例
2014/09/16 职场文书
工商局个人工作总结
2015/03/03 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书