<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:56:48
        文檔

        JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例

        JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例:1 面向?qū)ο缶幊趟枷朐诔绦蝽?xiàng)目中有著非常明顯的優(yōu)勢(shì): 1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊 1-2 維護(hù)非常方便并且成本較低。 ​2 這個(gè)demo是采用了面向?qū)ο蟮木幊趟枷? 用JavaScript 語(yǔ)言編寫的游戲小程序
        推薦度:
        導(dǎo)讀JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例:1 面向?qū)ο缶幊趟枷朐诔绦蝽?xiàng)目中有著非常明顯的優(yōu)勢(shì): 1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊 1-2 維護(hù)非常方便并且成本較低。 ​2 這個(gè)demo是采用了面向?qū)ο蟮木幊趟枷? 用JavaScript 語(yǔ)言編寫的游戲小程序

        1 面向?qū)ο缶幊趟枷朐诔绦蝽?xiàng)目中有著非常明顯的優(yōu)勢(shì):
        1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊
        1-2 維護(hù)非常方便并且成本較低。

        ​2 這個(gè)demo是采用了面向?qū)ο蟮木幊趟枷? 用JavaScript 語(yǔ)言編寫的游戲小程序--貪吃蛇.
        ​ 代碼注釋詳細(xì),邏輯清晰 . 非常適合新手前端開發(fā)者, 鍛煉JavaScript語(yǔ)言的面向?qū)ο蟮木幊趟枷? 
        該小Demo已上傳GitHub,歡迎下載!  覺得好的話,隨手給個(gè)star,  您的star是我最大的動(dòng)力!

        https://github.com/XingJYGo/snakePlay#javascript-經(jīng)典面向?qū)ο骴emo-貪吃蛇

        代碼展示:
        代碼結(jié)構(gòu):
        --index.html 地圖頁(yè)面,展示蛇和食物,進(jìn)行游戲
        --food.js   構(gòu)造食物對(duì)象
        --game.js   構(gòu)造游戲?qū)ο?br /> --snake.js   構(gòu)造蛇對(duì)象
        --tool.js   常用數(shù)據(jù)工具封裝

        --index.html 地圖頁(yè)面

        <!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>
         
        ////==========前后方向設(shè)定后 ==================
        var game = new Game();
        game.start();
         
         
         
        </script>
         
        </body>
        </html>
        

        --food.js   構(gòu)造食物對(duì)象

        // 封裝一個(gè)食物對(duì)象
        //沙箱模式
        (function(){
         var container; //用于存儲(chǔ)之前的食物
         function Food(option) {
         //防止用戶不傳參數(shù)會(huì)報(bào)錯(cuò)
         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 () {
         //每一次渲染新的之前就把原來(lái)的移除掉
         if(container){
         map.removeChild(container);
         }
         // 創(chuàng)建食物對(duì)象
         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';
         //獲得隨機(jī)位置
         //由于要讓食物的位置在每一個(gè)格子里面,所有獲取隨機(jī)數(shù)的算法要重新計(jì)算
         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);
         }
         
         //因?yàn)橐谌质褂肍ood,需要把Food拿到全局中
         window.Food = Food;
        })();
        

        --game.js   構(gòu)造游戲?qū)ο?/p>

        (function () {
        // 1 由于游戲?qū)ο笠刂粕吆褪澄?
        // 所以游戲?qū)ο髴?yīng)該擁有蛇的實(shí)例和食物的實(shí)例
         //存儲(chǔ)定時(shí)器的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 游戲一開始,蛇和食物就渲染出來(lái)
         timeid = setInterval(function () {
         //2-2 -1 蛇的數(shù)據(jù)改變
         this.snake.move();
         // 2-3 判斷蛇是否到達(dá)邊界
         var snakeHead = this.snake.body[0];
         //2-3-1 求蛇頭可以移動(dòng)的水平/垂直坐標(biāo)的最大位置
         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");
         //注:當(dāng)X超出范圍,代碼應(yīng)立即終止,
         // 防止2-2-2 渲染出下一個(gè)盒子.展示出來(lái)
         return;
         }
         
         
         //2-4 蛇吃食物
         //依據(jù): 蛇頭的坐標(biāo) 和 食物的坐標(biāo)重合
         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 蛇,變長(zhǎng)
         // 其實(shí)就是往snake.body.push個(gè)新對(duì)象
         // bug: 為了解決新添加蛇節(jié)閃下的問(wèn)題, 把蛇的最后一節(jié)對(duì)象,作為新的對(duì)象.
         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本身已經(jīng)在數(shù)組中了,
         }
         //2-2 -2渲染到頁(yè)面上,真正看到的蛇動(dòng)起來(lái)
         this.snake.render();
         
         }.bind(this), 150)
         
         // 3 給頁(yè)面注冊(cè)鍵盤按下的事件
         // 3-1 監(jiān)聽用戶是否按下了上,下,左,右的按鍵
         
         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中只有一行代碼就可以不寫花括號(hào),然后這一行代碼要緊跟在if后面記得加分號(hào)
         this.snake.direction = 'bottom';
         break;
         
         }
         }.bind(this);
         
         
         
         };
         
         //2-2 蛇變量賦予全局
         window.Game = Game;
         
        })();
        

        --snake.js   構(gòu)造蛇對(duì)象

        (function () {
         var arr = []; //用于存儲(chǔ)蛇的每一節(jié)數(shù)據(jù)
         
         // 1 創(chuàng)建蛇對(duì)象
         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 為了防止多個(gè)sanke渲染到頁(yè)面上,一渲染之前先清除掉原來(lái)的
         for (var i = 0; i < arr.length; i++) {
         map.removeChild(arr[i]);//移除頁(yè)面上的蛇節(jié)
         }
         arr.splice(0,arr.length);//蛇節(jié)都被移除掉了,那么數(shù)組中也應(yīng)該都移除.
         
         //2-1 根據(jù)body中的個(gè)數(shù),動(dòng)態(tài)的創(chuàng)建蛇節(jié)
         this.body.forEach(function (item, index) {
         //2-0 動(dòng)態(tài)的創(chuàng)建蛇節(jié)
         var snakeNode = document.createElement('div');
         //2-4 遍歷添加蛇節(jié)新數(shù)據(jù)
         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.`
         // 否則,默認(rèn)指向window
         };
         
         
         
         //3 蛇移動(dòng)的方法:body 頭數(shù)組賦值給身體.
         Snake.prototype.move = function () {
         //3-1 蛇后面的數(shù)據(jù)給前面
         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暫時(shí)蛇頭往右走
         // this.body[0].x +=1;
         //
         //3-2蛇頭一定的位置,要根據(jù)蛇的方向來(lái)決定
         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   常用數(shù)據(jù)工具封裝

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

        以上所述是小編給大家介紹的JavaScript貪吃蛇的實(shí)現(xiàn)詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例

        JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例:1 面向?qū)ο缶幊趟枷朐诔绦蝽?xiàng)目中有著非常明顯的優(yōu)勢(shì): 1- 1 代碼可讀性高.由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊 1-2 維護(hù)非常方便并且成本較低。 ​2 這個(gè)demo是采用了面向?qū)ο蟮木幊趟枷? 用JavaScript 語(yǔ)言編寫的游戲小程序
        推薦度:
        標(biāo)簽: 貪吃蛇 javascript 編程
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本人的色道免费网站| 成人黄页网站免费观看大全| 日韩精品一区二区亚洲AV观看| h视频在线免费看| 亚洲国产成人无码AV在线影院| 亚洲无码精品浪潮| 国产精品免费观看调教网| 亚洲人色大成年网站在线观看| 国产福利免费在线观看| 免费a级毛片无码a∨免费软件| 亚洲乱码无限2021芒果| 亚洲成?Ⅴ人在线观看无码| 久久久精品免费视频| 亚洲自偷自偷在线成人网站传媒| 久久久久亚洲AV无码专区网站 | 美女裸免费观看网站| 亚洲不卡av不卡一区二区| 成年18网站免费视频网站| a级午夜毛片免费一区二区| 亚洲国产最大av| 国产亚洲A∨片在线观看| 午夜一级免费视频| 无码国产精品一区二区免费16| 国产精品亚洲专区无码牛牛| 婷婷久久久亚洲欧洲日产国码AV| 精品国产麻豆免费网站| 一级毛片在线观看免费| 免费无码又爽又黄又刺激网站| 亚洲最大视频网站| 亚洲精品卡2卡3卡4卡5卡区| 暖暖免费高清日本中文| 在线看片免费人成视久网| 国产成人无码精品久久久久免费| 亚洲中文字幕无码亚洲成A人片| 亚洲av无码片在线播放| 伊人久久亚洲综合影院| 成年性羞羞视频免费观看无限| 久久青草免费91观看| 久久WWW免费人成—看片| 美女黄频免费网站| 亚洲人成网亚洲欧洲无码|