• Javascript写俄罗斯方块游戏


      俄罗斯方块这个游戏也做了移动端的兼容, 这个游戏难点是怎么翻转方块, 自己实现的方式是把方块放到一个二维数组, 然后逆时针旋转二维数组。

      也有别的方法,比如直接用一个全局变量代表一个方向, 翻转的时候根据这个变量转动方块, 但是代码要写更多。

      在文库搜索到了一篇关于算法的文章, ....看着好心塞:

      游戏在线查看:打开

      游戏截图PC端:

      游戏截图移动端:

      模板引擎用了HandlebarsJS,  为了更好的模块化,也用了requireJS....没用好;

    var cfg = {
        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();
    });
    View Code

      游戏主要有三个模型层: 游戏方块的模型层, 游戏分数的模型层, 游戏整体界面结构模型层;

      控制层就一个, 就是用户点击游戏开始的按钮, 游戏就开始了, 如果是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();
        };
    });
    View Code

      

      游戏的主要窗口直接看成是二维数组, 所有要显示的方块都是数组中的数据, 通过模板引擎, 一秒钟更新一次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>
    View Code

      为了让整体的内容和提示更加美观,用了提示插件 zepto.alert和bootStrap

      在线DEMO:打开

      这周参加了HTML5游戏峰会, 他们写的游戏实在太牛逼, 你们是中国游戏界的希望啊;

      

  • 相关阅读:
    BZOJ_1095_[ZJOI2007]Hide 捉迷藏_动态点分治+堆
    BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性
    BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset
    BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
    BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序
    BZOJ_1671_[Usaco2005 Dec]Knights of Ni 骑士_BFS
    BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP
    自动驾驶课程学习
    java:String使用equals和==比较的区别
    为什么java的main方法必须是静态的
  • 原文地址:https://www.cnblogs.com/diligenceday/p/4622710.html
Copyright © 2020-2023  润新知