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

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

javascript實現(xiàn)貪吃蛇經(jīng)典游戲

瀏覽:25日期:2023-06-22 11:13:27

js面向?qū)ο缶幊讨澇陨撸┐蠹覅⒖迹唧w內(nèi)容如下

首先:面向?qū)ο缶幊蹋覀円业巾椖恐芯唧w的對象,此處為(食物(food),蛇(snake),游戲本身(game))也可不把游戲本身作為對象,邏輯體現(xiàn)出來即可。

接著分析每個對象的具體的屬性及方法:1)food 對象:屬性有:位置,大小,顏色;方法有:渲染在頁面,隨機不同位置生成;2)snake對象:屬性有:位置,大小,總節(jié)數(shù)(計分方便),顏色;方法有:渲染在頁面,移動(移動過程中判斷其它)。3)game對象:游戲邏輯的編寫;

ok 開敲:

1)簡單的靜態(tài)頁面編寫(地圖)

(1)html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <link rel='stylesheet' href='http://www.b3g6.com/bcjs/css/index.css' > <script src='http://www.b3g6.com/bcjs/js/food.js'></script> <script src='http://www.b3g6.com/bcjs/js/snake.js'></script> <script src='http://www.b3g6.com/bcjs/js/game.js'></script> <script src='http://www.b3g6.com/bcjs/js/main.js'></script> <title>貪吃蛇</title></head><body> <div class='map'></div></body></html>

(2)css(如果用邊框來作為限制的邊界,那么box-sizing屬性是必不可少的(以免食物和蛇頭坐標(biāo)之間存在誤差))

* { margin: 0; padding: 0;}.map { position: relative; height: 600px; width: 800px; border: 1px solid #333; margin: 0 auto; /* 盒子模型去除邊框 */ box-sizing: border-box;}

2)food對象編寫(細節(jié)處含注釋)

//cwen加載頁面所有元素window.addEventListener(’load’, function() { //cwen自調(diào)用函數(shù),開啟一個新的作用域,避免命名沖突 (function() { //cwen定義全局變量 //實物數(shù)組 var elements = []; //cwen實物 function Food(options) { options = options || {}; this.x = options.x || 0; this.y = options.y || 0; this.width = options.width || 20; this.height = options.height || 20; this.color = options.color || ’yellow’; } //cwen隨機數(shù)函數(shù) function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } //cwen渲染 Food.prototype.render = function(map) { //刪除之前的食物 remove(); //todo動態(tài)創(chuàng)建div實物 var div = document.createElement(’div’); map.appendChild(div); //把div添加給數(shù)組 elements.push(div); //todo隨機設(shè)置x,y的值(實物的位置)-----在map中生成隨機位置 // ! 值 = Math.floor(Math.random() * 可能值得總數(shù) + 第一個可能的值) this.x = getRandom(0, map.offsetWidth / this.width - 1) * this.width; this.y = getRandom(0, map.offsetHeight / this.height - 1) * this.height; div.style.position = ’absolute’; div.style.left = this.x + ’px’; div.style.top = this.y + ’px’; div.style.width = this.width + ’px’; div.style.height = this.height + ’px’; div.style.backgroundColor = this.color; } function remove() { //為了刪除干凈,從索引最大的開始循環(huán)刪除 for (var i = elements.length - 1; i >= 0; i--) { //刪除遍歷到的div elements[i].parentNode.removeChild(elements[i]); //刪除數(shù)組中的元素1)第幾個開始,2)要刪除個數(shù) elements.splice(i, 1); } } //把Food開放出去 window.Food = Food; })() //cwen測試 // var map = document.querySelector(’.map’); // var options = { x: 20, y: 20, width: 30, height: 30, color: ’green’ }; // //todo不傳值默認為自定義food // var food = new Food(); // food.render(map);})

3)snake對象編寫()

