国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript面向對象編程小游戲---貪吃蛇代碼實例

來源:懂視網 責編:小采 時間:2020-11-27 21:56:48
文檔

JavaScript面向對象編程小游戲---貪吃蛇代碼實例

JavaScript面向對象編程小游戲---貪吃蛇代碼實例:1 面向對象編程思想在程序項目中有著非常明顯的優勢: 1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護也只是在局部模塊 1-2 維護非常方便并且成本較低。 ​2 這個demo是采用了面向對象的編程思想. 用JavaScript 語言編寫的游戲小程序
推薦度:
導讀JavaScript面向對象編程小游戲---貪吃蛇代碼實例:1 面向對象編程思想在程序項目中有著非常明顯的優勢: 1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護也只是在局部模塊 1-2 維護非常方便并且成本較低。 ​2 這個demo是采用了面向對象的編程思想. 用JavaScript 語言編寫的游戲小程序

1 面向對象編程思想在程序項目中有著非常明顯的優勢:
1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護也只是在局部模塊
1-2 維護非常方便并且成本較低。

​2 這個demo是采用了面向對象的編程思想. 用JavaScript 語言編寫的游戲小程序--貪吃蛇.
​ 代碼注釋詳細,邏輯清晰 . 非常適合新手前端開發者, 鍛煉JavaScript語言的面向對象的編程思想. 
該小Demo已上傳GitHub,歡迎下載!  覺得好的話,隨手給個star,  您的star是我最大的動力!

https://github.com/XingJYGo/snakePlay#javascript-經典面向對象demo-貪吃蛇

代碼展示:
代碼結構:
--index.html 地圖頁面,展示蛇和食物,進行游戲
--food.js   構造食物對象
--game.js   構造游戲對象
--snake.js   構造蛇對象
--tool.js   常用數據工具封裝

--index.html 地圖頁面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
 #map{
 width: 500px;
 height: 500px;
 background-color: lightblue;
 position: relative;
 }
 
 </style>
</head>
<body>
<div id="map">
 
</div>
<button id="btn">模擬蛇吃到食物</button>
<script src="tool.js"></script>
<script src="food.js"></script>
<script src="snake.js"></script>
<script src="game.js"></script>
<script>
 
////==========前后方向設定后 ==================
var game = new Game();
game.start();
 
 
 
</script>
 
</body>
</html>

--food.js   構造食物對象

// 封裝一個食物對象
//沙箱模式
(function(){
 var container; //用于存儲之前的食物
 function Food(option) {
 //防止用戶不傳參數會報錯
 option = option || {};
 this.width = option.width || 20;
 this.height = option.height || 20;
 this.bgc = option.bgc || 'orange';
 this.x = option.x || 0;
 this.y = option.y || 0;
 this.borderRadius = option.borderRadius |10;
 }
 
 Food.prototype.render = function () {
 //每一次渲染新的之前就把原來的移除掉
 if(container){
 map.removeChild(container);
 }
 // 創建食物對象
 var food = document.createElement('div');
 //存到全局變量里
 container = food;
 food.style.width = this.width + 'px';
 food.style.height = this.height + 'px';
 food.style.backgroundColor = this.bgc;
 food.style.position = 'absolute';
 //獲得隨機位置
 //由于要讓食物的位置在每一個格子里面,所有獲取隨機數的算法要重新計算
 this.x = Tool.getRandom(0, (map.offsetWidth/ this.width-1)) * this.width;
 this.y = Tool.getRandom(0, (map.offsetHeight/ this.height-1)) * this.height;
 food.style.left = this.x + 'px';
 food.style.top = this.y + 'px';
 food.style.borderRadius = this.borderRadius + 'px';
 //渲染上食物
 map.appendChild(food);
 }
 
 //因為要在全局使用Food,需要把Food拿到全局中
 window.Food = Food;
})();

--game.js   構造游戲對象

