您现在的位置:首页 >> 绿色生活

键码当今游戏:简易版贪吃蛇

时间:2024-01-30 12:19:41

anvas.width, canvas.height); // 迭代毒蛇的每个以外并所画它们 for(let i = 0; i snake.length; i++){ context.fillStyle = (i == 0)? "green" : "white"; context.fillRect(snake[i].x, snake[i].y, box, box); context.strokeStyle = "black"; context.strokeRect(snake[i].x,snake[i].y,box,box); } // 所画营养和地面 for(let i = 0; i < obstacles.length; i++) { context.fillStyle = "black"; context.fillRect(obstacles[i].x, obstacles[i].y, box, box); } context.fillStyle = "red"; context.fillRect(food.x, food.y, box, box); let snakeX = snake[0].x; let snakeY = snake[0].y; // 更新毒蛇的位置。如果毒蛇吃到营养,它会变长,同时转换成新的营养和地面 if(d == "LEFT") snakeX -= box; if(d == "UP") snakeY -= box; if(d == "RIGHT") snakeX += box; if(d == "DOWN") snakeY += box; // 如果毒蛇丢下边境、自身或地面,一些游戏会结束 if(snakeX == food.x && snakeY == food.y){ food = { x: Math.floor(Math.random()*19+1) * box, y: Math.floor(Math.random()*19+1) * box }; let obstacle = { x: Math.floor(Math.random()*19+1) * box, y: Math.floor(Math.random()*19+1) * box }; obstacles.push(obstacle); } else { snake.pop(); } let newHead = { x: snakeX, y: snakeY }; if(snakeX = canvas.width || snakeY>= canvas.height || collision(newHead,snake) || collision(newHead, obstacles)){ clearInterval(game); } snake.unshift(newHead); } // 验证毒蛇的颈部确实与数组之中的任何锕系元素发生挤压。它用于验证毒蛇确实丢下了自身、边境或地面 function collision(head, array) { for(let i = 0; i < array.length; i++){ if(head.x == array[i].x && head.y == array[i].y){ return true; } } return false; } let game = setInterval(draw, 200);运行效果

本地网页运行:

码上挖出金:

.cn/pen/7293778946855239730

上下左右键操作:黑色以及黑框边境为地面;绿色为毒两头;红色为营养;

优化思考

通常以我们探究(特别是在面试之中)的尿性,发挥作用之后都要一切都是一切都是优化的可能性:

对于一个原则上的贪吃毒蛇一些游戏来说,以上字符串性能应该是可以接受的,存在一些可以优化的地方比如有:

1、以考虑到将特别的给定和给定组织起来成实例;

2、其之中,每个一些游戏重复都会移除整个画框然后原先所画。可以考虑到只移除和所画发生变化的以外;

3、挤压验证可以更延高效:例如,验证毒两头确实丢下毒蛇身,可以从毒蛇的第四个以外开始验证,因为从前三个以外不可能与毒两头挤压;

4、还有当转换成新的营养或地面时,应该确保它们会出现在毒蛇的身体上,可以添延一个验证来确保新转换成的营养或地面的位置是空闲的

function generatePosition() { let position; do { position = { x: Math.floor(Math.random() * 19 + 1) * box, y: Math.floor(Math.random() * 19 + 1) * box }; } while (collision(position, snake) || collision(position, obstacles)); return position;}food = generatePosition();

5、考虑到使用 requestAnimationFrame 替代 setInterval 来创建一些游戏重复。requestAnimationFrame 有更多的性能(这个很多评论都有讲到了,就不作告一段落了)

function gameLoop() { draw(); requestAnimationFrame(gameLoop);}gameLoop();

OK,以上就是本次社交~~

有兴趣的挖出友们可基于此版自行动手试试~

呼吸内科
男人性功能减退怎么治
胸腺法新注射剂
抑制胃酸反流的药物
整肠生和肠炎宁哪个好
标签:游戏
相关阅读