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 数值型和字符串型之间的转换
Jul 25 Javascript
js实现连个数字相加而不是拼接的方法
Feb 23 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
分享两款带遮罩的jQuery弹出框
Dec 30 Javascript
老生常谈JavaScript 函数表达式
Sep 01 Javascript
JS实现双击内容变为可编辑状态
Mar 03 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
vue.js父组件使用外部对象的方法示例
Apr 25 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
使用Angular CLI生成路由的方法
Mar 24 Javascript
jQuery的Ajax接收java返回数据方法
Aug 11 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提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
YII框架http缓存操作示例
2019/04/29 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
vue2路由基本用法实例分析
2020/03/06 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
Pytorch 多维数组运算过程的索引处理方式
2019/12/27 Python
Python执行时间的几种计算方法
2020/07/31 Python
python 带时区的日期格式化操作
2020/10/23 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
庆祝教师节演讲稿
2014/09/03 职场文书
师德承诺书2015
2015/04/28 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis