真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

js怎么實(shí)現(xiàn)貪吃蛇小游戲

這篇文章將為大家詳細(xì)講解有關(guān)js怎么實(shí)現(xiàn)貪吃蛇小游戲,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括姜堰網(wǎng)站建設(shè)、姜堰網(wǎng)站制作、姜堰網(wǎng)頁(yè)制作以及姜堰網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,姜堰網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到姜堰省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

示例代碼




 
 貪吃蛇重構(gòu)
 


 對(duì)不起,您的瀏覽器不支持canvas
 

首先,我們要知道做一個(gè)貪吃蛇最主要的是什么,是做出蛇活動(dòng)的場(chǎng)所和如何使蛇動(dòng)起來(lái)。

我們先看蛇活動(dòng)的場(chǎng)所:



 對(duì)不起,您的瀏覽器不支持canvas


box = document.getElementById('can').getContext('2d');

這是一個(gè)400px*400px的canvas,思路是以20px*20px為一個(gè)方格,組成20行20列的方陣,總共400格,然后綠色填充的格子表示蛇身,用黃色表示食物。這400個(gè)格子和數(shù)字0~399一一對(duì)應(yīng),對(duì)應(yīng)的方式就是以20作為基數(shù),n / 20再取整表示第幾行,n % 20表示第幾列。行數(shù)和列數(shù)都用0~19表示。

蛇用一個(gè)一維數(shù)組表示,每個(gè)值都是這400個(gè)數(shù)中的一個(gè),用var snake = [41, 40];初始化這條蛇,索引0為蛇頭。food表示食物的位置,direction表示蛇頭下一次運(yùn)動(dòng)的轉(zhuǎn)向。蛇的運(yùn)動(dòng)就用添加和刪除數(shù)組元素來(lái)實(shí)現(xiàn),每次執(zhí)行繪制蛇頭,去掉蛇尾,循環(huán)執(zhí)行使蛇運(yùn)動(dòng)。

下邊從函數(shù)運(yùn)行的起始處(39行)開(kāi)始看:

!function() {}();

什么鬼?這其實(shí)是立即執(zhí)行函數(shù)IIFE的另一種寫(xiě)法。關(guān)于IIFE,這篇文章講的挺不錯(cuò)的。繼續(xù)往下看,給蛇頭添加一個(gè)節(jié)點(diǎn)n,其值為當(dāng)前蛇頭的值加direction的值,如此一來(lái)就能理解為什么要用20表示向下,-20表示向上了。再下一行是一個(gè)if語(yǔ)句,其中值得提醒的是&&的優(yōu)先級(jí)高于||,這個(gè)語(yǔ)句就是判斷即將出現(xiàn)的蛇頭是不是屬于蛇身,或者跑到box外邊去了。如果沒(méi)有死亡,就把這個(gè)蛇頭繪制出來(lái),下邊就看看繪制的代碼:

function draw(seat, color) {
 box.fillStyle = color;
 box.fillRect(seat % 20 *20 + 1, ~~(seat / 20) * 20 + 1, 18, 18);
}

填充時(shí)填充18*18的像素,留1px邊框。 .fillRect()中第一個(gè)參數(shù)就是要繪制的矩形的x坐標(biāo)seat % 20 *20 + 1,即先得到所要繪制的矩形塊在方陣中的位置:第~~(seat / 20)行,第seat % 20列,再* 20 + 1具體到像素點(diǎn)??赡苓@個(gè)~~有點(diǎn)難理解,我感覺(jué)在這里的用處應(yīng)該和Math.floor()差不多,對(duì)一個(gè)浮點(diǎn)型的數(shù)取反再取反,得到的數(shù)就是去掉小數(shù)位的整數(shù)了。

回到47行,又是一個(gè)判斷語(yǔ)句,判斷下次蛇頭出現(xiàn)的位置是不是和當(dāng)前的食物的位置相同,如果相同,生成下一個(gè)食物,食物的位置為一個(gè)隨機(jī)數(shù),但是要判斷這個(gè)點(diǎn)不是出現(xiàn)在當(dāng)前的蛇身上,繪制食物。如果沒(méi)有吃到食物,即蛇在正常運(yùn)動(dòng)時(shí),每向前一次,將蛇尾彈出,并利用其返回值將這個(gè)點(diǎn)重新繪制為黑色。

最后的setTimeout,循環(huán)執(zhí)行當(dāng)前函數(shù),設(shè)置執(zhí)行周期來(lái)調(diào)蛇的移動(dòng)速度。

到了這里,我們發(fā)現(xiàn)這條蛇已經(jīng)可以動(dòng)了,加上鍵盤(pán)的操作就完成了:

document.onkeydown = function(evt) { 
 direction = snake[1] - snake[0] == (n = [-1, -20, 1, 20][(evt || event).keyCode - 37] || direction) ? direction : n;
};

將這個(gè)函數(shù)綁定到鍵盤(pán)事件上,evt || event用法的原因這里有詳細(xì)的解釋?zhuān)菫榱思嫒輎e。

三目運(yùn)算符?前邊的判斷語(yǔ)句又可分為兩部分:

  1. snake[1] - snake[0]的值應(yīng)該就是-direction,按理說(shuō)此處寫(xiě)成-direction應(yīng)該和原來(lái)是一個(gè)效果,那為什么沒(méi)有這么做呢,因?yàn)槿绻@樣寫(xiě),玩家可能在一個(gè)函數(shù)周期中多次改變direction的值,最后使得direction和當(dāng)前真正的運(yùn)動(dòng)方向不一致,導(dǎo)致游戲崩潰。

  2. 在==后邊, [-1, -20, 1, 20][(evt || event).keyCode - 37]中前邊的[]是一個(gè)數(shù)組,后邊的[]是取索引,左上右下四個(gè)鍵的keyCode分別為37, 38, 39, 40,計(jì)算后的索引為0, 1, 2, 3,使方向鍵與direction的取值對(duì)應(yīng)起來(lái)。這里的巧妙之處在于如果按下的按鍵不是方向鍵,在數(shù)組中將得不到對(duì)應(yīng)的值,返回undefine。此時(shí),由于之后的||運(yùn)算符,n會(huì)取到direction原來(lái)的值。

再用三目運(yùn)算符來(lái)判斷,如果按鍵方向不是反方向,就更新direction的值。

關(guān)于“js怎么實(shí)現(xiàn)貪吃蛇小游戲”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


網(wǎng)站標(biāo)題:js怎么實(shí)現(xiàn)貪吃蛇小游戲
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/pjdjjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部