JavaScript貪吃蛇的實(shí)現(xiàn)代碼
本文實(shí)例為大家分享了JavaScript實(shí)現(xiàn)貪吃蛇的具體代碼,供大家參考,具體內(nèi)容如下
首先我們要確定貪吃蛇應(yīng)有的功能
1.通過(guò)鍵盤(pán)的上下左右控制蛇的移動(dòng)方向
2.邊界判定,即蛇頭超出邊界則游戲結(jié)束
3.碰撞判定,即蛇頭和食物塊發(fā)生觸碰
4.吃到食物積分加1
具體實(shí)現(xiàn)
一.html代碼
<div class="container">
<!--小蛇移動(dòng)的操場(chǎng)-->
<div id="playground">
<!--小蛇-->
<div id="snake"></div>
<!--食物-->
<div id="food"></div>
</div>
<!--記錄得分-->
<div id="menu">
<div>得分<span id="score"></span></div>
</div>
</div>
二.css代碼
<style>
* {
padding: 0;
margin: 0;
}
.container {
width: 800px;
height: 600px;
margin: 0 auto;
}
#playground {
width: 650px;
height: 100%;
background-color: cadetblue;
float: left;
position: relative;
}
#menu {
width: 150px;
height: 100%;
background-color: darkcyan;
float: left;
}
#snake {
width: 20px;
height: 20px;
background-color: #d3e0d7;
position: absolute;
left: 0;
top: 0;
}
#food {
width: 20px;
height: 20px;
background-color: #027766;
position: absolute;
}
.body {
width: 20px;
height: 20px;
background-color: #178b9a;
position: absolute;
;
top: 0;
left: 0;
}
#score {
font-size: 30px;
font-weight: bold;
color: black;
}
#menu div {
font-size: 20px;
font-weight: bold;
margin-left: 20px;
}
#hqx {
width: 100px;
height: 50px;
margin: 0 auto;
}
#inp {
border: 0;
width: 100px;
height: 50px;
background-color: coral;
}
</style>
三.開(kāi)始實(shí)現(xiàn)具體功能
1.先獲取節(jié)點(diǎn),設(shè)置全局變量
//獲取節(jié)點(diǎn)
var snake = document.getElementById("snake");
var food = document.getElementById("food");
var playground = document.getElementById("playground");
var score = document.getElementById('score');
// var inp = document.getElementById('inp')
/*設(shè)置全局變量*/
var timer;
var arr = []; //存放蛇的位置的數(shù)組
var num = 0; //數(shù)組的長(zhǎng)度
var snakeBody; //每次吃調(diào)一個(gè)食物,增加的身體
2.設(shè)置按鍵事件,并判斷邊界碰撞,碰撞時(shí)游戲結(jié)束。這一塊代碼我遇到了一個(gè)問(wèn)題,就是當(dāng)我用if(){return}跳出事件,會(huì)結(jié)束所有代碼,后面的代碼就不會(huì)執(zhí)行了,然后我換成了switch(){ case: break;}就實(shí)現(xiàn)效果了
//設(shè)置按鍵事件
document.onkeydown = function (e) {
var evt = window.evnet || e;
switch (evt.keyCode) {
case 37: //左
clearInterval(timer);
timer = window.setInterval(runLeft, 10); //向左移動(dòng)的時(shí)間器
function runLeft() {
if (snake.offsetLeft > 0) {
snake.style.left = snake.offsetLeft - 1 + 'px'; //實(shí)現(xiàn)自己動(dòng)
snake.style.top = snake.offsetTop + 'px'; //高度不變
arr.push([snake.offsetLeft, snake.offsetTop]); //每移動(dòng)1px,就將位置存進(jìn)數(shù)組中
num++; //相應(yīng)的數(shù)組長(zhǎng)度加1
} else {
clearInterval(timer); //清除定時(shí)器
alert('you die') //彈出失敗信息
document.onkeydown = null //結(jié)束按鍵
}
}
break; //結(jié)束當(dāng)前按鍵
case 38: //上
clearInterval(timer);
timer = window.setInterval(runTop, 10);
function runTop() {
if (snake.offsetTop > 0) {
snake.style.top = snake.offsetTop - 1 + 'px';
snake.style.left = snake.offsetLeft + 'px';
arr.push([snake.offsetLeft, snake.offsetTop]);
num++;
} else {
clearInterval(timer);
alert('you die')
document.onkeydown = null
}
}
break;
case 39: //右
clearInterval(timer);
timer = window.setInterval(runRight, 10);
function runRight() {
if (snake.offsetLeft < 630) {
snake.style.left = snake.offsetLeft + 1 + 'px';
snake.style.top = snake.offsetTop + 'px';
arr.push([snake.offsetLeft, snake.offsetTop]);
num++;
} else {
clearInterval(timer);
alert('you die')
document.onkeydown = null
}
}
break;
case 40: //下
clearInterval(timer);
timer = window.setInterval(runBottom, 10);
function runBottom() {
if (snake.offsetTop < 580) {
snake.style.top = snake.offsetTop + 1 + 'px';
snake.style.left = snake.offsetLeft + 'px';
arr.push([snake.offsetLeft, snake.offsetTop]);
num++;
} else {
clearInterval(timer);
alert('you die')
document.onkeydown = null
}
}
break;
}
3.封裝一個(gè)函數(shù),隨機(jī)生成食物位置,第一次粗心忘記加單位,看網(wǎng)頁(yè)沒(méi)效果,才知道忘記加單位了
function pos() {
food.style.left = parseInt(Math.random() * 630) + 'px';
food.style.top = parseInt(Math.random() * 580) + 'px';
}
4.封裝一個(gè)碰撞判定函數(shù),使其碰撞時(shí),食物消失,蛇的身體增加一塊。這里遇到一個(gè)定時(shí)器問(wèn)題,第一次寫(xiě)的時(shí)候,我的定時(shí)器清除標(biāo)識(shí)和之前的定時(shí)器標(biāo)識(shí)一致,導(dǎo)致蛇會(huì)上下左右抖動(dòng),經(jīng)過(guò)后面不停的修改,最終找到錯(cuò)誤。
var timer1 = setInterval(eat, 10); //設(shè)置一個(gè)碰撞的時(shí)間器
function eat() {
snakeCrashFood(snake, food); //傳入?yún)?shù)
function snakeCrashFood(obj1, obj2) {
var obj1Left = obj1.offsetLeft;
var obj1Width = obj1.offsetWidth + obj1.offsetLeft;
var obj1Top = obj1.offsetTop;
var obj1Height = obj1.offsetHeight + obj1.offsetTop;
var obj2Left = obj2.offsetLeft;
var obj2Width = obj2.offsetWidth + obj2.offsetLeft;
var obj2Top = obj2.offsetTop;
var obj2Height = obj2.offsetHeight + obj2.offsetTop;
if (!((obj1Width < obj2Left) || (obj2Width < obj1Left) || (obj1Height < obj2Top) || (
obj2Height < obj1Top))) {
snakeBody = document.createElement("div"); //生成新的div
snakeBody.setAttribute("class", "body"); //給新的div添加類名
playground.appendChild(snakeBody); //添加一節(jié)新的身體
pos(); //讓食物重新隨機(jī)出現(xiàn)
setInterval(follow, 10); //動(dòng)態(tài)地改變新的身體的位置
}
}
}
5.設(shè)置蛇的身體跟隨,獲得蛇身體的數(shù)組,新的身體相對(duì)于上一個(gè)身體的第20個(gè)數(shù)組的位置。這里我遇到了一個(gè)數(shù)組越界問(wèn)題。最開(kāi)始初始num值為0,place=20,所以第一次身體的增加arr[num-place][0]前面的索引是從負(fù)數(shù)開(kāi)始,在通過(guò)老師的指導(dǎo),增加一個(gè)判定,解決了這個(gè)問(wèn)題。
function follow() {
/*獲得增加的身體的數(shù)組*/
var bodyNum = document.getElementsByClassName("body");
score.innerHTML = bodyNum.length;
var place = 0;
/*數(shù)組每移動(dòng)1px,新的身體的位置就是相對(duì)于前一個(gè)身體的第20個(gè)數(shù)組的位置,后面依次加等*/
// console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")
// console.log("arr : ==" + arr)
// console.log("num : ==" + num) //2
for (var i = 0; i < bodyNum.length; i++) {
// console.log("bodyNum.length : ==" + bodyNum.length)
place += 20;
// console.log("place : ==" + place)//20
// console.log("num - place : ==" + (num - place))//-18
// bodyNum[i].style.left = arr[num - place][0] + 'px';
// bodyNum[i].style.top = arr[num - place][1] + 'px';
if (num - place > 0) {
bodyNum[i].style.left = arr[num - place][0] + 'px';
bodyNum[i].style.top = arr[num - place][1] + 'px';
}
}
// console.log("num555 : ==" + num)
// console.log("===========================================")
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript 判斷一個(gè)對(duì)象為數(shù)組的方法
這篇文章主要介紹了javascript 判斷一個(gè)對(duì)象為數(shù)組的方法的相關(guān)資料,需要的朋友可以參考下2017-05-05
一個(gè)報(bào)數(shù)游戲js版(約瑟夫環(huán)問(wèn)題)
隨便給一個(gè)數(shù) 比如100,那么從1到100圍成一個(gè)圓圈,然后就類似123123報(bào)數(shù)一樣逢3就舍掉,一直這樣輪詢 那么最后剩下來(lái)的那個(gè)數(shù)是多少?2010-08-08
js實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
完美解決IE9瀏覽器出現(xiàn)的對(duì)象未定義問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決IE9瀏覽器出現(xiàn)的對(duì)象未定義問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-09-09
針對(duì)JavaScript中this指向的簡(jiǎn)單理解
這篇文章主要為大家詳細(xì)JavaScript中this指向的簡(jiǎn)單理解,感興趣的小伙伴們可以參考一下2016-08-08
javascript 3d 逐偵產(chǎn)品展示(核心精簡(jiǎn))
這篇文章主要介紹了javascript實(shí)現(xiàn)的3d逐偵產(chǎn)品展示,需要的朋友可以參考下2014-03-03

