成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

js如何實現簡單貪吃蛇游戲

這篇文章主要為大家展示了js如何實現簡單貪吃蛇游戲,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

成都創(chuàng)新互聯(lián)公司主要為客戶提供服務項目涵蓋了網頁視覺設計、VI標志設計、全網整合營銷推廣、網站程序開發(fā)、HTML5響應式成都網站建設、手機網站制作、微商城、網站托管及網頁維護、WEB系統(tǒng)開發(fā)、域名注冊、國內外服務器租用、視頻、平面設計、SEO優(yōu)化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經為成都軟裝設計行業(yè)客戶提供了網站營銷服務。

上下左右鍵控制方向使貪吃蛇吃葡萄

吃5個葡萄,游戲結束時左上角為總得分。

運行結果:

js如何實現簡單貪吃蛇游戲

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

var config = {
 width: 20, //一個格子的寬度
 height: 20, //一個格子的高度
 tr: 30, //行數
 td: 30 //列數
}
var snake = null, //Snake的實例
 food = null, //Food的實例
 game = null; //游戲的實例

//我們把蛇移動的整個區(qū)域設置成一個具有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() { //創(chuàng)建方塊并添加到頁面
 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 = []; //二維數組,存儲蛇身上每個節(jié)點(方塊)
 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節(jié)身體
 var snakeBody1 = new Square(1,0,"body");
 snakeBody1.create(); //將蛇的第一節(jié)身體添加到界面
 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; //蛇頭的后面有一節(jié)身體,其.next指針指向后面那節(jié)身體

 snakeBody1.prev = snakeHead; //蛇的第一節(jié)身體,.prev指向前面的蛇頭snakeHead
 snakeBody1.next = snakeTail; //蛇的第一節(jié)身體,.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]); //更新蛇節(jié)點的坐標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(); //更新蛇節(jié)點坐標
  }
  // 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();

//創(chuàng)建食物
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();

主要用到鏈表數據結構

以上就是關于js如何實現簡單貪吃蛇游戲的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

網站欄目:js如何實現簡單貪吃蛇游戲
鏈接分享:http://jinyejixie.com/article44/ppehhe.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、動態(tài)網站、服務器托管、手機網站建設、網站營銷、App設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網頁設計公司
子洲县| 西昌市| 清水县| 师宗县| 周宁县| 华容县| 同仁县| 资中县| 建昌县| 襄垣县| 海南省| 枣强县| 长寿区| 高邮市| 锦屏县| 翁牛特旗| 溧阳市| 林甸县| 千阳县| 兰溪市| 司法| 安溪县| 皮山县| 达拉特旗| 海原县| 罗城| 上杭县| 九龙坡区| 石阡县| 宾川县| 天津市| 会宁县| 大化| 景宁| 黄陵县| 株洲市| 黔江区| 长兴县| 若尔盖县| 澄城县| 灌云县|