window.addEventListener(’load’, function() { (function() { //記錄蛇的每一節(jié) var elements = []; //cwen立即執(zhí)行函數(shù),開啟新的作用于,避免命名沖突 function Snake(options) { options = options || {}; //對象(蛇)每節(jié)的大小 this.width = options.width || 20; this.height = options.height || 20; //cwen蛇的總節(jié)數(shù)(計分) this.mark = options.mark || 0; //對象的移動方向 this.direction = options.direction || ’right’; //對象的身體(蛇節(jié)) this.kont = [{ x: 3, y: 2, color: ’red’ }, { x: 2, y: 2, color: ’black’ }, { x: 1, y: 2, color: ’black’ }]; } //cwen渲染對象 Snake.prototype.render = function(map) { //移除之前的蛇 remove(); //循環(huán)輸出對象的身體(蛇節(jié)) for (var i = 0, len = this.kont.length; i < len; i++) { var obj = this.kont[i]; var div = document.createElement(’div’); map.appendChild(div); //將蛇節(jié)添加入數(shù)組 elements.push(div); //添加樣式 div.style.position = ’absolute’; div.style.width = this.width + ’px’; div.style.height = this.height + ’px’; div.style.left = obj.x * this.width + ’px’; div.style.top = obj.y * this.height + ’px’; div.style.backgroundColor = obj.color; } } //cwen控制蛇移動的方法 //todo傳參food,map 在game中調(diào)用move方法也要傳入相應(yīng)參數(shù) Snake.prototype.move = function(food, map) { //控制蛇節(jié)的移動(當(dāng)前蛇節(jié)到下一個蛇節(jié)的位置) for (var i = this.kont.length - 1; i > 0; i--) { this.kont[i].x = this.kont[i - 1].x; this.kont[i].y = this.kont[i - 1].y; } //判斷并控制蛇頭移動,判斷蛇頭移動方向 var head = this.kont[0]; switch (this.direction) { case ’right’: head.x += 1; break; case ’left’: head.x -= 1; break; case ’top’: head.y -= 1; break; case ’bottom’: head.y += 1; break; } //蛇頭碰到食物時處理 // cwen判斷蛇頭是否和食物坐標(biāo)重合 var headX = head.x * this.width; var headY = head.y * this.height; if (headX == food.x && headY == food.y) { //1,增加蛇節(jié)(找到最后一根蛇節(jié),然后添加給創(chuàng)建的蛇數(shù)組) var last = this.kont[this.kont.length - 1]; this.kont.push({ x: last.x, y: last.y, color: last.color }); //cwen求出蛇節(jié)的總個數(shù)(計分) var mark = this.mark++; //2,重新渲染食物 food.render(map); } } //刪除之前的蛇 function remove() { for (var i = elements.length - 1; i >= 0; i--) { elements[i].parentNode.removeChild(elements[i]); elements.splice(i, 1); } } //把Snake構(gòu)造函數(shù)暴露出去 window.Snake = Snake; })() //測試 // var map = document.querySelector(’.map’); // var snake = new Snake(); // snake.render(map);})

4)game對象編寫,其中一個為無敵版(含細節(jié)注釋)

window.addEventListener(’load’, function() { (function() { //改變計時器內(nèi)this指向 var that; function Game(map) { // var options = { x: 20, y: 20, width: 30, height: 30, color: ’green’ }; this.food = new Food(); this.snake = new Snake(); this.map = map; that = this; } //cwen渲染 Game.prototype.start = function() { // 1.把食物和蛇渲染到頁面 this.food.render(this.map); this.snake.render(this.map); // 2.游戲邏輯編寫 //讓蛇動起來 //判斷地圖邊界 // runSnake(); //todo判斷玩法(兩種模式,原理一樣) goInput(); //通過鍵盤控制蛇頭方向 //! keydown(); //蛇頭碰到食物時處理 //在snake.js中判斷 } function goInput() { var it = prompt(’try:n 經(jīng)典玩法請按1n 無敵玩法請輸入(博主最帥)n’) if (it == 1) { runSnake(); keydown(); } else if (it == ’博主最帥’) { runSnake1(); keydown1(); } else { alert(’you input could not be found!!!’); goInput(); } } //讓蛇動起來 function runSnake() { var timeId = setInterval(function() { // var a = mark; that.snake.move(that.food, that.map); that.snake.render(that.map); //判斷地圖邊界 var maxX = (that.map.offsetWidth) / that.snake.width; var maxY = (that.map.offsetHeight) / that.snake.height; var headX = that.snake.kont[0].x; var headY = that.snake.kont[0].y; if (headX < 0 || headX >= maxX) { alert(’Game Over ’ + ’得分為 ’ + that.snake.mark); clearInterval(timeId); } else if (headY < 0 || headY >= maxY) { alert(’Game Over ’ + ’成績?yōu)?’ + that.snake.mark); clearInterval(timeId); } }, 150) } //無敵版本蛇運動 function runSnake1() { var timeId1 = setInterval(function() { that.snake.move(that.food, that.map); that.snake.render(that.map); //判斷地圖邊界 var maxX = (that.map.offsetWidth - that.snake.width) / that.snake.width; var maxY = (that.map.offsetHeight - that.snake.height) / that.snake.height; var headX = that.snake.kont[0].x; var headY = that.snake.kont[0].y; if (headX < 0) { that.snake.kont[0].x = (that.map.offsetWidth - that.snake.width) / that.snake.width; } else if (headX > maxX) { that.snake.kont[0].x = 0; } else if (headY < 0) { that.snake.kont[0].y = (that.map.offsetHeight - that.snake.height) / that.snake.height; } else if (headY > maxY) { that.snake.kont[0].y = 0; } }, 50) } //通過鍵盤控制蛇頭方向 function keydown() { document.addEventListener(’keydown’, function(e) { //通過事件對象判斷按了哪個鍵 37left,38top,39right,40bottom // console.log(e.keyCode); //其在走的同時按下反方向無用 if (e.keyCode == 37 && that.snake.direction != ’right’) { that.snake.direction = ’left’; } else if (e.keyCode == 38 && that.snake.direction != ’bottom’) { that.snake.direction = ’top’; } else if (e.keyCode == 39 && that.snake.direction != ’left’) { that.snake.direction = ’right’; } else if (e.keyCode == 40 && that.snake.direction != ’top’) { that.snake.direction = ’bottom’; } }); } function keydown1() { document.addEventListener(’keydown’, function(e) { //通過事件對象判斷按了哪個鍵 37left,38top,39right,40bottom // console.log(e.keyCode); //無敵版本四面八方任你行 if (e.keyCode == 37) { that.snake.direction = ’left’; } else if (e.keyCode == 38) { that.snake.direction = ’top’; } else if (e.keyCode == 39) { that.snake.direction = ’right’; } else if (e.keyCode == 40) { that.snake.direction = ’bottom’; } }); } //把Game開放 window.Game = Game; })()})

5)main開啟游戲

window.addEventListener(’load’, function() { (function(window, undefind) { //測試 var map = document.querySelector(’.map’); var game = new Game(map); game.start(); })(window, undefined)})

last but not least*建議把所有js文件寫在同一個js文件中,可以大大提高加載速度。注意在每個立即執(zhí)行函數(shù)前加上‘ ;’,以免出錯。

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

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

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91成人福利| 久久久久久久久久久9不雅视频| 91精品亚洲| 久久久久久久久99精品大| 亚洲视频综合| 中文字幕亚洲影视| 国产精品久久久免费| 97精品97| 日韩一级精品| 91福利精品在线观看| 国产精品色在线网站| 国产精品久久久久久久免费观看| 九色porny丨国产首页在线| 国内亚洲精品| 日韩欧美中文| 视频一区中文字幕国产| 国产精品啊啊啊| 久久九九精品| 天堂久久av| 亚州国产精品| 黄毛片在线观看| 免费在线欧美视频| 麻豆91精品91久久久的内涵| 国产精品99一区二区| 日韩中文字幕在线一区| 国产精品亚洲产品| 99精品视频精品精品视频| 亚洲麻豆一区| 国产精品入口久久| 久久精品72免费观看| 欧美激情另类| 天堂va蜜桃一区二区三区| 久久成人一区| 美女国产精品久久久| 伊人久久av| 精品91久久久久| 麻豆精品av| 午夜国产一区二区| 日本综合视频| 国产字幕视频一区二区| 久久精品xxxxx| 激情综合网站| 精品理论电影在线| 日本 国产 欧美色综合| 欧美片网站免费| 五月综合激情| 91综合视频| 欧美日韩亚洲三区| 久久不射中文字幕| 九色porny丨国产首页在线| 国产视频一区二| 亚洲综合电影一区二区三区| 中文字幕在线看片| 国产欧美激情| 亚洲天堂一区二区| 久久精品999| 好吊一区二区三区| 精品三级av| 亚洲a级精品| 久久av中文| 欧美一区在线观看视频| 免费视频一区二区| 国产一区久久| 美女视频黄免费的久久| 亚州欧美在线| 国产网站在线| 久久不见久久见免费视频7 | 丝袜诱惑制服诱惑色一区在线观看| 日韩综合在线| 国际精品欧美精品| 国产精品久久乐| 亚洲三级视频| 亚洲涩涩在线| 日韩欧美高清一区二区三区| 欧美成人亚洲| 日韩在线视频精品| 成人综合一区| 国产日韩欧美一区二区三区 | 日本成人手机在线| 亚洲一区导航| 热久久久久久久| 亚洲午夜一级| 国产综合婷婷| 欧美精品自拍| 夜久久久久久| 另类av一区二区| 欧美va亚洲va日韩∨a综合色| 日本精品影院| 久久视频精品| 亚洲免费黄色| 中文字幕中文字幕精品| 在线看片日韩| 日韩av中文字幕一区二区| 亚洲麻豆一区| 亚洲精品第一| 91大神在线观看线路一区| 中文字幕日韩高清在线| 日本成人中文字幕| 欧美视频久久| 久久久91麻豆精品国产一区| 色婷婷综合网| 久久久影院免费| 国产精品嫩草99av在线| 亚洲精品护士| 国产毛片精品| 免费观看亚洲| 亚洲欧洲另类| 日韩精品第二页| 久久久国产精品网站| 久久久男人天堂| 亚洲二区三区不卡| 亚洲欧美不卡| 国产亚洲欧美日韩在线观看一区二区| 国产精品啊v在线| sm捆绑调教国产免费网站在线观看 | 久久精品国产久精国产| 天堂√8在线中文| 午夜av一区| 亚洲3区在线| 久久免费精品| 不卡视频在线| 日韩高清欧美激情| 精品久久在线| 久久精品主播| 欧美精品一区二区久久| 日韩成人精品一区二区三区| 国产精品二区不卡| 尤物网精品视频| 国产欧美日韩一区二区三区四区| 国产在线视频欧美一区| 日韩午夜黄色| 国产精品伦一区二区| 久久九九精品| 日韩福利视频一区| 日韩一区二区三区免费| 免费成人av在线播放| 欧美国产精品| 国产精品日本| 久久精品国产一区二区| 日韩美女一区二区三区在线观看| 美女精品一区| 福利一区二区三区视频在线观看| 在线亚洲激情| 精品国产成人| 亚洲我射av| 精品捆绑调教一区二区三区 | 久久亚洲一区| 国产videos久久| 亚洲制服欧美另类| 日韩久久精品网| 欧美午夜三级| 黄色av日韩| 国产日韩高清一区二区三区在线| 久久精品青草| 久久久久黄色| 中文字幕av亚洲精品一部二部| 中国字幕a在线看韩国电影| 婷婷五月色综合香五月| 99精品视频精品精品视频| 久久99久久人婷婷精品综合| 日本欧美在线看| 欧美亚洲在线日韩| 久久一区视频| 91欧美极品| 国产毛片久久| 日韩av免费| 精品一区二区三区免费看| 尹人成人综合网| 日韩欧美一区二区三区免费看| 国产精品欧美一区二区三区不卡 | 日韩精品首页| 精品伊人久久久| 欧美一区久久| 在线精品视频一区| 亚洲精品国产偷自在线观看| 久久久久久夜| 老鸭窝一区二区久久精品| 青青草伊人久久| 美女被久久久| 亚洲大全视频| 精品日韩一区| 国产免费av国片精品草莓男男| 免费的成人av| 午夜亚洲福利在线老司机| 99久久九九| 日韩网站中文字幕| 国产99在线| 国产在线看片免费视频在线观看| 国产精品激情电影| 欧美日韩精品一区二区三区视频| 中文字幕视频精品一区二区三区| 成人av动漫在线观看| 欧美日韩在线二区| 欧美日韩尤物久久| 国产传媒av在线| 久久中文字幕一区二区三区| 四虎8848精品成人免费网站| 伊人精品视频| 特黄毛片在线观看| 国产成人精品一区二区三区免费|