• JS能跑起来的贪吃蛇!(Bug多多 求指点。。)


    <html>
        <head>
            <!-- 地图的样式 -->
            <style>
                #map{
                     800px;
                    height: 600px;
                    background-color: lightgray;
                    position: relative;
                }    
            </style>
    
    
            <!-- 创建相关的对象 -->
            <script>
                /**
                 * 
                 * 启用自调用函数这种模式 可以防止与其他的js发生变量重名等冲突的异常发生
                 * (function(window,undefind){...代码...})(window,undefind)  //传入window 和 undefind的目的就是为了可以在发布时变量名window可以别压缩 另在老版本中undefind防止被改变
                 * 
                 */
                
                // **********************************创建食物对象**********************************************
                // **********************************创建食物对象**********************************************
                (function(){
                        //创建一个工具类对象    静态的对象 也就是工具类的创建方式
                        var Tools = {getRandom:function(min,max){return Math.floor(Math.random()*(max-min+1))+min;}}
    
                        //创建一个变量来记录生成的食物
                        var elements = [];
                        function Food(options){
                            var options = options ||{};
                            //初始化食物的位置
                            this.x = options.x || 0;  
                            this.y = options.y || 0;
                            //初始化食物的大小
                            this.width = options.width || 20;
                            this.height = options.height || 20;
                            //设置食物的颜色
                            this.color = options.color || 'green';
                        }
    
                        //为食物创建一个渲染u方法(渲染就是把食物显示再浏览器中)
                        Food.prototype.render = function(map){ 
                            //创建食物时先删除现在已经有的食物~
                            remove();                         
                            var map = map;
                            var div = document.createElement('div'); 
                            elements.push(div); //把生成的div放置到数组中进行保存
                            map.appendChild(div);
                            div.style.position = 'absolute';
                            div.style.left = this.x +'px';
                            div.style.top = this.y + 'px';
                            div.style.width = this.width +'px';
                            div.style.height = this.height +'px';
                            div.style.backgroundColor = this.color;
    
                            this.div = div ;//把这个div对象绑定到这个food对象上供后面调用
                            this.map = map;
                            this.random();
                        }
    
                        //删除食物 
                        function remove(){
                            for(var i =elements.length-1; i>=0; i--){
                                //删除div
                                elements[i].parentNode.removeChild(elements[i]);    
                                //删除数组中的元素
                                elements.splice(i,1);     
                            }
                        }
    
    
                        //创建随机生成位置的方法函数
                        Food.prototype.random = function(){
                            var x = Tools.getRandom(0,this.map.offsetWidth/this.width-1)*this.width;
                            var y = Tools.getRandom(0,this.map.offsetHeight/this.height-1)*this.height;
                            this.div.style.left = x + 'px';
                            this.div.style.top = y + 'px';
    
                            this.x =x; //改变位置以后 一定要把新的位置赋值给食物!!!!!!!!!!!
                            this.y =y;
                        }
                        //让外部可以访问这个函数域中的对象
                        window.Food = Food;
                 })();
    
    
    
    
    
                // **********************************创建蛇对象**********************************************
                // **********************************创建蛇对象**********************************************
                (function(){
                    //记录创建的蛇
                    var elements = [];
                    //生成snake的构造方法
                    function Snake(op){
                        var op = op || {};
                        this.width = op.width || 20;
                        this.height = op.height || 20;
                        this.direction = op.direction || 'right';
                        this.body = [
                            {x:3,y:2,color:'red'},
                            {x:2,y:2,color:'blue'},
                            {x:1,y:2,color:'blue'}
                        ]
                    }
    
                    //为snake生成一个渲染的方法(怎么显示在页面上)
                    Snake.prototype.render = function(map){
                        //删除之前创建的snake
                        remove();
                        var map = map;
                        for(var i = 0,len = this.body.length; i<len; i++){
                            var object = this.body[i];
                            var div = document.createElement('div');
                            map.appendChild(div);
                            elements.push(div); //记录当前生成的snake
                            div.style.position = 'absolute';
                            div.style.width = this.width +'px';
                            div.style.height = this.height +'px';
    
                            //设置snake的初始位置
                            div.style.left = object.x * this.width + 'px';
                            div.style.top = object.y * this.height + 'px';
    
                            //设置颜色
                            div.style.backgroundColor = object.color;
                        }
                    }
    
                    //删除开始创建的sanke对象在 生成新的snake之前
                    function remove(){
                        for(var i =elements.length-1; i>=0; i--){
                            //删除div
                            elements[i].parentNode.removeChild(elements[i]);
                            //删除数组中的元素
                            elements.splice(i,1);
                        }
                    }
                    
    
                    //snake的移动方法
                    Snake.prototype.move = function(food){
                        //先控制身体移动(当前的蛇节到上一个位置)
                        for(var i = this.body.length -1; i > 0; i--){   //this.body.length -1 除去蛇头
                            this.body[i].x = this.body[i-1].x;   //当前的蛇节 x 等于上一个蛇节的 x
                            this.body[i].y = this.body[i-1].y;   //当前的蛇节 y 等于上一个蛇节的 y
                        }
                        //控制蛇头的移动位置
                        var head = this.body[0];
                        switch(this.direction){
                            case 'right':
                                head.x += 1;
                                break;
                            case 'left':
                                head.x -= 1;
                                break;
                            case 'top':
                                head.y -= 1;
                                break;
                            case 'bottom':
                                head.y += 1;
                                break;
                        }
    
                        //判断snake的头 是否吃到了食物
                        var hX = head.x * this.width;
                        var hY = head.y * this.height;
    
                         if(hX === food.x && hY === food.y){   
                              //吃食物
                              //获取蛇的最后一节
                              var last = this.body[this.body.length-1];
                              //增加蛇身
                              this.body.push({x:last.x,y:last.y,color:last.color});
                              //新的食物
                              food.render(food.map);
                         }
                    }
                    window.Snake = Snake;
                })();
    
    
    
                // **********************************创建游戏对象**********************************************
                // **********************************创建游戏对象**********************************************
                (function(){
                    
                    var cope_this; //记录当前游戏的对象 供私有的函数也可以使用这个对象
    
                    function Game(map){
                        this.food = new Food(); //等价于new window.Food();
                        this.snake = new Snake();
                        this.map = map;
    
                        cope_this = this;
                    }
    
                    Game.prototype.start = function(){
                        //开始游戏把蛇和食物渲染在地图上
                        this.food.render(this.map);
                        //this.food.random();
                        this.snake.render(this.map);
    
                        //开始游戏的
                        //1让snake可以移动起来
                        //2当snake遇到地图的边界
                        runSnake();
                        //3通过键盘可以控制snake的移动
                        bindKey();
                        //4当snake吃到食物时 食物消失 蛇长一个身体 在次生成一个食物
                
                        
                    }
    
    
    
    
    
                    //注册键盘事件
                    function bindKey(){
                        //document.onkeydown = function(){};
                        document.addEventListener('keydown',function(e){
                            //console.log(e.keyCode)  37 left  38 -top 39 right 40 bottom
    
                            switch(e.keyCode){
                                case 37:
                                cope_this.snake.direction = 'left';
                                break;
                                case 38:
                                cope_this.snake.direction = 'top';
                                break;
                                case 39:
                                cope_this.snake.direction = 'right';
                                break;
                                case 40:
                                cope_this.snake.direction = 'bottom';
                                break;
                            }
    
                            
                        },false)
                    }
    
    
    
    
    
                    function runSnake(){
                        //开启一个定时器让sanke不断的移动 然后用键盘改变snake头的方向即可
                        var timerId = setInterval(function(){
                            
                            //让snake移动起来
                            cope_this.snake.move(cope_this.food);
                            cope_this.snake.render(cope_this.map);
    
                            //如果移动到了地图的边界
                            //获取snake头的坐标
                            var headX = cope_this.snake.body[0].x;
                            var headY = cope_this.snake.body[0].y;
                            
                            var maxX = cope_this.map.offsetWidth /cope_this.snake.width;
                            var maxY = cope_this.map.offsetHeight /cope_this.snake.height;
    
                            if(headX < 0 || headX >= maxX || headY < 0 || headY >= maxY){
                                alert("GameOver!");
                                clearInterval(timerId);
                            }
                
    
                        },500);
                    }
    
      
                    window.Game = Game;
                })()
    
    
    
            </script>
        </head>
    
    
    
        <body><div id="map"> </div></body> 
    
    
        <!-- ***********************************测试js************************************************************** -->
        <script>
            var map = document.getElementById('map');
            var game = new Game(map);
            game.start();
        </script>
    </html> 
    坚持
  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/gaoSJ/p/12714445.html
Copyright © 2020-2023  润新知