亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

20行js代碼實現的貪吃蛇小游戲

2019-11-19 16:18:12
字體:
來源:轉載
供稿:網友

前言

最近在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個數中的一個,用var snake = [41, 40];初始化這條蛇,索引0為蛇頭。food表示食物的位置,direction表示蛇頭下一次運動的轉向。蛇的運動就用添加和刪除數組元素來實現,每次執行繪制蛇頭,去掉蛇尾,循環執行使蛇運動。

下邊從函數運行的起始處(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邊框。 .fillRect()中第一個參數就是要繪制的矩形的x坐標seat % 20 *20 + 1,即先得到所要繪制的矩形塊在方陣中的位置:第~~(seat / 20)行,第seat % 20列,再* 20 + 1具體到像素點。可能這個~~有點難理解,我感覺在這里的用處應該和Math.floor()差不多,對一個浮點型的數取反再取反,得到的數就是去掉小數位的整數了。

回到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。

三目運算符?前邊的判斷語句又可分為兩部分:

  1. snake[1] - snake[0]的值應該就是-direction,按理說此處寫成-direction應該和原來是一個效果,那為什么沒有這么做呢,因為如果這樣寫,玩家可能在一個函數周期中多次改變direction的值,最后使得direction和當前真正的運動方向不一致,導致游戲崩潰。
  2. 在==后邊, [-1, -20, 1, 20][(evt || event).keyCode - 37]中前邊的[]是一個數組,后邊的[]是取索引,左上右下四個鍵的keyCode分別為37, 38, 39, 40,計算后的索引為0, 1, 2, 3,使方向鍵與direction的取值對應起來。這里的巧妙之處在于如果按下的按鍵不是方向鍵,在數組中將得不到對應的值,返回undefine。此時,由于之后的||運算符,n會取到direction原來的值。

再用三目運算符來判斷,如果按鍵方向不是反方向,就更新direction的值。

以上就是本篇的全部內容啦,雖然都是一些基礎的東西,但是感覺還是挺好玩的。要是哪里理解的不對還希望指證出來,共同進步。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久天堂国产精品女人| 亚洲精品有码在线| 久久精品国产成人| 中文字幕亚洲无线码在线一区| 日韩精品在线私人| 色在人av网站天堂精品| 久久亚洲电影天堂| 国产一级揄自揄精品视频| 91av视频在线免费观看| 久久国产加勒比精品无码| 国产日韩欧美视频在线| 国产精品自拍网| 国内外成人免费激情在线视频| 欧美激情成人在线视频| 91成人精品网站| 国产精品专区h在线观看| 久久久久久高潮国产精品视| 久久精品一偷一偷国产| 久久久久久久一区二区三区| 国产精品9999| 欧美成年人视频网站| 久久久久国产一区二区三区| 久久精品99久久香蕉国产色戒| 久久人人看视频| 亚洲加勒比久久88色综合| 成人激情视频网| 国内精品模特av私拍在线观看| 亚洲福利在线播放| 国产欧美中文字幕| 中文日韩电影网站| 欧美成aaa人片免费看| 久久琪琪电影院| 国产成人一区二区三区电影| 91久久夜色精品国产网站| 欧美亚洲国产日本| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品男人爽免费视频1| 91精品在线国产| 久久成人精品视频| 日韩在线中文字幕| 亚洲天堂色网站| 欧美在线视频一二三| 97精品欧美一区二区三区| 亚洲男人天堂2023| 日韩中文字在线| 久久国产精品影片| 国产精品自拍小视频| 国产日韩欧美在线| 欧美在线视频网| 欧洲成人免费aa| 久久免费视频这里只有精品| 亚洲成年人在线播放| 91老司机在线| 亚洲免费成人av电影| 国产亚洲欧美日韩一区二区| 中文字幕亚洲字幕| 日韩欧美国产激情| 久久午夜a级毛片| 欧美一级在线亚洲天堂| 日韩欧美中文字幕在线观看| 久久深夜福利免费观看| 国产欧亚日韩视频| 98精品国产自产在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 久久免费高清视频| 久久99久国产精品黄毛片入口| 琪琪亚洲精品午夜在线| 亚洲成人久久网| 亚洲欧美国产日韩天堂区| 日韩在线播放av| 欧美一性一乱一交一视频| 91网站免费观看| 成人有码在线视频| 青草青草久热精品视频在线网站| 欧美日韩亚洲系列| 国产97在线|日韩| 日韩中文字幕不卡视频| 丝袜一区二区三区| 成人在线视频网| 久久久国产精彩视频美女艺术照福利| 欧美最近摘花xxxx摘花| 最近的2019中文字幕免费一页| 欧美中文字幕第一页| 久久香蕉国产线看观看网| 色播久久人人爽人人爽人人片视av| 国产一区二区三区视频在线观看| 日韩电影在线观看免费| 亚洲free嫩bbb| 欧美高清视频一区二区| 黄色一区二区三区| 在线成人免费网站| 亚洲自拍欧美另类| 亚洲欧洲在线观看| 欧美日韩国产精品| 亚洲国产精品字幕| 久久精品一本久久99精品| 国产亚洲精品综合一区91| 丝袜美腿精品国产二区| 国产成人一区二区| 国产福利精品av综合导导航| 国产精品视频播放| 韩国三级电影久久久久久| 欧美成人精品不卡视频在线观看| 日韩电影中文字幕一区| 日本久久精品视频| 欧美一区二三区| 亚洲成av人影院在线观看| 国产69精品99久久久久久宅男| 日韩电影免费在线观看中文字幕| 亚洲性无码av在线| 尤物九九久久国产精品的分类| 久久久成人精品| 亚洲国产高清高潮精品美女| 一区二区三区高清国产| 久青草国产97香蕉在线视频| 亚洲国产精品99久久| 久久久亚洲欧洲日产国码aⅴ| 黄色成人在线播放| 精品一区二区三区四区| 中文字幕精品一区二区精品| 成人黄色大片在线免费观看| 成人做爽爽免费视频| 亚洲天堂网站在线观看视频| 亚洲综合精品一区二区| 欧美一级片久久久久久久| 欧美亚洲成人精品| 亚洲福利在线播放| 日韩av一区二区在线观看| 日韩在线播放视频| 亚洲视频欧美视频| 91久久久久久久久久久久久| 国产精品久久久久久中文字| 日韩女优在线播放| 久久亚洲国产精品| 亚洲激情视频在线观看| 国产精品女主播视频| 欧美国产精品日韩| 国产精品亚洲精品| 久久久久久国产精品三级玉女聊斋| 国产成人精品av| 日韩国产中文字幕| 亚洲日韩中文字幕在线播放| 欧美乱大交xxxxx| 国产成人一区二| 亚洲毛茸茸少妇高潮呻吟| 国产成人久久久| 国产91精品久久久久| 国产精品成人免费视频| 亚洲成人中文字幕| 日韩精品中文字幕视频在线| 国产精品尤物福利片在线观看| 亚洲精品网站在线播放gif| 亚洲xxxx在线| 黑人狂躁日本妞一区二区三区| 亚洲国产一区二区三区在线观看| 岛国av午夜精品| 国产999在线| 黄色成人av网| 亚洲国产第一页| 欧美中文字幕在线播放| 久久久久久久久国产| 久久精品中文字幕电影| 欧美精品一本久久男人的天堂| 国模精品一区二区三区色天香|