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 相关文章推荐
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
Aug 15 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
AngularJS表格详解及示例代码
Aug 17 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
在Vue中使用echarts的实例代码(3种图)
Jul 10 Javascript
如何理解Vue的.sync修饰符的使用
Aug 17 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
Vue2 模板template的四种写法总结
Feb 23 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 Javascript
jQuery实现放大镜案例
Oct 19 jQuery
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数据库调用类调用实例(详细注释)
2012/07/12 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
户外婚礼策划方案
2014/02/08 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
务工证明怎么写
2015/06/18 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android