(function () {
// 1 由于游戲對象要控制蛇和食物,
// 所以游戲對象應該擁有蛇的實例和食物的實例
 //存儲定時器的id
 var timeid;
 function Game() {
 this.snake = new Snake();
 this.food = new Food();
 }
 
 //2 開始游戲
 Game.prototype.start = function () {
 this.snake.render();
 this.food.render();
 
 // 2-1 游戲一開始,蛇和食物就渲染出來
 timeid = setInterval(function () {
 //2-2 -1 蛇的數據改變
 this.snake.move();
 // 2-3 判斷蛇是否到達邊界
 var snakeHead = this.snake.body[0];
 //2-3-1 求蛇頭可以移動的水平/垂直坐標的最大位置
 var maxX = map.offsetWidth/this.snake.width -1;
 var maxY = map.offsetHeight/this.snake.height -1;
 if (snakeHead.x <0 ||snakeHead.x > maxX ||snakeHead.y <0 ||snakeHead.y > maxY){
 clearInterval(timeid);
 alert("gave over");
 //注:當X超出范圍,代碼應立即終止,
 // 防止2-2-2 渲染出下一個盒子.展示出來
 return;
 }
 
 
 //2-4 蛇吃食物
 //依據: 蛇頭的坐標 和 食物的坐標重合
 var snakeX = snakeHead.x * this.snake.width;
 var snakeY = snakeHead.y * this.snake.height;
 var foodX = this.food.x;
 var foodY = this.food.y;
 
 //如果符合條件, 證明吃到了食物
 if (snakeX === foodX && snakeY === foodY){
 // 2-4-1 食物消失, 渲染新食物
 this.food.render();
 // 2-4-2 蛇,變長
 // 其實就是往snake.body.push個新對象
 // bug: 為了解決新添加蛇節閃下的問題, 把蛇的最后一節對象,作為新的對象.
 var last = this.snake.body[this.snake.body.length -1];
 this.snake.body.push({
 x:last.x,
 y:last.y,
 col:last.col
 })
 // this.snake.body.push(last);
 // 注:last本身已經在數組中了,
 }
 //2-2 -2渲染到頁面上,真正看到的蛇動起來
 this.snake.render();
 
 }.bind(this), 150)
 
 // 3 給頁面注冊鍵盤按下的事件
 // 3-1 監聽用戶是否按下了上,下,左,右的按鍵
 
 document.onkeydown = function(e){
 // console.log(this);
 e = e || window.event;
 console.log(e.keyCode);
 // 左37 上38 右39 下40
 switch(e.keyCode){
 
 case 37:
 //3-11 需要找到蛇,修改蛇的direction屬性
 //防止原地掉頭
 if(this.snake.direction === 'right'){
 return;
 }
 this.snake.direction = 'left';
 break;
 case 38:
 if(this.snake.direction === 'bottom'){
 return;
 }
 this.snake.direction = 'top';
 break;
 case 39:
 if(this.snake.direction === 'left'){
 return;
 }
 this.snake.direction = 'right';
 break;
 case 40:
 if(this.snake.direction === 'top') return; //如果if中只有一行代碼就可以不寫花括號,然后這一行代碼要緊跟在if后面記得加分號
 this.snake.direction = 'bottom';
 break;
 
 }
 }.bind(this);
 
 
 
 };
 
 //2-2 蛇變量賦予全局
 window.Game = Game;
 
})();

--snake.js   構造蛇對象

