用JavaScript實現(xiàn)貪吃蛇游戲
本文實例為大家分享了JavaScript實現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
地圖
地圖:寬,高,背景顏色,因為小蛇和食物都是相對于地圖顯示的,這里小蛇和食物都是地圖的子元素,隨機(jī)位置顯示,脫離文檔流的,地圖也需要脫離文檔流relative,----css需要設(shè)置:寬,高,背景顏色,脫標(biāo)
食物—div元素
elements---->存儲div的數(shù)組(將來刪除的食物div時候,先從map中刪除div,再從數(shù)組中移除div)
食物:寬,高,背景顏色,橫坐標(biāo),縱坐標(biāo)
一個食物就是一個對象,這個對象有相應(yīng)的屬性,這個對象需要在地圖上顯示
最終要創(chuàng)建食物的對象,先有構(gòu)造函數(shù),并且把相應(yīng)的值作為參數(shù)傳入到構(gòu)造函數(shù)中
食物要想顯示在地圖上,食物的初始化就是一個行為
1、食物的構(gòu)造函數(shù)—>創(chuàng)建食物對象
2、食物的顯示的方法—>通過對象調(diào)用方法,顯示食物,設(shè)置相應(yīng)的樣式
2.1.1 因為食物要被小蛇吃掉,吃掉后應(yīng)該再次出現(xiàn)食物,原來的食物就刪除了
2.1.2 每一次初始化食物的時候先刪除原來的食物,然后重新的初始化食物
2.1.3 通過一個私有的函數(shù)(外面不能調(diào)用的函數(shù))刪除地圖上的食物,同時最開始的食物也相應(yīng)的保存到一個數(shù)組中,再從這個數(shù)組中把食物刪除
小蛇
小蛇就是一個對象
屬性:每個身體都有寬、高、方向
屬性:身體分三個部分,每個部分都是一個對象,每個部分都有橫縱坐標(biāo),背景顏色
方法:小蛇要想顯示在地圖上,先刪除之前的小蛇,然后再初始化小蛇(小蛇要移動)
移動思路:把小蛇的頭的坐標(biāo)給小蛇第一部分的身體,第一部分的身體的坐標(biāo)給下一個部分身體小蛇的頭,需要單獨的設(shè)置:方向
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .map { width: 800px; height: 600px; background-color: #ccc; position: relative; } </style> </head> <body> <div class="map"></div> <script src="貪吃蛇案例.js"></script> </body> </html>
js
//自調(diào)用函數(shù)--食物 (function () { var elements = [];//用來保存每個小方塊元素 //創(chuàng)建小方塊對象,需要先構(gòu)造函數(shù) 小方塊有寬高顏色 橫縱坐標(biāo)屬性 function Food(x, y, width, height, color) { //小方塊的橫縱坐標(biāo) this.x = x || 0; this.y = y || 0; //小方塊的寬高顏色 this.width = width || 20; this.height = height || 20; this.color = color || 'green'; } //為原型添加初始化的方法(作用:在頁面上顯示食物) //因為食物要在地圖上顯示這個食物,所以需要地圖這個參數(shù)(map--就是class=“.map”這個div) Food.prototype.init = function (map) { //先刪除這個小食物 //外部無法訪問到這個函數(shù) remove(); //創(chuàng)建div(即小方塊) var div = document.createElement("div"); //把div添加到地圖中 map.appendChild(div); //設(shè)置div的樣式 div.style.width = this.width + 'px'; div.style.height = this.height + 'px'; div.style.backgroundColor = this.color; //橫縱坐標(biāo)需要隨機(jī)產(chǎn)生 在這先停止 //使div小方塊脫離文檔流 div.style.position = 'absolute'; //隨機(jī)產(chǎn)生橫縱坐標(biāo) this.x = parseInt(Math.random() * (map.offsetWidth / this.width)) * this.width; this.y = parseInt(Math.random() * (map.offsetHeight / this.height)) * this.height; div.style.left = this.x + 'px'; div.style.top = this.y + 'px'; //把div加到數(shù)組elements中 elements.push(div); }; //私有的函數(shù)---刪除食物 function remove() { for (var i = 0; i < elements.length; i++) { var ele = elements[i]; //找到子元素的父元素,刪除這個子元素 ele.parentNode.removeChild(ele); // 再次把elements中的子元素刪除 elements.splice(0, 1);//從0位置開始刪除1個 } } //把food暴露給頂級對象,外部可以使用 window.Food = Food; }()); //自調(diào)用函數(shù)--小蛇 (function () { //放小蛇的每個部分 var elements = []; //創(chuàng)建小蛇的構(gòu)造函數(shù) function Snake(width, height, direction) { //小蛇每個部分的寬和高 this.width = width || 20; this.height = height || 20; //小蛇的身體 this.body = [ {x: 3, y: 2, color: 'red'}, {x: 2, y: 2, color: 'orange'}, {x: 1, y: 2, color: 'orange'} ]; //小蛇移動的方向 this.direction = direction || 'right'; //為原型添加初始化方法 Snake.prototype.init = function (map) { //初始化前先刪除原來的小蛇 remove(); //循環(huán)遍歷創(chuàng)建div for (var i = 0; i < this.body.length; i++) { //數(shù)組中的每個元素都是數(shù)組對象 var obj = this.body[i]; //創(chuàng)建div var div = document.createElement('div'); //把div添加到地圖上 map.appendChild(div); //設(shè)置div的樣式 div.style.position = 'absolute'; div.style.width = this.width + 'px'; div.style.height = this.height + 'px'; //橫縱坐標(biāo) div.style.left = obj.x * this.width + 'px'; div.style.top = obj.y * this.height + 'px'; //小蛇每個部分的顏色 div.style.backgroundColor = obj.color; //把小蛇每部分加到數(shù)組中 elements.push(div); } }; //為小蛇添加原型方法使小蛇移動 Snake.prototype.move = function (food, map) { //先改變小蛇身體移動的位置 var i = this.body.length - 1;//2 for (; i > 0; i--) { //i>0 就不包括頭部 this.body[i].x = this.body[i - 1].x;//讓第三部分身體的橫坐標(biāo)等于第二部分身體的橫坐標(biāo) this.body[i].y = this.body[i - 1].y;//讓第三部分身體的縱坐標(biāo)等于第二部分身體的縱坐標(biāo) } //判斷方向--改變小蛇頭部的方向 switch (this.direction) { case 'right': this.body[0].x += 1; break; case 'left': this.body[0].x -= 1; break; case 'top': this.body[0].y -= 1; break; case 'bottom': this.body[0].y += 1; break; } //判斷有沒有吃到食物 // 獲取小蛇的頭和食物的坐標(biāo)一致 var headX=this.body[0].x*this.width; var headY=this.body[0].y*this.height; //判斷小蛇的頭和食物的坐標(biāo)是否相同 if(headX==food.x&&headY==food.y){ //獲取小蛇的尾部 var last=this.body[this.body.length-1]; //把最后一個尾巴復(fù)制加到body最后 this.body.push({ x:last.x, y:last.y, color:last.color }); //把食物刪除,重新初始化食物 food.init(map); } }; //刪除小蛇的私有函數(shù) function remove() { //獲取數(shù)組 var i = elements.length - 1; for (; i >= 0; i--) { //先從當(dāng)前的子元素中找到該元素的父即元素,然后在刪除這個子元素 (i>=0因為包括頭部) var ele = elements[i]; //從map地圖上刪除這個子元素 ele.parentNode.removeChild(ele); //再刪除數(shù)組中的每個元素 elements.splice(i, 1); } } } //把Snake暴露給window window.Snake = Snake; }()); //自調(diào)用函數(shù)--游戲?qū)ο? (function () { var that = null; //游戲的構(gòu)造函數(shù) function Game(map) { this.food = new Food();//食物對象 this.snake = new Snake();//小蛇對象 this.map = map;//地圖對象 that = this; } //原型對象添加游戲初始化方法 Game.prototype.init = function () { this.food.init(this.map);//食物初始化 this.snake.init(this.map);//初始化小蛇 //調(diào)用自動移動小蛇的方法 this.runSnake(this.food, this.map); //小蛇移動后調(diào)用鍵盤方法 this.bindKey(); }; //原型對象添加小蛇自動移動的方法 Game.prototype.runSnake = function (food, map) { //自動的去移動 //這里的this指向window var timeID = setInterval(function () { //移動小蛇 this.snake.move(food, map); //初始化小蛇 this.snake.init(map); //橫坐標(biāo)的最大值 var maxX = map.offsetWidth / this.snake.width; //縱坐標(biāo)的最大值 var maxY = map.offsetHeight / this.snake.height; //小蛇的頭部的坐標(biāo) var headX = this.snake.body[0].x; var headY = this.snake.body[0].y; if (headX < 0 || headX >= maxX) { clearInterval(timeID); alert('游戲結(jié)束') } if (headY < 0 || headY >= maxY) { clearInterval(timeID); alert('游戲結(jié)束') } }.bind(that), 150) }; //原型對象--設(shè)置用戶按鍵,是小蛇方向改變 Game.prototype.bindKey=function(){ //獲取用戶的按鍵,改變小蛇的方向 document.addEventListener('keydown',function(e){ //這里的this應(yīng)該是觸發(fā)keydown的事件對象---document //所以這里的this指的是document switch(e.keyCode){ case 37:this.snake.direction='left';break; case 38:this.snake.direction='top';break; case 39:this.snake.direction='right';break; case 40:this.snake.direction='bottom';break; } }.bind(that),false) }; window.Game = Game; }()); //實例化游戲?qū)ο? var gm = new Game(document.querySelector('.map')); //初始化開始游戲 gm.init(); //實例化食物對象 // var fd = new Food(); // var map = document.querySelector('.map'); // fd.init(map); // //實例化小蛇對象 // var snake = new Snake(); // snake.init(map);//先在地圖上看到小蛇 // setInterval(function () { // snake.init(map); // snake.move(fd, map); // }, 150); // snake.init(map);//先在地圖上看到小蛇 // snake.move(fd,map);//走一步 // snake.init(map);//初始化--重新畫一條小蛇(把之前的小蛇先刪除,再把現(xiàn)在得小蛇顯示出來)
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用JavaScript獲取掃碼槍掃描得到的條形碼的思路代碼詳解
這篇文章主要介紹了使用JavaScript獲取掃碼槍掃描得到的條形碼的思路代碼詳解,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06JavaScript浮點數(shù)及運算精度調(diào)整詳解
浮點數(shù)的精度問題不是JavaScript特有的,本文主要介紹了JavaScript浮點數(shù)及運算精度調(diào)整詳解,有需要的朋友可以了解一下。2016-10-10JavaScript 中的 `==` 和 `===` 操作符詳解
在 JavaScript 中,== 和 === 是兩個常用的比較操作符,分別用于 寬松相等(類型轉(zhuǎn)換相等) 和 嚴(yán)格相等(類型和值必須相等) 的比較,理解它們的區(qū)別以及具體的比較規(guī)則對于編寫準(zhǔn)確和高效的代碼至關(guān)重要,需要的朋友可以參考下2024-09-09用js模擬JQuery的show與hide動畫函數(shù)代碼
用javascript實現(xiàn)的模擬jquery下的顯示與隱藏的動畫效果,學(xué)習(xí)的朋友可以參考下。2010-09-09js實現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的三種方式
Blob對象表示一個不可變、原始數(shù)據(jù)的類文件對象,Blob表示的不一定是JavaScript原生格式的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于js實現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的三種方式,需要的朋友可以參考下2023-04-04