日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

基于JavaScript實現(xiàn)貪吃蛇游戲

瀏覽:26日期:2023-06-24 09:48:28

本文實例為大家分享了JavaScript實現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下

1.結(jié)構(gòu)

創(chuàng)建一個盒子box作為蛇的身體,當(dāng)前盒子中只有一個子元素,代表此時蛇的長度為1.在創(chuàng)建一個盒子food作為貪吃蛇的食物。

<div id='box'> <div></div></div><div id='food'></div>

2.CSS

設(shè)置蛇和食物的樣式,這里注意蛇和食物都是絕對定位。

<style> *{ padding: 0px; margin: 0px; } #box div{ width: 30px; height: 30px; box-sizing: border-box; background: green; border: 1px solid black; position: absolute; } #food{ width: 30px; height: 30px; background: brown; position: absolute; } </style>

3.腳本

獲取蛇的身體和每一個子元素

var box = document.getElementById('box');var boxs = document.getElementById('box').children;

定義蛇頭的位置

var snackX = 0;var snackY = 0;

獲取屏幕寬度和高度,以此來設(shè)定墻的邊界,以限制蛇的移動范圍。

var cw = document.documentElement.clientWidth; var ch = document.documentElement.clientHeight; var minsnackX = 0; var maxsnackX = Math.floor(cw / boxs[0].offsetWidth)*boxs[0].offsetWidth; var minsnackY = 0; var maxsnackY = Math.floor(ch / boxs[0].offsetHeight)*boxs[0].offsetHeight;

定義初始的移動方向。

var turn = 'right';

獲取食物元素,并設(shè)置食物的位置坐標(biāo)。

var foodele = document.getElementById('food'); var foodX,foodY;

蛇的初始化

for(var i = 0; i <6 ; i++){ box.appendChild(boxs[0].cloneNode(true)); }

刷新食物

function food(){ //此處的坐標(biāo)要先獲取頁面最大支持的蛇身體的塊數(shù),然后在塊數(shù)中隨機,然后乘以塊數(shù)的大小, //因為蛇的移動每一步都是固定的,想要判定食物和蛇頭重合就必須坐標(biāo)是整塊的倍數(shù)。 foodX = parseInt( Math.random()*Math.floor(cw / boxs[0].offsetWidth))*boxs[0].offsetWidth; foodY = parseInt( Math.random()*Math.floor(ch / boxs[0].offsetHeight))*boxs[0].offsetHeight; //判定當(dāng)食物的產(chǎn)生位置和蛇的任何一個位置重合時就重新生成食物。 for(var i = 0;i<boxs.length;i++){ if(foodX + 'px' === boxs[i].style.left && foodY + 'px' === boxs[i].style.top){ food(); } } foodele.style.left = foodX + 'px'; foodele.style.top = foodY + 'px'; }

調(diào)用food()方法 生成第一個食物

food();

設(shè)置定時器 每次執(zhí)行一次蛇的運行方法

var timer = setInterval(function(){ snackMOve(); },150)

封裝一個蛇的運動方法

//移動和判定邊界 function snackMOve(){//此處為判定方向 根據(jù)判定的方向,向改方向前進一個方塊 switch(turn){ case 'right':snackX +=30;break; case 'left':snackX -=30;break; case 'bottom':snackY +=30;break; case 'top':snackY -=30;break; } //如果蛇越過了墻就從另一端出現(xiàn) if(snackX > maxsnackX){ snackX = 0; } if(snackX < minsnackX){ snackX = maxsnackX; } if(snackY > maxsnackY){ snackY = 0; } if(snackY < minsnackY){ snackY = maxsnackY; } //從最后一個開始,每個元素跟隨上一個元素的位置 for(var i = boxs.length-1; i >0 ; i--){ boxs[i].style.left = boxs[i-1].style.left; boxs[i].style.top = boxs[i-1].style.top ; } //第一個也就是蛇頭的位置,永遠(yuǎn)是根據(jù)方向獲取的位置 boxs[0].style.left = snackX + 'px'; boxs[0].style.top = snackY + 'px' ; //判定吃到食物 就長大和刷新 //當(dāng)蛇頭位置移動之后與食物重合 那么刷新食物,并且在蛇的身體中插入一個克隆的元素,相當(dāng)于長度+1 if(snackX === foodX && snackY === foodY){ food(); box.appendChild(boxs[0].cloneNode(true)); }else{ //判定撞死 //當(dāng)蛇頭與身體中的任何一個元素重合,那么判定結(jié)束游戲,停止定時器 for(var i = 1;i<boxs.length;i++){ if(snackX + 'px' === boxs[i].style.left && snackY + 'px' === boxs[i].style.top){ clearInterval(timer); alert('失敗'); } } } }

蛇的運動方向

document.onkeydown = function(eve){ var e = eve||event; var keyCode = e.keyCode||e.which; switch(keyCode){ case 37:if(turn === 'right'){break;}turn = 'left';break; case 38:if(turn === 'bottom'){break;}turn = 'top';break; case 39:if(turn === 'left'){break;}turn = 'right';break; case 40:if(turn === 'top'){break;}turn = 'bottom';break; } }

全部代碼

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <meta http-equiv='X-UA-Compatible' content='ie=edge'> <title>Document</title> <style> *{ padding: 0px; margin: 0px; } #box div{ width: 30px; height: 30px; box-sizing: border-box; background: green; border: 1px solid black; position: absolute; } #food{ width: 30px; height: 30px; background: brown; position: absolute; } </style></head><body> <div id='box'> <div></div> </div> <div id='food'></div> <script> var box = document.getElementById('box'); var boxs = document.getElementById('box').children; var snackX = 0; var snackY = 0; var cw = document.documentElement.clientWidth; var ch = document.documentElement.clientHeight; var minsnackX = 0; var maxsnackX = Math.floor(cw / boxs[0].offsetWidth)*boxs[0].offsetWidth; var minsnackY = 0; var maxsnackY = Math.floor(ch / boxs[0].offsetHeight)*boxs[0].offsetHeight; var turn = 'right'; var foodele = document.getElementById('food'); var foodX,foodY; for(var i = 0; i <6 ; i++){ box.appendChild(boxs[0].cloneNode(true)); } //隨機食物 function food(){ foodX = parseInt( Math.random()*Math.floor(cw / boxs[0].offsetWidth))*boxs[0].offsetWidth; foodY = parseInt( Math.random()*Math.floor(ch / boxs[0].offsetHeight))*boxs[0].offsetHeight; for(var i = 0;i<boxs.length;i++){ if(foodX + 'px' === boxs[i].style.left && foodY + 'px' === boxs[i].style.top){ food(); } } foodele.style.left = foodX + 'px'; foodele.style.top = foodY + 'px'; } food(); //設(shè)置定時器 移動 var timer = setInterval(function(){ snackMOve(); },150) //移動和判定邊界 function snackMOve(){ switch(turn){ case 'right':snackX +=30;break; case 'left':snackX -=30;break; case 'bottom':snackY +=30;break; case 'top':snackY -=30;break; } //根據(jù)邊界歸零 if(snackX > maxsnackX){ snackX = 0; } if(snackX < minsnackX){ snackX = maxsnackX; } if(snackY > maxsnackY){ snackY = 0; } if(snackY < minsnackY){ snackY = maxsnackY; } for(var i = boxs.length-1; i >0 ; i--){ boxs[i].style.left = boxs[i-1].style.left; boxs[i].style.top = boxs[i-1].style.top ; } boxs[0].style.left = snackX + 'px'; boxs[0].style.top = snackY + 'px' ; //判定吃到食物 就長大和刷新 if(snackX === foodX && snackY === foodY){ food(); box.appendChild(boxs[0].cloneNode(true)); }else{ //判定撞死 暫停計時器 刷新 for(var i = 1;i<boxs.length;i++){ // console.log(boxs[i].style.left); if(snackX + 'px' === boxs[i].style.left && snackY + 'px' === boxs[i].style.top){ clearInterval(timer); alert('失敗'); // console.log(1) } } } } //方向 document.onkeydown = function(eve){ var e = eve||event; var keyCode = e.keyCode||e.which; switch(keyCode){ case 37:if(turn === 'right'){break;}turn = 'left';break; case 38:if(turn === 'bottom'){break;}turn = 'top';break; case 39:if(turn === 'left'){break;}turn = 'right';break; case 40:if(turn === 'top'){break;}turn = 'bottom';break; } } </script></body></html>

總結(jié)

貪吃蛇的思路主要是有以下幾個部分

1.食物的隨機出現(xiàn)(不能隨機在蛇身上)2.定時器控制蛇的移動3.墻的判定4.蛇的運動邏輯5.運動方向的判定6.吃到食物的判定7.蛇頭與身體的判定(即游戲結(jié)束的判定)

小編還為大家準(zhǔn)備了精彩的專題:javascript經(jīng)典小游戲匯總

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费人成在线不卡| 91久久亚洲| 天海翼精品一区二区三区| 香蕉成人久久| 亚洲一区欧美激情| 久久亚洲电影| 亚洲精品少妇| 日韩高清电影一区| 日韩动漫一区| 国产美女视频一区二区| 亚洲精品一级| 国产精品一区二区精品视频观看| 国产三级一区| 久久一区亚洲| 成人日韩在线观看| 亚洲性色视频| 日韩一区精品字幕| 91精品国产自产观看在线| 国产精品一区二区三区美女 | 成人在线观看免费视频| 91视频久久| 欧美日韩水蜜桃| 国产亚洲精品久久久久婷婷瑜伽| 亚洲精品一区二区在线看| 99国产精品视频免费观看一公开| 亚洲精品伦理| 欧美激情一区| 日韩欧美一区二区三区在线视频| 亚洲二区精品| 亚洲开心激情| 欧美成人精品午夜一区二区| 国产中文字幕一区二区三区| 欧美日韩在线观看视频小说| 蜜臀精品久久久久久蜜臀| 欧美亚洲自偷自偷| 黑人精品一区| 石原莉奈在线亚洲二区| 国产精品中文| 婷婷综合六月| 中文字幕日本一区二区| 欧美激情99| 性欧美69xoxoxoxo| 国产亚洲一区二区三区啪| 日本一区二区免费高清| 日韩一级不卡| 国产极品嫩模在线观看91精品| 欧美精品高清| 婷婷精品在线| 黑人精品一区| 午夜久久av | 美国三级日本三级久久99 | 肉色欧美久久久久久久免费看| 午夜欧美视频| 久久成人福利| 国产美女一区| 精品一区二区三区中文字幕 | 婷婷精品进入| 国产精品一区毛片| 欧美日韩一区二区三区视频播放| 日韩精品亚洲一区二区三区免费| 国产白浆在线免费观看| 亚洲乱码视频| 久久国产毛片| 国产日韩欧美一区在线| 亚洲二区三区不卡| 鲁大师精品99久久久| 国产农村妇女精品一二区| 三上亚洲一区二区| 日韩精品一页| 亚洲韩日在线| 麻豆高清免费国产一区| 视频一区国产视频| 欧美天堂视频| 日韩av一区二区三区四区| 久久精品亚洲人成影院| 国产精一区二区| 免费观看在线综合| 日韩精品dvd| 国产欧美在线| 欧美中文字幕| 欧美精品资源| 麻豆精品久久久| 日本亚州欧洲精品不卡| 激情婷婷综合| 国产一区二区三区四区五区传媒| 亚洲日本免费电影| 婷婷综合五月| 日韩欧美在线中字| 国产精品videossex久久发布 | 999国产精品永久免费视频app| 国产精品日本一区二区不卡视频 | 日韩二区在线观看| 国产精品女主播一区二区三区| 日韩av在线中文字幕| 国产精品手机在线播放| 日韩精品社区| 亚洲一区二区三区无吗| 午夜欧美精品久久久久久久| 天堂日韩电影| 色一区二区三区| 麻豆国产精品777777在线| 欧美在线精品一区| 日韩中文字幕1| 欧洲激情综合| 色爱综合av| 日韩综合精品| 日韩精品诱惑一区?区三区| 欧美经典一区| 国产免费播放一区二区| 日韩极品在线观看| 蜜臀精品久久久久久蜜臀| 亚洲尤物在线| 香蕉久久久久久久av网站| 日韩午夜av在线| 99香蕉国产精品偷在线观看 | 国产传媒在线| 精品视频高潮| 久久99蜜桃| 国产精品传媒麻豆hd| 国产乱论精品| 久久99性xxx老妇胖精品| 久久99国产精品视频| 精品一二三区| av中文字幕在线观看第一页| 亚洲一级少妇| 精品欧美久久| 91久久午夜| 日韩精品一级中文字幕精品视频免费观看 | 国产拍在线视频| 国产一区二区三区四区| 国产a亚洲精品| 日本一区二区免费高清| 日韩高清中文字幕一区二区| 欧美日韩免费看片| 国产精品av久久久久久麻豆网| 亚洲大片在线| 亚洲少妇自拍| 亚洲综合电影一区二区三区| 麻豆9191精品国产| 亚洲91网站| 国产调教精品| 欧美国产一级| 亚洲国产专区校园欧美| 美女日韩在线中文字幕| 日韩精品一区二区三区av | 少妇精品久久久| 国产乱论精品| 国产盗摄——sm在线视频| 97精品97| 激情婷婷亚洲| 亚洲v天堂v手机在线| 国产精品一区二区精品视频观看| 国产一区二区三区探花| 欧美成人久久| 亚洲精品进入| 国产一区二区三区不卡视频网站 | 亚洲成av人片一区二区密柚| 黑丝一区二区三区| 喷白浆一区二区| 久久激情综合网| 亚洲国产福利| 日韩一区二区久久| 日韩1区2区日韩1区2区| 精品五月天堂| 不卡中文一二三区| 日韩一区二区三区精品视频第3页| 久久精品99国产精品日本| 97se综合| 日韩精品一卡二卡三卡四卡无卡| 国产精品麻豆成人av电影艾秋| 福利一区和二区| 黄页网站一区| 国产精品中文| 免费不卡中文字幕在线| 日韩av午夜在线观看| 日本综合字幕| 日韩精品中文字幕一区二区| av综合电影网站| 亚洲精品黄色| 中文在线免费视频| 亚洲精品国模| 成人在线丰满少妇av| 一区二区三区四区精品视频| 国产在线观看91一区二区三区| 亚洲女人av| 国产一区二区亚洲| 亚洲人成在线影院| 欧美sss在线视频| 欧美精品三级在线| 免费不卡中文字幕在线| 国产精品一区亚洲| 久久不射网站| 中文在线中文资源| 久久黄色影视| 国产模特精品视频久久久久| 水蜜桃精品av一区二区| 蜜桃视频一区二区三区| 日韩高清中文字幕一区二区| 国产精品中文| 免费看日韩精品|