zoukankan      html  css  js  c++  java
  • 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> 
    坚持
  • 相关阅读:
    506. 相对排名 Relative Ranks
    500. 单词是否在键盘上的同一行 Keyboard Row
    openstack live migration性能分析
    libvirt/qemu特性之numa
    nova Scheduling 配置
    Specify compute hosts with SSDs
    nova conductor
    osprofiler
    watcher
    stacktach和ceilometer
  • 原文地址:https://www.cnblogs.com/gaoSJ/p/12714445.html
Copyright © 2011-2022 走看看