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

您的位置:首頁技術文章
文章詳情頁

js實現簡單貪吃蛇游戲

瀏覽:283日期:2024-05-08 16:00:44

本文實例為大家分享了js實現簡單貪吃蛇游戲的具體代碼,供大家參考,具體內容如下

上下左右鍵控制方向使貪吃蛇吃葡萄吃5個葡萄,游戲結束時左上角為總得分。

運行結果:

js實現簡單貪吃蛇游戲

界面和css代碼這里就不加贅述了,主要貼js代碼(加了注釋):

var config = { width: 20, //一個格子的寬度 height: 20, //一個格子的高度 tr: 30, //行數 td: 30 //列數}var snake = null, //Snake的實例 food = null, //Food的實例 game = null; //游戲的實例//我們把蛇移動的整個區域設置成一個具有30列30行的網格坐標//方塊(格子)坐標位置/**0,0 (0,0)20,0 (1,0)40,0 (2,0)*/function Square(x, y, className) { this.x = x*config.width; this.y = y*config.height; this.className = className; this.contentDom = document.createElement(’div’);//該位置的方塊對應的DOM元素 this.contentDom.className = this.className; this.parent = document.getElementsByClassName('innerSnake')[0];}Square.prototype.create = function() { //創建方塊并添加到頁面 this.contentDom.style.position = ’absolute’; this.contentDom.style.width = config.width + ’px’; this.contentDom.style.height = config.height + ’px’; this.contentDom.style.left = this.x + ’px’; this.contentDom.style.top = this.y + ’px’; this.parent.appendChild(this.contentDom);};Square.prototype.remove = function() { //移除方塊 this.parent.removeChild(this.contentDom);};//蛇function Snake() { this.head = null; //蛇頭 this.tail = null; //蛇尾 this.pos = []; //二維數組,存儲蛇身上每個節點(方塊) this.directionKey = { //存儲蛇走的方向 left: { //往左走 x: -1, //橫坐標減1,一個坐標表示一個格子 y: 0, //縱坐標不變 rotate: 90 }, right: { //往右走 x: 1, y: 0, rotate: -90 }, up: { //往上走 x: 0, y: -1, rotate: 180 }, down: { //往下走 x: 0, y: 1, rotate: 0 //蛇頭圖片方向,順時針為正 } }}Snake.prototype.init = function() { //初始化蛇 //蛇頭 var snakeHead = new Square(2,0,'head'); snakeHead.create(); //將蛇頭添加到界面 this.head = snakeHead; //存儲蛇頭信息 this.pos.push([2,0]); //存儲蛇頭坐標 //蛇的第1節身體 var snakeBody1 = new Square(1,0,'body'); snakeBody1.create(); //將蛇的第一節身體添加到界面 this.pos.push([1,0]); //蛇的尾巴 var snakeTail = new Square(0,0,'body'); snakeTail.create(); //將蛇尾添加到界面 this.tail = snakeTail; //存儲蛇尾信息 this.pos.push([0,0]); //形成鏈表關系 snakeHead.prev = null; //蛇頭的前面沒有元素,指向null snakeHead.next = snakeBody1; //蛇頭的后面有一節身體,其.next指針指向后面那節身體 snakeBody1.prev = snakeHead; //蛇的第一節身體,.prev指向前面的蛇頭snakeHead snakeBody1.next = snakeTail; //蛇的第一節身體,.next指向后面的身體,此時是蛇尾snakeTail snakeTail.prev = snakeBody1; //蛇尾,.prev指向前面的蛇身體snakeBody1 snakeTail.next = null; //蛇尾后面沒有元素,指向Null //初始蛇的走向,后面想改變蛇的走向即改變this.direction this.direction = this.directionKey.right; //默認向右走};//獲取蛇頭下一個位置對應的元素,根據元素做下一個動作Snake.prototype.getNextPos = function() { var nextPos = [ //獲取蛇頭走的下一個點的坐標 this.head.x / config.width + this.direction.x, this.head.y / config.height + this.direction.y ]; //判斷下一個點是自己or食物or圍墻or無障礙? var self = false; //設置下一個點是否是自己 this.pos.forEach(function(val) { //val即二位數組中的一個坐標 if(val.toString() === nextPos.toString()) { //下一個坐標等于蛇全部身體的一個,即下一個點是自己 self = true; } }); if(self) { // console.log(’撞到自己了!’); this.collide.end.call(this); //game over return; } else if(nextPos[0] < 0 || nextPos[1] < 0 || nextPos[0] > config.td-1 || nextPos[1] > config.tr-1) { // console.log(’撞到墻壁了!’); this.collide.end.call(this); //game over return; } else if (food && food.pos[0] === nextPos[0] && food.pos[1] === nextPos[1]) { console.log(’撞到食物了!’); this.collide.eat.call(this); } else { // console.log(’啥都沒遇到!’); this.collide.move.call(this, false); //注意:.call(this)重新設置this指向,使其指向當前實例對象Snake } };//處理碰撞后的事件Snake.prototype.collide = { /* 碰到自己or墻壁,游戲結束end(); 碰到食物,eat(); 啥都沒遇到,move(); */ move: function(isEat) { //isEat 是否吃了食物,不是則刪除蛇尾 /* 掐頭去尾: create新蛇頭,remove舊蛇頭; create一個新身體,放在(替代)舊蛇頭的位置; remove蛇尾,蛇尾prev的元素變成新蛇尾 */ var x = this.head.x / config.width + this.direction.x, y = this.head.y / config.height + this.direction.y; //聲明一個新身體 var newBody = new Square(this.head.x/config.width, this.head.y/config.height, 'body'); //更新鏈表關系 newBody.next = this.head.next; newBody.next.prev = newBody; newBody.prev = null; this.head.remove(); //刪除舊蛇頭 newBody.create(); //添加蛇身體,替代在舊蛇頭位置 //聲明一個新蛇頭(下一個走的點) var newHead = new Square(x, y, 'head'); //更新鏈表關系 newHead.prev = null; newHead.next = newBody; newBody.prev = newHead; this.pos.unshift([x, y]); //更新蛇節點的坐標this.pos this.head = newHead; //更新this.head的信息 newHead.contentDom.style.transform = `rotate(${this.direction.rotate}deg)` newHead.create(); //添加蛇頭 //刪除蛇尾:吃食物則不刪 if(!isEat) { //沒有吃食物,刪除蛇尾 this.tail.remove(); this.tail = this.tail.prev; this.pos.pop(); //更新蛇節點坐標 } // console.log(this.pos); //打印數組,驗證 }, eat: function() { this.collide.move.call(this, true); //傳參true,表示此時為吃操作 food.remove(); //刪除被吃掉的食物 game.score ++; //記錄分數 createFood(); //此時再隨機產生一個食物 }, end: function() { console.log(’end’); game.gameOver(); }}snake = new Snake();//創建食物function createFood() { var x = null, y = null; var include = true; //表示食物的位置是否在蛇身上 var random = function(max, min) { //產生一個隨機數 return Math.floor(Math.random()*(max - min + 1)) }; while(include) { x = random(config.tr - 1, 0); y = random(config.td - 1, 0); snake.pos.forEach(function(val) { if(x != val[0] && y != val[1]) { include = false; } }); } //生成食物 food = new Square(x, y, 'food'); food.pos = [x, y]; //記錄食物坐標 food.create();}//游戲邏輯function Game() { this.score = 0; //分數 this.timer = null; //計時器}Game.prototype.init = function() { snake.init(); // snake.getNextPos(); //獲取下一個點坐標 createFood(); document.onkeydown = function(event) { if(event.which == 37 && snake.direction != snake.directionKey.right) { //鼠標左鍵,蛇不能是正在往右走 snake.direction = snake.directionKey.left; } else if (event.which == 38 && snake.direction != snake.directionKey.down) { //鼠標上鍵 snake.direction = snake.directionKey.up; } else if (event.which == 39 && snake.direction != snake.directionKey.left) { //鼠標右鍵 snake.direction = snake.directionKey.right; } else if (event.which == 40 && snake.direction != snake.directionKey.up) { //鼠標下鍵 snake.direction = snake.directionKey.down; } } this.start();};game = new Game();//開始游戲Game.prototype.start = function() { this.timer = setInterval(function() { snake.getNextPos(); //獲取下一個坐標點,做下一步動作 }, 200);};//游戲結束Game.prototype.gameOver = function() { console.log('gameOver'); clearInterval(this.timer); var gameOver = document.querySelector(’.gameOver’); var gameScore = document.querySelector(’.gameOver .score’); gameOver.style.display = ’block’; //顯示游戲結束界面 gameScore.innerHTML = `${this.score}`; //將分數記入該界面};//開啟游戲function startGame() { var startBtn = document.querySelector(’.btn button’); var snakeWrap = document.querySelector(’.snakeWrap’); startBtn.onclick = function() { startBtn.parentNode.style.display = ’none’; //隱藏開始游戲界面 snakeWrap.style.display = ’block’; //顯示進入游戲的界面 game.init(); }}startGame();

主要用到鏈表數據結構

更多有趣的經典小游戲實現專題,也分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

java經典小游戲匯總

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产综合色区在线观看| 麻豆精品在线| 中文字幕高清在线播放| 国产美女精品视频免费播放软件| 人人爽香蕉精品| 日韩一级网站| 亚洲一二三区视频| 日韩高清欧美激情| 国产日产高清欧美一区二区三区 | 欧美国产专区| 国产精选在线| 野花国产精品入口| 亚洲高清影视| 日韩av一区二| 国产福利电影在线播放| 久久亚洲国产| 日本一区二区中文字幕| 欧美成人精品一级| 欧美高清一区| 国产午夜精品一区在线观看| 日本黄色精品| 蜜臀久久99精品久久久久宅男 | 日韩精品看片| 免费视频久久| 免费视频一区二区三区在线观看 | 在线精品一区| 日本激情一区| 欧美在线日韩| 午夜电影亚洲| 久久三级中文| 亚洲免费福利一区| 欧美日韩视频网站| 日韩和欧美一区二区| 正在播放日韩精品| 无码日韩精品一区二区免费| 久久av综合| 亚洲人成亚洲精品| 国产一区二区三区自拍| 久久99偷拍| 日韩国产欧美三级| 欧美特黄视频| 亚洲国产欧美日本视频| 亚洲综合三区| 免费观看亚洲| 国产精品亚洲一区二区在线观看| 91精品久久久久久久久久不卡| 日韩av网站在线观看| 亚洲欧美日韩高清在线| 国产传媒在线观看| 老司机精品在线| 亚洲在线国产日韩欧美| 成人精品动漫一区二区三区| 日韩精品免费视频人成| 99pao成人国产永久免费视频 | 国产精品网在线观看| 狠狠操综合网| 欧美www视频在线观看| 久久国产精品免费精品3p| 午夜久久美女| 久久国产电影| 丁香婷婷久久| 欧美成人精品一级| 日韩精品成人在线观看| 水野朝阳av一区二区三区| 99精品电影| 亚洲伦乱视频| 999久久久亚洲| 亚洲欧美伊人| 美女网站一区| 日韩视频二区| 免费av一区| 夜夜嗨一区二区| 综合色就爱涩涩涩综合婷婷| 韩国女主播一区二区三区| 亚洲人成在线影院| 久久精品天堂| 久久精品色播| 精品视频在线一区二区在线| 精品淫伦v久久水蜜桃| 成人免费一区| 欧洲一级精品| aⅴ色国产欧美| 88久久精品| 精品淫伦v久久水蜜桃| 日韩一区二区三区免费| 婷婷成人在线| 亚洲乱码一区| 国内一区二区三区| 亚洲va中文在线播放免费| 精品视频高潮| 婷婷综合六月| 亚洲精品麻豆| 国产精品一卡| 国产在线|日韩| 综合激情五月婷婷| 国产aⅴ精品一区二区四区| 中文欧美日韩| 美女在线视频一区| 亚洲激情婷婷| 国产精品s色| 图片区亚洲欧美小说区| 日韩av中文字幕一区二区三区| 久久精品资源| 在线精品观看| 日本精品不卡| 国产极品一区| 免费成人性网站| 精品中文字幕一区二区三区四区| 国产精品视区| 在线精品亚洲欧美日韩国产| 婷婷久久免费视频| 欧美 日韩 国产一区二区在线视频 | 免费成人性网站| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 丝瓜av网站精品一区二区| 久久精品三级| 日韩av中文字幕一区二区三区| 欧美肉体xxxx裸体137大胆| 欧美日本不卡高清| 久久国产成人| 在线日韩一区| 久久精品天堂| 国产精品嫩草影院在线看| 欧美在线亚洲综合一区| 欧美一区免费| 国产亚洲高清在线观看| 亚洲欧美日本视频在线观看| 国产精品国产一区| 久久激情综合网| 日韩精品一二三四| 鲁大师影院一区二区三区| 99久久九九| 亚洲小说欧美另类婷婷| 久久国产毛片| 亚洲精品91| 亚洲免费精品| 免费国产亚洲视频| 中文字幕一区二区三区四区久久 | 爽好久久久欧美精品| 欧美不卡视频| 久久午夜精品| 午夜电影一区| 国产精品亚洲四区在线观看| 欧美aa在线视频| 国产va在线视频| 日韩理论视频| 狠狠干成人综合网| 综合国产精品| 麻豆91在线播放| 伊伊综合在线| 黄色精品网站| 日韩国产精品久久久久久亚洲| 国产麻豆一区二区三区| 国产精品久久久久9999高清| 美女视频一区在线观看| 久久久男人天堂| 免费成人性网站| 亚洲毛片一区| 欧美精品影院| 日韩久久一区二区三区| 宅男噜噜噜66国产日韩在线观看| 日韩精彩视频在线观看| 91中文字幕精品永久在线| 中文字幕中文字幕精品| 日韩一区电影| 日韩高清在线不卡| 久久亚洲精品中文字幕蜜潮电影| 日本欧美在线看| 国产一区二区三区天码| 亚洲精品进入| 国产亚洲激情| 日韩在线中文| 欧美激情日韩| 日韩av一区二区三区四区| 91精品一区国产高清在线gif| 日韩影院在线观看| 日韩精品欧美大片| 日韩免费视频| 日本午夜精品久久久久| 免播放器亚洲一区| 国产精品嫩模av在线| 婷婷亚洲五月| 色婷婷色综合| 亚洲精品成人一区| 婷婷激情一区| 久久国产欧美日韩精品| 激情综合自拍| 久久不卡日韩美女| 色88888久久久久久影院| 亚洲欧美一级| 人人香蕉久久| 中文字幕一区二区精品区| 久久女人天堂| 日本不卡中文字幕| 不卡视频在线| 高清一区二区三区av| 亚洲人亚洲人色久| aⅴ色国产欧美| 精品国产美女a久久9999| 欧美午夜精彩|