(function () {
 var arr = []; //用于存儲蛇的每一節數據
 
 // 1 創建蛇對象
 function Snake(option) {
 option = option || {};
 this.width = option.width || 20;
 this.height = option.height || 20;
 this.body = [
 {x: 3, y: 2, col: 'green'},//蛇頭的位置和顏色
 {x: 2, y: 2, col: 'orange'},//蛇頭身體的位置和顏色
 {x: 1, y: 2, col: 'orange'}];
 this.direction = option.direction || 'right';
 }
 
 
 //2 渲染蛇的方法
 Snake.prototype.render = function () {
 // 2-3 為了防止多個sanke渲染到頁面上,一渲染之前先清除掉原來的
 for (var i = 0; i < arr.length; i++) {
 map.removeChild(arr[i]);//移除頁面上的蛇節
 }
 arr.splice(0,arr.length);//蛇節都被移除掉了,那么數組中也應該都移除.
 
 //2-1 根據body中的個數,動態的創建蛇節
 this.body.forEach(function (item, index) {
 //2-0 動態的創建蛇節
 var snakeNode = document.createElement('div');
 //2-4 遍歷添加蛇節新數據
 arr.push(snakeNode);
 snakeNode.style.width = this.width + 'px';
 snakeNode.style.height = this.height + 'px';
 snakeNode.style.position = 'absolute';
 snakeNode.style.left = item.x * this.width + 'px';
 snakeNode.style.top = item.y * this.height + 'px';
 snakeNode.style.backgroundColor = item.col;
 map.appendChild(snakeNode);
 
 }.bind(this))
 // 2-2 上面的this是在snake里面,指向snake.`
 // 否則,默認指向window
 };
 
 
 
 //3 蛇移動的方法:body 頭數組賦值給身體.
 Snake.prototype.move = function () {
 //3-1 蛇后面的數據給前面
 for (var i = this.body.length -1; i >0; i--) {
 this.body[i].x = this.body[i - 1].x;
 this.body[i].y = this.body[i - 1].y;
 }
 // 3-2暫時蛇頭往右走
 // this.body[0].x +=1;
 //
 //3-2蛇頭一定的位置,要根據蛇的方向來決定
 switch(this.direction){
 
 case 'left':
 this.body[0].x -= 1;
 break;
 case 'right':
 this.body[0].x += 1;
 break;
 case 'top':
 this.body[0].y -= 1;
 break;
 case 'bottom':
 this.body[0].y += 1;
 break;
 }
 };
 
 
 
 //賦予全局變量
 window.Snake = Snake;
})();

--tool.js   常用數據工具封裝

//用于存放一些常用的功能性的函數
 
// function getRandom(){
//
// }
var Tool = {
 //獲取min - max之間的隨機整數
 getRandom: function(min, max){
 return Math.floor(Math.random() * (max - min + 1)) + min;
 }
}
 
// Tool.getRandom()

以上所述是小編給大家介紹的JavaScript貪吃蛇的實現詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript面向對象編程小游戲---貪吃蛇代碼實例

JavaScript面向對象編程小游戲---貪吃蛇代碼實例:1 面向對象編程思想在程序項目中有著非常明顯的優勢: 1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護也只是在局部模塊 1-2 維護非常方便并且成本較低。 ​2 這個demo是采用了面向對象的編程思想. 用JavaScript 語言編寫的游戲小程序
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美日韩欧美 | 狼人综合伊人 | 性欧美大战久久久久久久野外 | 国产欧美日韩在线播放 | 国产精品久久久久免费 | 日本三级一区二区三区 | 美女视频黄a视频全免费应用 | 欧美日韩免费在线 | 亚洲第一页在线播放 | 国产精品视频3p | 亚洲国产精品综合久久一线 | 天天舔天天干 | 亚洲小说欧美激情另类 | 日韩欧美在线第一页 | 日本一区二区三区精品视频 | 国产日韩欧美中文字幕 | 久久国产欧美日韩高清专区 | 亚洲国产成人久久99精品 | 国产精品高清一区二区三区不卡 | 91精品欧美一区二区三区 | 一区二区成人国产精品 | 日韩伦理亚洲欧美在线一区 | 亚洲国产婷婷综合在线精品 | 手机在线国产视频 | 在线色网 | 国产日产欧美精品一区二区三区 | 日韩一区精品 | 女人与公拘交酡全过程 | 日韩专区一区 | 欧美日韩精品免费一区二区三区 | 毛片一级免费 | 国产黄色视屏 | 唯美清纯另类亚洲 | 在线免费黄色 | 久久亚洲伊人成综合人影院 | h片在线看 | 成人国内精品久久久久影院 | 国产 高清 在线 | 国产欧美成人一区二区三区 | 久久久久久综合一区中文字幕 | 国产精品免费_区二区三区观看 |