最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript編寫俄羅斯方塊思路及實例

 更新時間:2015年07月07日 10:41:38   投稿:hebedich  
本文主要給大家介紹的是使用javascript編寫俄羅斯方塊小游戲的思路和具體的實例代碼,有需要的小伙伴可以參考下

  俄羅斯方塊這個游戲也做了移動端的兼容, 這個游戲難點是怎么翻轉方塊, 自己實現(xiàn)的方式是把方塊放到一個二維數(shù)組, 然后逆時針旋轉二維數(shù)組。

  也有別的方法,比如直接用一個全局變量代表一個方向, 翻轉的時候根據(jù)這個變量轉動方塊, 但是代碼要寫更多。

  在文庫搜索到了一篇關于算法的文章, ....看著好心塞:

  游戲截圖PC端:

  游戲截圖移動端:

  模板引擎用了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();
});

  游戲主要有三個模型層: 游戲方塊的模型層, 游戲分數(shù)的模型層, 游戲整體界面結構模型層;

  控制層就一個, 就是用戶點擊游戲開始的按鈕, 游戲就開始了, 如果是PC,就會監(jiān)聽keydown事件, 如果是移動端, 就新建四個方向鍵的DOM, 監(jiān)聽方向鍵的點擊事件,事件會使當前方塊的數(shù)據(jù)模型發(fā)生旋轉, 至于顯示,那是view層的事情,先不用管, 主要的邏輯包括方塊的隨機生成, 方塊的碰撞檢測,方塊的消除,分數(shù)的增加, 重新隨機生成方塊等:

運行下面代碼

define(["app/util"],function(util) {
  //分數(shù)模塊,游戲開始的時候會用到;
  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 = {};

      //方塊發(fā)生改變的時候,我們用回調(diào)重新渲染界面;
      block.onupdate( function() {
        var blockData = this.get();
        //把數(shù)據(jù)格式轉化成map數(shù)據(jù);
        mapData = data.extend(blockData);
        $("#table").html( view( mapData ) );
      });

      block.testTouch = data.testTouch;

      //如果元素觸底了或者是元素已經(jīng)被卡主不能動的情況下;
      block.onend(function() {
        //這個說明當前的block觸底了
        data.set( mapData );
        //我們需要重新生成一個方塊, 直接調(diào)用newBlock即可;
        block.newBlock();
        //通過data計算,如果有連接起來的一條線,就執(zhí)行SCORE回調(diào), 隨之會更新當前界面的分值;
        //如果方塊跑到了最上面就是游戲失敗了;
        data.oncalculate( score.addScore , block.destory.bind(block));
      });

      //現(xiàn)在才開始綁定事件
      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節(jié)點,
  //然后綁定移動端的事件;

  return function() {
    bindEvent();
  };
});

  游戲的主要窗口直接看成是二維數(shù)組, 所有要顯示的方塊都是數(shù)組中的數(shù)據(jù), 通過模板引擎, 一秒鐘更新一次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>

  為了讓整體的內(nèi)容和提示更加美觀,用了提示插件 zepto.alert和bootStrap;

  在線DEMO:打開

相關文章

最新評論

洪湖市| 东莞市| 松溪县| 钟山县| 阿拉善盟| 读书| 巴东县| 林周县| 镇宁| 奈曼旗| 五河县| 四平市| 尉氏县| 陈巴尔虎旗| 金沙县| 仙游县| 怀宁县| 牙克石市| 永年县| 阳西县| 鸡东县| 北安市| 皋兰县| 云阳县| 黑水县| 西平县| 孙吴县| 龙山县| 探索| 铅山县| 甘南县| 玛纳斯县| 安西县| 合江县| 五原县| 明溪县| 凯里市| 城步| 南乐县| 云龙县| 明光市|