snakeGame 发表于 2018-05-17 | 分类于 FE 自己手写了一下贪吃蛇,(有所参考)看来,任何一个小东西要完整做出来,想要加深体会,非要亲自动手写才行,绝非脑海中的“大致过一下” JS代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147window.onload = function() { var len = 4; var snake = []; for (var i = len-1; i >= 0; i--) { snake.push({ x:i, y:0 }); } var cvs = document.getElementById("canvas"); var ctx = cvs.getContext("2d"); var cvsW = cvs.width; var cvsH = cvs.height; var snakeW = 10; var snakeH = 10; var score = 4; var food = { x: Math.round(Math.random()*(cvsW/snakeW)), y: Math.round(Math.random()*(cvsH/snakeH)) } //drawFood function drawFood(x,y){ ctx.fillStyle = "yellow"; ctx.fillRect(x*snakeW,y*snakeH,snakeW,snakeH); ctx.fillStyle = "#000"; ctx.strokeRect(x*snakeW,y*snakeH,snakeW,snakeH); } //default direction var direction = "right"; // read use direction document.addEventListener("keydown",getDirection); function getDirection(e){ if (e.keyCode == 37 && direction != "right") { direction = "left"; } else if (e.keyCode == 38 && direction != "down") { direction = "up"; } else if (e.keyCode == 39 && direction != "left") { direction = "right"; } else if (e.keyCode == 40 && direction != "up") { direction = "down"; } } //hit self detect function checkHitItselft(x,y,array){ for (var i = 1; i < array.length; i++) { if(array[i].x == x && array[i].y == y){ return true; } } return false; } //show the score function drawScore(x){ ctx.fillStyle = "yellow"; ctx.font = "18px Verdana"; ctx.fillText("score is :" + x,10,cvsH-10); } function drawSnake(x,y){ ctx.fillStyle = "#FFF"; ctx.fillRect(x*snakeW,y*snakeH,snakeW,snakeH); ctx.fillStyle = "#000"; ctx.strokeRect(x*snakeW,y*snakeH,snakeW,snakeH); } function draw(){ ctx.clearRect(0,0,cvsW,cvsH); // for (var i = 0; i < snake.length; i++) { // var x = snake[i]*snakeW; // var y = snake[i]*snakeH ; // drawSnake(x,y); // } for (var i = 0; i < snake.length; i++) { var x = snake[i].x; var y = snake[i].y; drawSnake(x,y); } drawFood(food.x,food.y); //base on direction set snakeHead var snakeX = snake[0].x; var snakeY = snake[0].y; //crash the wall game over if (snake[0].x<0 || snake[0].x>cvsW/snakeW || snake[0].y<0 || snake[0].y>cvsH/snakeH || checkHitItselft(snakeX,snakeY,snake)) { location.reload(); } if (direction == "left") { snakeX--; } else if (direction == "right") { snakeX++; } else if (direction == "up") { snakeY--; } else if (direction == "down") { snakeY++; } var newHead ={ x:snakeX, y:snakeY }; if(snakeX == food.x && snakeY == food.y){ food ={ x: Math.round(Math.random()*(cvsW/snakeW)), y: Math.round(Math.random()*(cvsH/snakeH)) } score++; }else{ snake.pop(); } drawScore(score); var newHead ={ x:snakeX, y:snakeY }; snake.unshift(newHead); } setInterval(draw,100);} HTML代码123456789101112131415161718192021<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>snakeGame</title> <style> #canvas{ background-color: #000; } </style></head><body> <div style="width: 100% ; text-align:center"> <canvas id="canvas" width="500px" height="500px"> </canvas> </div> <script src="snake.js"></script></body></html>