<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>贪吃蛇</title> <style type="text/css"> .game_container{ background-color: #F0F8FF; margin-left: 100px; text-align: left; width:200px; } #drawing{ background-color: #D1EEEE; box-shadow: 10px 10px 5px #888888; } </style> </head> <body> <div class="game_container"> <canvas id = "drawing" width="500" height="500">浏览器不支持</canvas> </div> </body> <script type="text/javascript"> var canvas = document.getElementById("drawing"); var context = canvas.getContext("2d"); //绘制canvas网格 function drawGrid(){ context.lineWidth = 0.3; var width = canvas.width; var height = canvas.height; for(var i = 1;i < width/10;i ++){ context.moveTo(i*10,0); context.lineTo(i*10,height); } for(var j = 1;j < height/10;j ++){ context.moveTo(0,j*10); context.lineTo(width,j*10); } context.stroke(); } //方块的制作方法 function Rect(x,y,width,height,color){ this.x = x; this.y = y; this.width = width; this.height = height; this.color = color; } //画方块的方法 Rect.prototype.draw = function(){ context.beginPath(); context.fillStyle = this.color; context.rect(this.x,this.y,this.width,this.height); //context.arc(this.x,this.y,this.width/2,0,Math.PI*2); context.fill(); context.stroke(); } //蛇 function Snake(){ //组成蛇的方块对象 var snakeBodyArray = []; //蛇初始化 for(var i = 0;i < 4;i ++){ var rect = new Rect(i*10,10,10,10,'green'); snakeBodyArray.splice(0,0,rect); } var snakeHead = snakeBodyArray[0]; snakeHead.color = 'red'; //保存蛇头 蛇身 方向 this.head = snakeHead; this.snakeArray = snakeBodyArray; this.direction = 39; } //画蛇的方法 Snake.prototype.draw = function(){ var snakeArray = this.snakeArray; for(var i = 0;i < snakeArray.length;i ++){ snakeArray[i].draw(); } } //蛇移动的方法 跟新当前蛇的组成数组 Snake.prototype.move = function(){ /*********判断是否碰撞***********/ //撞墙的方法 if( (this.head.x + this.head.width) >= canvas.width || (this.head.y + this.head.height) >= canvas.height || (this.head.x) <= 0 || (this.head.y) <= 0){ clearInterval(gameHandle); return; } //撞上自身的方法(避开蛇头与蛇头比较的情况) for(var m = 1; m < this.snakeArray.length; m ++){ var bodyItem = this.snakeArray[m]; if(bodyItem.x == this.head.x && bodyItem.y == this.head.y){ clearInterval(gameHandle); return; } } /*********贪吃蛇的移动方法**********/ //蛇移动 删除最后面的一个方块 在蛇头后面添加一个方块 蛇头向前移动一格 var rect = new Rect(this.head.x,this.head.y,this.head.width,this.head.height,'green'); //先添加一个方块(判断是否吃到食物,如果吃到,就不弹出数组最后一个,否则弹出最后一个) this.snakeArray.splice(1,0,rect); /**********判断蛇是否吃食物***********/ if(this.head.x == food.x && this.head.y == food.y){ //重新生成食物 food = createSnakeFood(); }else{ this.snakeArray.pop();//弹出最后一个 } //设置蛇的运动方向 37左 38上 39右 40下 switch(this.direction){ case 37: this.head.x = this.head.x - this.head.width; break; case 38: this.head.y = this.head.y - this.head.height; break; case 39: this.head.x = this.head.x + this.head.width; break; case 40: this.head.y = this.head.y + this.head.height; break; default: break; } } //获取两个数之间的随机数 function generateRandom(min,max){ var range = max - min; var r = Math.random(); return Math.round(r*range + min); } //生成蛇的食物 function createSnakeFood(){ var isFoodInBody = true; var rect; while(isFoodInBody){ isFoodInBody = false; var x = generateRandom(0,canvas.width/10 - 2); var y = generateRandom(0,canvas.height/10 - 2); rect = new Rect(x*10,y*10,10,10,'yellow'); var snakeArray = snake.snakeArray; for(var i = 0;i < snakeArray.length; i ++){ if(snakeArray[i].x == rect.x && snakeArray[i].y == rect.y){ isFoodInBody = true; break; } } } return rect; } //键盘的事件监听 37左 38上 39右 40下 document.onkeydown = function(event){ switch(event.keyCode){ case 37: if(snake.direction !== 39){ snake.direction = 37; } break; case 38: if(snake.direction !== 40){ snake.direction = 38; } break; case 39: if(snake.direction !== 37){ snake.direction = 39; } break; case 40: if(snake.direction !== 38){ snake.direction = 40; } break; default: break; } event.preventDefault(); } //游戏启动 var snake = new Snake(); var food = createSnakeFood(); food.draw(); snake.draw(); var gameHandle = setInterval(function(){ context.clearRect(0,0,canvas.width,canvas.height); food.draw(); snake.move(); snake.draw(); },300); </script> </html>
canvas实现贪吃蛇
猜你喜欢
转载自blog.csdn.net/wdhouyigege/article/details/80374425
今日推荐
周排行