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 相关文章推荐
Prototype 学习 工具函数学习($方法)
Jul 12 Javascript
最短的IE判断var ie=!-[1,]分析
May 28 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
Mar 24 Javascript
七夕情人节丘比特射箭小游戏
Aug 20 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
Backbone View 之间通信的三种方式
Aug 09 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
Sep 17 Javascript
BOM之navigator对象和用户代理检测
Feb 10 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
Jul 24 Javascript
详解vue-cli@2.x项目迁移日志
Jun 06 Javascript
vue+高德地图实现地图搜索及点击定位操作
Sep 09 Javascript
JS前端轻量fabric.js系列之画布初始化
Aug 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初学者头痛的十四个问题
2006/07/12 PHP
php mysql索引问题
2008/06/07 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
在Django同1个页面中的多表单处理详解
2017/01/25 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
python实现小球弹跳效果
2019/05/10 Python
Python 切分数组实例解析
2019/11/07 Python
python time.strptime格式化实例详解
2021/02/03 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
银行员工职业规划范文
2014/01/21 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
领导调研接待方案
2014/02/27 职场文书
党员承诺书内容
2014/03/26 职场文书
党员公开承诺书内容
2014/05/20 职场文书
任命书范本大全
2014/06/06 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
爱国电影观后感
2015/06/19 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书