欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript編寫(xiě)俄羅斯方塊思路及實(shí)例

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

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

  也有別的方法,比如直接用一個(gè)全局變量代表一個(gè)方向, 翻轉(zhuǎn)的時(shí)候根據(jù)這個(gè)變量轉(zhuǎn)動(dòng)方塊, 但是代碼要寫(xiě)更多。

  在文庫(kù)搜索到了一篇關(guān)于算法的文章, ....看著好心塞:

  游戲截圖PC端:

  游戲截圖移動(dòng)端:

  模板引擎用了HandlebarsJS,  為了更好的模塊化,也用了requireJS....沒(méi)用好;

運(yùn)行下面代碼

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();
});

  游戲主要有三個(gè)模型層: 游戲方塊的模型層, 游戲分?jǐn)?shù)的模型層, 游戲整體界面結(jié)構(gòu)模型層;

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

運(yùn)行下面代碼

define(["app/util"],function(util) {
  //分?jǐn)?shù)模塊,游戲開(kāi)始的時(shí)候會(huì)用到;
  var score = {};
  require(["app/model/score"],function(defineScore) {
    score = defineScore;
  });

  var startGame = function() {
    //把當(dāng)前的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ā)生改變的時(shí)候,我們用回調(diào)重新渲染界面;
      block.onupdate( function() {
        var blockData = this.get();
        //把數(shù)據(jù)格式轉(zhuǎn)化成map數(shù)據(jù);
        mapData = data.extend(blockData);
        $("#table").html( view( mapData ) );
      });

      block.testTouch = data.testTouch;

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

      //現(xiàn)在才開(kāi)始綁定事件
      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)
  };
  //為移動(dòng)端添加DOM節(jié)點(diǎn),
  //然后綁定移動(dòng)端的事件;

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

  游戲的主要窗口直接看成是二維數(shù)組, 所有要顯示的方塊都是數(shù)組中的數(shù)據(jù), 通過(guò)模板引擎, 一秒鐘更新一次data到view, 模板如下:

運(yùn)行下面代碼

  <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;

  在線(xiàn)DEMO:打開(kāi)

相關(guān)文章

  • JavaScript prototype對(duì)象的屬性說(shuō)明

    JavaScript prototype對(duì)象的屬性說(shuō)明

    JavaScript中對(duì)象的prototype屬性,是用來(lái)返回對(duì)象類(lèi)型原型的引用的。我們使用prototype屬性提供對(duì)象的類(lèi)的一組基本功能。并且對(duì)象的新實(shí)例會(huì)”繼承”賦予該對(duì)象原型的操作。但是這個(gè)prototype到底是怎么實(shí)現(xiàn)和被管理的呢?
    2010-03-03
  • IE8的JavaScript點(diǎn)擊事件(onclick)不兼容的解決方法

    IE8的JavaScript點(diǎn)擊事件(onclick)不兼容的解決方法

    這篇文章主要介紹了IE8的JavaScript點(diǎn)擊事件(onclick)不兼容的解決方法,大家參考使用吧
    2013-11-11
  • js實(shí)現(xiàn)前面自動(dòng)補(bǔ)全位數(shù)的方法

    js實(shí)現(xiàn)前面自動(dòng)補(bǔ)全位數(shù)的方法

    今天小編就為大家分享一篇js實(shí)現(xiàn)前面自動(dòng)補(bǔ)全位數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Vue3中使用typescript封裝axios的實(shí)例詳解

    Vue3中使用typescript封裝axios的實(shí)例詳解

    這篇文章主要介紹了使用typescript封裝axios的實(shí)例代碼,為了方便,在vue3的配置里面按需加載element-plus,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • js實(shí)現(xiàn)下載(文件流式)方法詳解與完整實(shí)例源碼

    js實(shí)現(xiàn)下載(文件流式)方法詳解與完整實(shí)例源碼

    這篇文章主要介紹了js實(shí)現(xiàn)下載(文件流式)的方法,需要的朋友可以參考下
    2022-12-12
  • 一步一步教你寫(xiě)淡入淡出帶注釋的圖片輪播插件(一)

    一步一步教你寫(xiě)淡入淡出帶注釋的圖片輪播插件(一)

    抽空寫(xiě)了個(gè)類(lèi)似的效果,做了一定程度的封裝,雖然也只能勉強(qiáng)算個(gè)輕量級(jí)原生小插件吧,但還是分享出來(lái),并做一步一步的教程,希望能給有需要的朋友一些幫助吧。
    2010-10-10
  • typeScript?核心基礎(chǔ)之接口interface

    typeScript?核心基礎(chǔ)之接口interface

    本篇文章主要介紹?typeScript?中接口是啥?如何定義的?接口是如何進(jìn)行擴(kuò)展的以及類(lèi)如何實(shí)現(xiàn)接口,接下來(lái)和小編一起進(jìn)入下面文章一起學(xué)習(xí)?typeScript?接口
    2022-02-02
  • 微信小程序 彈窗自定義實(shí)例代碼

    微信小程序 彈窗自定義實(shí)例代碼

    這篇文章主要介紹了微信小程序 彈窗自定義實(shí)例代碼的相關(guān)資料,有時(shí)候做開(kāi)發(fā)項(xiàng)目的時(shí)候需要根據(jù)客戶(hù)需求更改原系統(tǒng)的組件,這里就對(duì)小程序中彈窗進(jìn)行更改,需要的朋友可以參考下
    2017-03-03
  • 原生JavaScript實(shí)現(xiàn)輪播圖效果

    原生JavaScript實(shí)現(xiàn)輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaScript中自定義事件用法分析

    JavaScript中自定義事件用法分析

    這篇文章主要介紹了JavaScript中自定義事件用法,較為詳細(xì)的分析了自定義事件的原理與具體用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12

最新評(píng)論