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 相关文章推荐
借用Google的Javascript API Loader来加速你的网站
Jan 28 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
Jun 23 Javascript
基于javascript实现页面加载loading效果
Sep 15 Javascript
jQuery插件passwordStrength密码强度指标详解
Jun 24 Javascript
JS简单随机数生成方法
Sep 05 Javascript
js实现手机发送验证码功能
Mar 13 Javascript
详解Vue 方法与事件处理器
Jun 20 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
Sep 07 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
Jan 08 Javascript
vue路由传参页面刷新参数丢失问题解决方案
Oct 08 Javascript
JavaScript执行机制详细介绍
Dec 06 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技术开发技巧分享
2010/03/23 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
thinkphp分页集成实例
2017/07/24 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
Django的信号机制详解
2017/05/05 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
微信跳一跳游戏python脚本
2020/04/01 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
党校学习个人总结
2015/02/15 职场文书
个人年终总结开头
2015/03/06 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA