Javascript編寫俄羅斯方塊思路及實例
俄羅斯方塊這個游戲也做了移動端的兼容, 這個游戲難點是怎么翻轉(zhuǎn)方塊, 自己實現(xiàn)的方式是把方塊放到一個二維數(shù)組, 然后逆時針旋轉(zhuǎn)二維數(shù)組。
也有別的方法,比如直接用一個全局變量代表一個方向, 翻轉(zhuǎn)的時候根據(jù)這個變量轉(zhuǎn)動方塊, 但是代碼要寫更多。
在文庫搜索到了一篇關(guān)于算法的文章, ....看著好心塞:
游戲截圖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(); });
游戲主要有三個模型層: 游戲方塊的模型層, 游戲分?jǐn)?shù)的模型層, 游戲整體界面結(jié)構(gòu)模型層;
控制層就一個, 就是用戶點擊游戲開始的按鈕, 游戲就開始了, 如果是PC,就會監(jiān)聽keydown事件, 如果是移動端, 就新建四個方向鍵的DOM, 監(jiān)聽方向鍵的點擊事件,事件會使當(dāng)前方塊的數(shù)據(jù)模型發(fā)生旋轉(zhuǎn), 至于顯示,那是view層的事情,先不用管, 主要的邏輯包括方塊的隨機(jī)生成, 方塊的碰撞檢測,方塊的消除,分?jǐn)?shù)的增加, 重新隨機(jī)生成方塊等:
運行下面代碼
define(["app/util"],function(util) { //分?jǐn)?shù)模塊,游戲開始的時候會用到; 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ā)生改變的時候,我們用回調(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)被卡主不能動的情況下; block.onend(function() { //這個說明當(dāng)前的block觸底了 data.set( mapData ); //我們需要重新生成一個方塊, 直接調(diào)用newBlock即可; block.newBlock(); //通過data計算,如果有連接起來的一條線,就執(zhí)行SCORE回調(diào), 隨之會更新當(dāng)前界面的分值; //如果方塊跑到了最上面就是游戲失敗了; 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:打開
相關(guān)文章
IE8的JavaScript點擊事件(onclick)不兼容的解決方法
這篇文章主要介紹了IE8的JavaScript點擊事件(onclick)不兼容的解決方法,大家參考使用吧2013-11-11js實現(xiàn)前面自動補(bǔ)全位數(shù)的方法
今天小編就為大家分享一篇js實現(xiàn)前面自動補(bǔ)全位數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10typeScript?核心基礎(chǔ)之接口interface
本篇文章主要介紹?typeScript?中接口是啥?如何定義的?接口是如何進(jìn)行擴(kuò)展的以及類如何實現(xiàn)接口,接下來和小編一起進(jìn)入下面文章一起學(xué)習(xí)?typeScript?接口2022-02-02