摘要:將應(yīng)用抽象成一個(gè)對(duì)象。地圖使用一個(gè)二維數(shù)組作為結(jié)構(gòu)。生成食物的范圍。蛇碰到墻壁計(jì)算出穿過(guò)墻的范圍蛇碰到自己的身體蛇吃到食物,長(zhǎng)度加一并生成新的食物監(jiān)聽(tīng)鍵盤(pán)事件。對(duì)上下左右移動(dòng)做出反應(yīng)。
需求分析
生成地圖。
將應(yīng)用抽象成一個(gè)對(duì)象。
地圖使用一個(gè)二維數(shù)組作為結(jié)構(gòu)。
生成食物。
生成食物的范圍。
食物不能和身體生成位置重合。
生成蛇,開(kāi)始移動(dòng)。
蛇碰到墻壁,計(jì)算出穿過(guò)墻的范圍.
蛇碰到自己的身體,Game Over .
蛇吃到食物,長(zhǎng)度加一,并生成新的食物
監(jiān)聽(tīng)鍵盤(pán)事件。
對(duì)上下左右移動(dòng)做出反應(yīng)。
代碼實(shí)現(xiàn)(也可以查看 github ) html (index.html)css (./style/index.css)Document
* { margin: 0; padding: 0; } .wrap{ display: flex; justify-content: center; align-content: center; } #container{ width: 100%; text-align: center; } #container div{ /* width: 20px; height: 20px; */ float: left; border: 1px solid #000; }js(./js/index.js)
(function(self){ function GreedySnake(gridXN,gridYN){ // 地圖 this.gridXN = gridXN >= 10 ? gridXN : 10; this.gridYN = gridYN >= 10 ? gridYN : 10; this.gridSize = 20; //每個(gè)格子的固定大小 this.map = []; //保存地圖中dom對(duì)象的二維數(shù)組 this.container = document.getElementById("container"); // 食物屬性 this.food = null; this.foodX = null; this.foodY = null; // 蛇 this.snake = [];//將蛇抽象成一個(gè)二維列表,列為身體長(zhǎng)度,排為坐標(biāo)數(shù)組 this.snakeLen = null ; //默認(rèn)蛇長(zhǎng)為3 // 初始蛇頭坐標(biāo) this.snakeHead = [] // 蛇的移動(dòng)方向 this.direction = "top" // 速度 this.speed = 1 ; this.timer = null } GreedySnake.prototype.init = function(){ this.initMap(); this.createSnake(); this.createFood(); this.snakeMove() this.listenKeyBoardEvents() } GreedySnake.prototype.restart = function(gridXN,gridYN){ // 地圖 this.gridXN = null this.gridYN = null this.gridSize = null this.map = null this.container = null // 食物屬性 this.food = null; this.foodX = null; this.foodY = null; // 蛇 this.snake = null; this.snakeLen = null; // 初始蛇頭坐標(biāo) this.snakeHead = null; // 蛇的移動(dòng)方向 this.direction = null; // 速度 this.speed = null; } // 初始化地圖 GreedySnake.prototype.initMap = function(){ var gridYN = this.gridYN, gridXN = this.gridXN, w = gridXN * this.gridSize + gridXN + 1 , h = gridYN * this.gridSize + gridYN + 1; this.container.style.width = w + "px"; this.container.style.height = h + "px"; for(let y = 0 ; y < gridXN ; y++){ this.map[y] = [] //初始化二維數(shù)組 for(let x = 0 ; x < gridYN ; x++){ this.createGrid(x,y) } } } // 創(chuàng)建每一個(gè)格子,x軸格子索引,y軸格子索引 GreedySnake.prototype.createGrid = function(idxX,idxY){ // 當(dāng)idxY > 0 時(shí),對(duì)應(yīng)的grid的向左移動(dòng)1px,將格子之間的線重合; // 當(dāng)idxX > 0 時(shí),對(duì)應(yīng)的grid的向上移動(dòng)1px,將格子之間的線重合; let grid = document.createElement("div"); grid.style.width = this.gridSize + "px"; grid.style.height = this.gridSize + "px"; this.map[idxY][idxX] = grid if(idxX > 0 ){ grid.style.marginLeft = "-1px"; } if(idxY > 0 ){ grid.style.marginTop = "-1px"; } this.container.appendChild(grid); } // 創(chuàng)建食物:原理就是根據(jù)在范圍內(nèi)的格子數(shù),生成兩個(gè)隨機(jī)數(shù),作為元素的坐標(biāo) GreedySnake.prototype.createFood = function(){ var gridYN = this.gridYN, gridXN = this.gridXN, temp = null , flag = true; this.foodX = Math.floor(Math.random() * gridXN); //緩存 this.foodY = Math.floor(Math.random() * gridYN); for(var i = 0 ; i= 0; i--){ this.snake.push([this.gridYN - 1 - i ,this.gridXN - 1 - 3]) this.map[this.gridYN - 1 - i][this.gridXN - 1 - 3].style.backgroundColor = "blue" } // 初始蛇頭坐標(biāo) this.snakeHead = this.snake[0] // console.log(this.snake) } // 開(kāi)始移動(dòng),移動(dòng)后蛇頭坐標(biāo) +-1 GreedySnake.prototype.snakeMove = function(){ let _this = this, sH = this.snakeHead, y = null, x = null, tempH = null, last = null, alive = true function common(){ _this.map[tempH[0]][tempH[1]].style.backgroundColor = "blue" _this.snake.unshift(tempH); _this.snakeHead = tempH; // 檢測(cè)蛇頭是否和蛇的身體相撞 for(var i = 1 ; i < _this.snake.length;i++){ if(_this.snakeHead[0] == _this.snake[i][0] && _this.snakeHead[1] == _this.snake[i][2]){ alert("GAME OVER"); alive = false return false } } // 當(dāng)蛇吃到食物后再重新創(chuàng)建食物 if(sH[0] === _this.foodY && sH[1] === _this.foodX){ _this.createFood() return false } last = _this.snake.pop(); _this.map[last[0]][last[1]].style.backgroundColor = "" } switch(this.direction){ case "top": y = sH[0] //緩存 tempH = [--y , sH[1] ]; if(tempH[0] < 0){ tempH = [this.gridYN - 1 , sH[1]] } common(); break; case "bottom": y = sH[0] tempH = [++y , sH[1] ]; // 邊界判斷 if(tempH[0] > this.gridYN - 1){ tempH = [ 0 , sH[1]] } common() break; case "left": x = sH[1] tempH = [sH[0] , --x ]; if(tempH[1] < 0){ tempH = [ sH[0] , this.gridXN - 1] } common() break; case "right": x = sH[1] tempH = [sH[0] , ++x ]; if(tempH[1] > this.gridXN - 1){ tempH = [ sH[0] , 0 ] } common() break; } alive && setTimeout(function(){ _this.snakeMove() },500 / this.speed) } // 注冊(cè)鍵盤(pán)事件 GreedySnake.prototype.listenKeyBoardEvents = function(){ let _this = this self.onkeyup = function(e){ let dir = _this.direction switch(e.keyCode){ case 37: if(dir != "right"){ _this.direction = "left"; } break; case 38: if(dir != "bottom"){ _this.direction = "top"; } break; case 39: if(dir != "left"){ _this.direction = "right"; } break; case 40: if(dir != "top"){ _this.direction = "bottom"; } break; } } } GreedySnake.prototype.print = function(){ return this.map } // 參數(shù)含義:x軸,y軸上的格子數(shù)量 var greedySnake = new GreedySnake(20,20); greedySnake.init() })(window)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94456.html
此篇文章主要是詳細(xì)介紹了python完成簡(jiǎn)單的貪吃蛇小游戲附編號(hào),文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,具有很強(qiáng)的參考意義,需用的朋友可以學(xué)習(xí)一下 序言: 不知道有沒(méi)有同學(xué)們和我一樣,最開(kāi)始觸碰程序編程的動(dòng)機(jī)就是為了做一個(gè)游戲打? 接下來(lái)要跟大家分享是指一個(gè)pygame所寫(xiě)的貪食蛇手機(jī)游戲: 貪食蛇這一個(gè)手機(jī)游戲在編程設(shè)計(jì)里的熟客,由于: 簡(jiǎn)易,最基本游戲情節(jié)你只需要蛇和食物2個(gè)就可以...
摘要:自從買(mǎi)了手柄后一直想試試給自己寫(xiě)的小游戲增加手柄支持。表示該對(duì)象所表示的手柄是否還保持連接。。連接事件瀏覽器提供了兩個(gè)手柄相關(guān)的事件。。完筆者給自己的貪食蛇小游戲增加了手柄搖桿控制蛇頭方向功能之前筆者還寫(xiě)過(guò)俄羅斯方塊之類(lèi)的,代碼找不到了 自從買(mǎi)了 Switch 手柄后一直想試試給自己寫(xiě)的小游戲增加手柄支持。今天終于抽出時(shí)間搞了一把。以下是筆記 ;) navigator.getGamep...
摘要:拿足球比賽的例子來(lái)說(shuō),我們的目標(biāo)只是進(jìn)球,下底傳中這種模式僅僅是達(dá)到進(jìn)球目標(biāo)的一種手段。但在這種動(dòng)態(tài)解釋型語(yǔ)言中,給對(duì)象動(dòng)態(tài)添加職責(zé)是再簡(jiǎn)單不過(guò)的事情。這就造成了語(yǔ)言的裝飾者模式不再關(guān)注于給對(duì)象動(dòng)態(tài)添加職責(zé),而是關(guān)注于給函數(shù)動(dòng)態(tài)添加職責(zé)。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199456 曾探...
摘要:歡迎使用中文文檔架構(gòu)概覽是網(wǎng)易項(xiàng)目團(tuán)隊(duì)開(kāi)發(fā)的一個(gè)基于進(jìn)行開(kāi)發(fā)的應(yīng)用層框架,提供了一個(gè)輕量級(jí)的容器來(lái)編寫(xiě)簡(jiǎn)單可維護(hù)的。 JavaScript 可以……嘛,不就是操作一下 DOM,可以讓元素飛來(lái)飛去嗎JavaScript 是……不就是用 jQuery 讓網(wǎng)頁(yè)動(dòng)起來(lái),頂多就是再用用 Ajax 和后端進(jìn)行一下數(shù)據(jù)交換嗎JavaScript 是一門(mén)……最討厭和鄙視這種弱類(lèi)型不需要編譯的腳本語(yǔ)言...
閱讀 2080·2021-11-24 10:34
閱讀 3055·2021-11-22 11:58
閱讀 3712·2021-09-28 09:35
閱讀 1724·2019-08-30 15:53
閱讀 2770·2019-08-30 14:11
閱讀 1551·2019-08-29 17:31
閱讀 542·2019-08-26 13:53
閱讀 2141·2019-08-26 13:45