主页 > 前端 > javascript >
来源:自学PHP网 时间:2017-06-22 11:02 作者: 阅读:次
[导读] 曾经诺基亚的贪吃蛇风靡一时,在游戏匮乏的年代,用Java实现太难,现在网页制作20行代码就做成一个简单的demo了,下面这篇文章主要给大家介绍了利用20行js代码实现的贪吃蛇小游戏,...
前言 最近在csdn上看到一位大神用20行代码就写出了一个贪吃蛇的小游戏,感觉被惊艳到了,就试着读了一下这段代码,阅读过程中不断为作者写法的巧妙而叫绝,其中我发现自己对运算符优先级和一些js的技巧不是很清楚,所以看完之后决定把思路分享出来,方便和我一样的小白学习。 我对代码稍稍做了些修改,并添加了一些注释,方便理解。 示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>贪吃蛇重构</title> <style> body { display: flex; height: 100vh; margin: 0; padding: 0; justify-content: center; align-items: center; } </style> </head> <body> <canvas id="can" width="400" height="400" style="background-color: black">对不起,您的浏览器不支持canvas</canvas> <script> var snake = [41, 40], //snake队列表示蛇身,初始节点存在但不显示 direction = 1, //1表示向右,-1表示向左,20表示向下,-20表示向上 food = 43, //食物的位置 n, //与下次移动的位置有关 box = document.getElementById('can').getContext('2d'); //从0到399表示box里[0~19]*[0~19]的所有节点,每20px一个节点 function draw(seat, color) { box.fillStyle = color; box.fillRect(seat % 20 *20 + 1, ~~(seat / 20) * 20 + 1, 18, 18); //用color填充一个矩形,以前两个参数为x,y坐标,后两个参数为宽和高。 } document.onkeydown = function(evt) { //当键盘上下左右键摁下的时候改变direction direction = snake[1] - snake[0] == (n = [-1, -20, 1, 20][(evt || event).keyCode - 37] || direction) ? direction : n; }; !function() { snake.unshift(n = snake[0] + direction); //此时的n为下次蛇头出现的位置,n进入队列 if(snake.indexOf(n, 1) > 0 || n < 0 || n > 399 || direction == 1 && n % 20 == 0 || direction == -1 && n % 20 == 19) { //if语句判断贪吃蛇是否撞到自己或者墙壁,碰到时返回,结束程序 return alert("GAME OVER!"); } draw(n, "lime"); //画出蛇头下次出现的位置 if(n == food) { //如果吃到食物时,产生一个蛇身以外的随机的点,不会去掉蛇尾 while (snake.indexOf(food = ~~(Math.random() * 400)) > 0); draw(food, "yellow"); } else { //没有吃到食物时正常移动,蛇尾出队列 draw(snake.pop(),"black"); } setTimeout(arguments.callee, 150); //每隔0.15秒执行函数一次,可以调节蛇的速度 }(); </script> </body> </html> 首先,我们要知道做一个贪吃蛇最主要的是什么,是做出蛇活动的场所和如何使蛇动起来。 我们先看蛇活动的场所: <!-- html --> <canvas id="can" width="400" height="400" style="background-color: black"> 对不起,您的浏览器不支持canvas </canvas> <!-- js --> box = document.getElementById('can').getContext('2d'); 这是一个400px*400px的canvas,思路是以20px*20px为一个方格,组成20行20列的方阵,总共400格,然后绿色填充的格子表示蛇身,用黄色表示食物。这400个格子和数字0~399一一对应,对应的方式就是以20作为基数,n / 20再取整表示第几行,n % 20表示第几列。行数和列数都用0~19表示。 蛇用一个一维数组表示,每个值都是这400个数中的一个,用 下边从函数运行的起始处(39行)开始看: !function() {}(); 什么鬼?这其实是立即执行函数IIFE的另一种写法。关于IIFE,这篇文章讲的挺不错的。继续往下看,给蛇头添加一个节点n,其值为当前蛇头的值加direction的值,如此一来就能理解为什么要用20表示向下,-20表示向上了。再下一行是一个if语句,其中值得提醒的是&&的优先级高于||,这个语句就是判断即将出现的蛇头是不是属于蛇身,或者跑到box外边去了。如果没有死亡,就把这个蛇头绘制出来,下边就看看绘制的代码: function draw(seat, color) { box.fillStyle = color; box.fillRect(seat % 20 *20 + 1, ~~(seat / 20) * 20 + 1, 18, 18); } 填充时填充18*18的像素,留1px边框。 回到47行,又是一个判断语句,判断下次蛇头出现的位置是不是和当前的食物的位置相同,如果相同,生成下一个食物,食物的位置为一个随机数,但是要判断这个点不是出现在当前的蛇身上,绘制食物。如果没有吃到食物,即蛇在正常运动时,每向前一次,将蛇尾弹出,并利用其返回值将这个点重新绘制为黑色。 最后的setTimeout,循环执行当前函数,设置执行周期来调蛇的移动速度。 到了这里,我们发现这条蛇已经可以动了,加上键盘的操作就完成了: document.onkeydown = function(evt) { direction = snake[1] - snake[0] == (n = [-1, -20, 1, 20][(evt || event).keyCode - 37] || direction) ? direction : n; }; 将这个函数绑定到键盘事件上,evt || event用法的原因这里有详细的解释,是为了兼容ie。 三目运算符?前边的判断语句又可分为两部分:
再用三目运算符来判断,如果按键方向不是反方向,就更新direction的值。 以上就是本篇的全部内容啦,虽然都是一些基础的东西,但是感觉还是挺好玩的。要是哪里理解的不对还希望指证出来,共同进步。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对自学php网的支持。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com