一只努力学习的程序猿

一只努力学习的程序猿

前言


源码下载地址+演示地址


效果图GIf

 温习数据算法—贪吃蛇-LMLPHP


设计思路

第一步,构思编写出静态页面。

第二步,让贪吃蛇动起来。

第三步,通过键盘上下左右键去控制运动方向,空格键暂停。

第四步,判断贪吃蛇有没有撞墙,有没有吃到自己,有的话结束游戏,生成排名。

第五步,给贪吃蛇随机生成一个"食物"。

第六步,实现每当贪吃蛇吃了一个"食物"后身体就会变长,移动速度变快。

两个对象

如何移动

方向控制

碰撞检测

实现过程

搭建游戏画面:首先整个游戏需要一个搭建活动的场景,我们通过Div+css布局来作为整个游戏的背景。

方向和定位:游戏背景搭建完后,怎么来定义我们“蛇”的位置和移动的方向?首先定义一个全局的方向变量,对应的数值就是我们的上下左右方向键所代表的keyCode。

我们游戏幕布的时候通过两次遍历画出了一个坐标系,有X轴和Y轴。

如果每次都用{x:x,y:y}来表示会很麻烦,也显得很low,我们可以定义一个坐标点对象。

食物对象:既然定义好了坐标点对象,那么可以先来看一下简单的对象,就是我们的食物对象,它有一个重要的属性就是它的坐标点。

既然食物有了坐标点这个属性,那么我们什么时候给他赋值呢?我们知道食物是随机产生的,因此我们定义了一个Create函数用来产生Food的坐标点。

但是产生的坐标点又不能在蛇的身体上,所以通过一个while循环来产生坐标点,如果坐标点正确了,就终止循环。

//食物
        function foodRandom(){
            var t = 40;
            var x = 54;
            var y = 0;
            var repeat = false;
            var top = parseInt(Math.random() * (t - y) + y);
            var left = parseInt(Math.random() * (x - y) + y);

            //判断食物与蛇身坐标是否重合
            $('.snake_wrap li').each(function() {
                 if($(this).position().left == left && $(this).position().top == top){
                    foodRandom();
                }else{
                    repeat = true;
                }
            });

            //如果食物没在蛇身上,定位食物
            if(repeat){
                $('.food').css({'top':top*15 + 1 + 'px','left':left*15 + 1 + 'px'});
            }
        }

蛇对象:首先定义一下蛇基本的属性,最重要的肯定是蛇的属性,每次移动时,都需要对这个数组进行一些操作。

其次是蛇的方向,我们给它一个默认方向。然后是食物,在蛇的构造函数中我们传入食物对象,在后续移动时需要判断是否吃到食物。

//移动
        function run(){
            //计时器,每speed时刷新一次
            myVar.itimes = setInterval(function(){
                //获取当前食物位置
                var food_top = $('.food').position().top;
                var food_left = $('.food').position().left;
                //设置新增蛇头坐标
                var header_top = $('.snake_wrap li').eq(0).position().top + myVar.del_y;
                var header_left = $('.snake_wrap li').eq(0).position().left + myVar.del_x;
                //当前蛇头颜色重置
                $('.snake_wrap li').eq(0).css({'background': '#779006'});
                //新增蛇头,并赋予样式
                $('.snake_wrap').prepend('<li></li>');
                $('.snake_wrap li').eq(0).css({'left':header_left + 'px','top':header_top + 'px','background':'#fff'})
                //移除最后一节蛇尾
                $('.snake_wrap li:last').remove();

                //判断蛇是否吃到食物
                if((header_left == (food_left - 1)) && (header_top == (food_top - 1))){
                    var last_top = $('.snake_wrap li:last').position().top;
                    var last_left = $('.snake_wrap li:last').position().left;
                    $('.snake_wrap').append('<li></li>');
                    $('.snake_wrap li:last').eq(0).css({'left':last_left + 'px','top':last_top + 'px'})

                    //刷新食物
                    foodRandom();

                    //蛇身长度
                    myVar.myscore++;
                    scoreFn(myVar.myscore);

                    //每加长5,速度提升10
                    if(!(myVar.myscore%5) && myVar.speed > 10){
                        clearInterval(myVar.itimes);
                        myVar.speed -= 10;
                        run();
                    }
                }

                //边界判断
                borderDetection(header_top,header_left);
                //自撞判断
                selfDetection(header_top,header_left);
            },myVar.speed)
        }

建议大家下载源码进行对比查看比较好理解,下面展示的是需要处理的方法;

温习数据算法—贪吃蛇-LMLPHP

 

总结

这里主要温习一下数据算法、游戏中面向对象和由局部到整体的思想。

逻辑有很多种,不必拘泥于一种,大家可以换一种不同的方法进行实现。

01-24 00:03