Snake5,操作div方块图形自动下落,若碰到容器底部则方块图形变成灰色

操作div方块图形自动下落,若碰到容器底部则方块图形变成灰色。

实现思路

初始位置x修改为3,这样从屏幕中间下落

  • 方块图形以每隔600毫秒下落20px的速度匀速下落。这个我们只要调用setInterval接口,不断地调用move(0,1)函数使得相对位置竖直方向上不断下移即可。

分析:一个方块图形下落到底部之后,相对位置应该恢复初始值,新的方块图形开始根据这个相对位置开始下落。
setInterval接口第一个参数为函数参数需要以字符串的形式,不然函数只会执行一次。
这个例子中没有停止setInterval事件,因为一旦停止那么相对位置就不会下移,就不会有自动下落。只有游戏结束的时候才需要停止setInterval事件。

intervalId= setInterval("move(0,1)",speed);  //正确
intervalId= setInterval(move(0,1),speed);  //错误
  • 修改[Up]为方块图形旋转,[Down]为方块图形瞬间下落。
    瞬间下落说白了使用setInterval函数调用move函数并且间隔设置为0毫秒,这样在极短的时间内就不断地多次下降20px然后相对位置坐标恢复初始值,看起来就像一下子完成的一样。(我们把move函数里面check函数注释掉,就可以看到方块图形超出容器继续下降。)

关键思路是,我们快速下落不要想着直接修改当前下落的速度,而是直接给相对位置再添加一个间歇性下落的方法调用,下面就是相关的分析。

注意,我们设置快速下落没有更改初始化函数里原来的匀速下落调用。而是针对相对位置(x,y)再套一个quickDown方法,这样相对位置(x,y)的下落是两个方法的速度之和。
如果不这么做,那我们要做很多琐事:
1,先把初始化函数的setInterval停止掉(因为我们无法直接修改它的间隔时间,只能停止该例并新建一个无限间歇性调用)
2,接着新建一个setInterval("move(0,1)",0);使方案图形极速下降
3,方块图形到达底部之后变成灰色,停止setInterval("move(0,1)",0)这例。
4,新的方块开始下落是以匀速下落的,所以还要创建一个setInterval("move(0,1)",speed)开始匀速下落。

  • 方块到达底部变成灰色
    就是添加一个fix获取所有var divs = document.getElementsByClassName("activityModel");(前面的方块className已经变成灰色,所以更好该方式获取的方块只是正在下落的方块)修改成灰色。
    到达底部就是把相对位置重新初始化。

  • 检查方块是否变成到达底部跟前面检查是否到达边界同理可知是要添加到move函数里面。
    如果没有越界就更新相对位置,并按照新的相对位置渲染方块图形
    如果越界了,判断水平越界还是底部越界;如果水平越界,那么不会更新图形,自然也不会创建新的图形;如果底部越界,那么把
    图形变成灰色并创建新的方块开始下落,并把极速下落那个间歇性调用停止掉。

这样就完成了,完整代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>Snake</title>
    <style type="text/css">
        .activityModel { margin: 1px; width: 19px; height: 19px;background: red;position: absolute; }
        /*.container { margin: 1px; top: 0px;left: 0px; width: 200px; height: 360px; background: black; position: absolute; }*/
        .stationaryModel { margin: 1px; width: 19px; height: 19px; background: gray; position: absolute; }
        .container { margin: 0px; top: 0px;left: 0px; width: 201px; height: 361px; background: black; position: absolute; }
    </style>
    <script type="text/javascript">
        var x = 3; 
        var y = 0;
        var size = 20;          
        var shape = [2,0,2,1,2,2,1,2];
        var rowCount=18;
        var colCount=10;
        var speed = 600;
        var intervalId;
        var intervalId2;
        
        function init(){    
            
            create();
            show();  //根据shape数组坐标排列组合创建的4个方块为方块图形

            //绑定键盘事件
            document.onkeydown = function(e){
                var e= e || window.event;
                switch(e.keyCode){
                    case 32: //space
                        quickDown();
                        break;
                    case 38: //rotate
                        rotate(0,-1);
                        break;
                    case 40: //down
                        move(0,1);
                        break;
                    case 37: //left
                        move(-1,0);
                        break;
                    case 39: //right
                        move(1,0);
                        break;      
                }
            }

            // 方块开始下降
            intervalId = setInterval("move(0,1)",speed);
        }
        
        // 创建4个方块
        var create = function(){
            for (var i=0;i<4;i++){
                var div = document.createElement("div");
                div.className = "activityModel";
                document.body.appendChild(div);
            }
        }

        //根据shape数组坐标排列组合创建的4个方块为方块图形
        var show = function(){
            var divs = document.getElementsByClassName("activityModel");
            for(var j=0,index=0,len=divs.length;j<len,index<8;j++){
                divs[j].style.left = (shape[index++]+x)*size +"px";
                divs[j].style.top = (shape[index++]+y)*size +"px";
            }
        }

        // 移动方块
        var move = function(a,b){
            //如果没有越界就更新相对位置,并按照新的相对位置渲染方块图形
            if(check(x+a,y+b,shape)){
                x += a;
                y += b;
                show();
            } else {
                if ( b == 0 ) return;
                fix();
                create();
                show();
                clearInterval(intervalId2);
            }
        }

        // 快速下落
        var quickDown = function() {
            intervalId2 = setInterval("move(0, 1)", 0);
        }

        // 旋转方块
        var rotate = function() {
            newShape = [shape[1], 3 - shape[0], shape[3], 3 - shape[2], shape[5], 3 - shape[4], shape[7], 3 - shape[6]];
            if(!check(x,y,newShape))  return;
            shape = newShape;
            show();
        }

        // 固定方块,变成灰色
        var fix = function(){
            var divs = document.getElementsByClassName("activityModel");
            for(var i = divs.length -1;i >= 0;i--){
                divs[i].className = "stationaryModel";
            }
            x = 3;
            y = 0;
        }

        var check = function(x,y,shape){
            var most_left = colCount;
            var most_right = 0;
            var most_top = rowCount;
            var most_bottom = 0;
            for(var i=0;i<8;i+=2){
                // 记录最左边水平坐标
                if(shape[i]<most_left){
                    most_left=shape[i];
                }
                // 记录最右边水平坐标
                if(shape[i]>most_right){
                    most_right=shape[i];
                }
                // 记录最上边垂直坐标
                if(shape[i+1]<most_top){
                    most_top=shape[i+1];
                }
                // 记录最下边垂直坐标
                if(shape[i+1]>most_bottom){
                    most_bottom=shape[i+1];
                }
            }

            if( (most_right+x+1) > colCount || (most_left+x)< 0 || (most_bottom+y+1)>rowCount || (most_top+y)<0 ){
                return false;
            }
            return true;
        }
    </script>
</head>
<body onload="init()">
    <div class="container"></div>
</body>
</html>

效果图如下:


image.png

提交代码到git仓库:git push https://github.com/xiaohuacc/snake index005

代码传送门:https://github.com/xiaohuacc/snake/blob/index005/index005.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容