canvas贪吃蛇

html

<h1>贪吃蛇</h1>
<div class="canvas">
    <canvas id="myCanvas"></canvas>
</div>    
<p class="score">0</p>
<a class="start">开始</a>

 

css

.canvas{
    width: 95%;
    margin: 0 auto;
    background: burlywood;
}

 

js

            function Snake(){
                this.block_size = 20;
                this.snake = [];
                this.len = 4;
                this.direction = 2;
                this.border = {x:0,y:0};
                this.col = 17;
                this.food = {};
                this.old = [];
            }
        
            Snake.prototype.addFood = function(){
                this.food.x = Math.floor(Math.random()*(this.col-1))*this.block_size;
                this.food.y = Math.floor(Math.random()*(this.col-1))*this.block_size;
                        
            }
            Snake.prototype.init = function(){
                var self = this;
                
                this.snake.push({x: 0,y: 0},{x: this.block_size,y:0},{x:this.block_size*2,y:0})
                var start_x,
                    start_y,
                    end_x,
                    end_y,
                    d_x,
                    d_y,
                    direction,
                    self = this;
                    
                $('body').on('touchstart',function(e){
                    e.preventDefault();
                    start_x = e.originalEvent.changedTouches[0].pageX;
                    start_y = e.originalEvent.changedTouches[0].pageY;
                });
                
                $('body').on('touchend',function(e){
                    e.preventDefault();
                    
                    end_x = e.originalEvent.changedTouches[0].pageX;
                    end_y = e.originalEvent.changedTouches[0].pageY;
                    d_x = end_x - start_x;
                    d_y = end_y - start_y;
                    if( Math.abs(d_x) > Math.abs(d_y) && d_x > 0){
                        self.direction = 2;

                    }
                    if( Math.abs(d_x) > Math.abs(d_y) && d_x < 0){
                        self.direction = 4;
                    }
                    if( Math.abs(d_y) > Math.abs(d_x) && d_y > 0){
                        self.direction = 3
                    }
                    if( Math.abs(d_y) > Math.abs(d_x) && d_y < 0){
                        self.direction = 1;
                    }
                    
                    self.move(direction);
                })
                this.addFood();
                this.draw();
                
                self.timer = setInterval(function(){
                    self.move(self)
                },500)
            }
            
            Snake.prototype.over = function(){
                
                var last = this.snake[this.snake.length-1];
                
                var last_x = last.x + this.block_size/2;
                
                var last_y = last.y + this.block_size/2;
                
                if( last_x >=  this.border || last_x <= 0 || last_y >= this.border || last_y <= 0 ){
                    
                    clearInterval(this.timer);
                    
                    alert('你挂了');
                }
            }
            
            Snake.prototype.eat = function(){
                var last = this.snake[this.snake.length-1];
                
                if(last.x === this.food.x && last.y === this.food.y){
                    
                    this.old.unshift({x: this.food.x,y: this.food.y});
                    
                    this.snake = this.old;
                    
                    this.food.x = -110;
                    this.food.y = -110;
                    
                    this.addFood();
                    
                    document.querySelector('.score').innerHTML = parseInt(document.querySelector('.score').innerHTML)+20;
                }
            }
            
            Snake.prototype.move = function(_this){
                var self = _this;
                
                self.old = self.snake;
                
                var canvas =    document.getElementById('myCanvas'),
                    ctx = canvas.getContext('2d');
                    
                var n = self.snake.length;
                
                switch(self.direction){
                    case 1://向上
this.snake.push({x: self.snake[n-1].x,y: self.snake[n-1].y - self.block_size})
                    break;
                    case 2:
this.snake.push({x: self.snake[n-1].x + self.block_size,y: self.snake[n-1].y})
                    break;
                    case 3:
this.snake.push({x: self.snake[n-1].x,y: this.snake[n-1].y + self.block_size})                    
                    break;
                    case 4:
this.snake.push({x: self.snake[n-1].x - this.block_size,y: self.snake[n-1].y})                    
                    break;
                }
                
                self.snake.shift();
                self.draw();
                self.eat();
                self.over();
            }
            
            Snake.prototype.draw = function(){
                
                var canvas =  document.getElementById('myCanvas'),
                    ctx  =  canvas.getContext('2d');
                var pw = canvas.parentNode.clientWidth;
                
                var canvas_w = pw;
                
                var row  =  20,
                    col  =  20,
                    block_size  =  this.block_size;
                
                this.border = canvas_w;
                this.col = Math.floor(canvas_w/this.block_size);
                
                canvas.width = canvas_w;
                canvas.height = canvas_w;
                ctx.strokeStyle = '#43B049';
                ctx.lineWidth = 1;
                
                //画棋盘
                for (var i = 0; i < canvas_w; i += block_size) {
                    ctx.moveTo(0, i);
                    ctx.lineTo(canvas_w,i);
                    ctx.moveTo(i, 0);
                    ctx.lineTo(i,canvas_w)
                    ctx.stroke();
                }
                
                //画蛇
                for (var j = 0,len = this.snake.length; j < len; j++ ) {
                    ctx.beginPath();
                    ctx.fillStyle = '#43B049';
                    ctx.fillRect(this.snake[j].x,this.snake[j].y,block_size,block_size);
                }
                 ctx.fillRect(this.food.x,this.food.y,20,20);
                    ctx.fill();
                
            }
            
            var snake =     new Snake();
            
            snake.draw();
            
            document.querySelector('.start').addEventListener('click',function(){
                
                snake.init();
                
            })

over

posted @ 2016-12-01 17:41  七分醉儿  阅读(225)  评论(0编辑  收藏  举报