博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript写俄罗斯方块游戏
阅读量:6161 次
发布时间:2019-06-21

本文共 3425 字,大约阅读时间需要 11 分钟。

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

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

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

  游戏在线查看:

  游戏截图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();});
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, 模板如下:

View Code

 

 

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

  在线DEMO:

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

  

转载地址:http://bvefa.baihongyu.com/

你可能感兴趣的文章
【论文阅读】Classification of breast cancer histology images using transfer learning
查看>>
移动端处理图片懒加载
查看>>
jQuery.on() 函数详解
查看>>
谈缓存和Redis
查看>>
【转】百度地图api,根据多点注标坐标范围计算地图缩放级别zoom自适应地图
查看>>
用户调研(补)
查看>>
ExtJS之开篇:我来了
查看>>
☆1018
查看>>
oracle 去掉空格
查看>>
6.13心得
查看>>
Runtime类
查看>>
eclipse decompiler
查看>>
记一个搜索网盘资源的网站
查看>>
jdk1.7和jdk1.8的String的getByte方法的差异
查看>>
java父子进程通信
查看>>
Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
查看>>
Olap学习笔记
查看>>
Codeforces Round #431 (Div. 1)
查看>>
如何进行数组去重
查看>>
将标题空格替换为 '_' , 并自动复制到剪切板上
查看>>