JS高級---案例:貪吃蛇小游戲

来源:https://www.cnblogs.com/jane-panyiyun/archive/2020/01/03/12145272.html
-Advertisement-
Play Games

案例:貪吃蛇小游戲 可以玩的小游戲,略複雜,過了2遍,先pass吧 先創建構造函數,再給原型添加方法。分別創建食物,小蛇和游戲對象。 食物,小蛇的橫縱坐標,設置最大最小值,運動起來的函數,按上下左右鍵的處理函數,吃到的處理函數 <!DOCTYPE html> <html lang="en"> <he ...


案例:貪吃蛇小游戲

可以玩的小游戲,略複雜,過了2遍,先pass吧

先創建構造函數,再給原型添加方法。分別創建食物,小蛇和游戲對象。

食物,小蛇的橫縱坐標,設置最大最小值,運動起來的函數,按上下左右鍵的處理函數,吃到的處理函數

 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>title</title>
  <style>
    .map {
      width: 800px;
      height: 600px;
      background-color: #CCC;
      position: relative;
    }
  </style>
</head>

<body>
  <!--畫出地圖,設置樣式-->
  <div class="map"></div>
  <script>


    //自調用函數----食物的
    (function () {
      var elements = [];//用來保存每個小方塊食物的
      //食物就是一個對象,有寬,有高,有顏色,有橫縱坐標,先定義構造函數,然後創建對象
      function Food(x, y, width, height, color) {
        //橫縱坐標
        this.x = x || 0;
        this.y = y || 0;
        //寬和高
        this.width = width || 20;
        this.height = height || 20;
        //背景顏色
        this.color = color || "green";
      }

      //為原型添加初始化的方法(作用:在頁面上顯示這個食物)
      //因為食物要在地圖上顯示,所以,需要地圖的這個參數(map---就是頁面上的.class=map的這個div)
      Food.prototype.init = function (map) {
        //先刪除這個小食物
        //外部無法訪問的函數
        remove();

        //創建div
        var div = document.createElement("div");
        //把div加到map中
        map.appendChild(div);
        //設置div的樣式
        div.style.width = this.width + "px";
        div.style.height = this.height + "px";
        div.style.backgroundColor = this.color;
        //先脫離文檔流
        div.style.position = "absolute";
        //隨機橫縱坐標
        this.x = parseInt(Math.random() * (map.offsetWidth / this.width)) * this.width;
        this.y = parseInt(Math.random() * (map.offsetHeight / this.height)) * this.height;
        div.style.left = this.x + "px";
        div.style.top = this.y + "px";

        //把div加入到數組elements中
        elements.push(div);
      };

      //私有的函數---刪除食物的
      function remove() {
        //elements數組中有這個食物
        for (var i = 0; i < elements.length; i++) {
          var ele = elements[i];
          //找到這個子元素的父級元素,然後刪除這個子元素
          ele.parentNode.removeChild(ele);
          //再次把elements中的這個子元素也要刪除
          elements.splice(i, 1);
        }
      }

      //把Food暴露給Window,外部可以使用
      window.Food = Food;
    }());

    //自調用函數---小蛇
    (function () {
      var elements = [];//存放小蛇的每個身體部分
      //小蛇的構造函數
      function Snake(width, height, direction) {
        //小蛇的每個部分的寬
        this.width = width || 20;
        this.height = height || 20;
        //小蛇的身體
        this.body = [
          { x: 3, y: 2, color: "red" },//
          { x: 2, y: 2, color: "orange" },//身體
          { x: 1, y: 2, color: "orange" }//身體
        ];
        //方向
        this.direction = direction || "right";
      }

      //為原型添加方法--小蛇初始化的方法
      Snake.prototype.init = function (map) {
        //先刪除之前的小蛇
        remove();//===========================================

        //迴圈遍歷創建div
        for (var i = 0; i < this.body.length; i++) {
          //數組中的每個數組元素都是一個對象
          var obj = this.body[i];
          //創建div
          var div = document.createElement("div");
          //把div加入到map地圖中
          map.appendChild(div);
          //設置div的樣式
          div.style.position = "absolute";
          div.style.width = this.width + "px";
          div.style.height = this.height + "px";
          //橫縱坐標
          div.style.left = obj.x * this.width + "px";
          div.style.top = obj.y * this.height + "px";
          //背景顏色
          div.style.backgroundColor = obj.color;
          //方向暫時不定
          //把div加入到elements數組中----目的是為了刪除
          elements.push(div);
        }
      };

      //為原型添加方法---小蛇動起來
      Snake.prototype.move = function (food, map) {
        //改變小蛇的身體的坐標位置
        var i = this.body.length - 1;//2
        for (; i > 0; i--) {
          this.body[i].x = this.body[i - 1].x;
          this.body[i].y = this.body[i - 1].y;
        }
        //判斷方向---改變小蛇的頭的坐標位置
        switch (this.direction) {
          case "right":
            this.body[0].x += 1;
            break;
          case "left":
            this.body[0].x -= 1;
            break;
          case "top":
            this.body[0].y -= 1;
            break;
          case "bottom":
            this.body[0].y += 1;
            break;
        }

        //判斷有沒有吃到食物
        //小蛇的頭的坐標和食物的坐標一致
        var headX = this.body[0].x * this.width;
        var headY = this.body[0].y * this.height;
        //判斷小蛇的頭的坐標和食物的坐標是否相同
        if (headX == food.x && headY == food.y) {
          //獲取小蛇的最後的尾巴
          var last = this.body[this.body.length - 1];
          //把最後的蛇尾複製一個,重新的加入到小蛇的body中
          this.body.push({
            x: last.x,
            y: last.y,
            color: last.color
          });
          //把食物刪除,重新初始化食物
          food.init(map);
        }
      }
        ;//刪除小蛇的私有的函數=============================================================================
      function remove() {
        //刪除map中的小蛇的每個div,同時刪除elements數組中的每個元素,從蛇尾向蛇頭方向刪除div
        var i = elements.length - 1;
        for (; i >= 0; i--) {
          //先從當前的子元素中找到該子元素的父級元素,然後再弄死這個子元素
          var ele = elements[i];
          //從map地圖上刪除這個子元素div
          ele.parentNode.removeChild(ele);
          elements.splice(i, 1);
        }
      }

      //把Snake暴露給window,外部可以訪問
      window.Snake = Snake;
    }());

    //自調用函數---游戲對象================================================
    (function () {

      var that = null;//該變數的目的就是為了保存游戲Game的實例對象-------

      //游戲的構造函數
      function Game(map) {
        this.food = new Food();//食物對象
        this.snake = new Snake();//小蛇對象
        this.map = map;//地圖
        that = this;//保存當前的實例對象到that變數中-----------------此時that就是this
      }

      //初始化游戲-----可以設置小蛇和食物顯示出來
      Game.prototype.init = function () {
        //初始化游戲
        //食物初始化
        this.food.init(this.map);
        //小蛇初始化
        this.snake.init(this.map);
        //調用自動移動小蛇的方法========================||調用了小蛇自動移動的方法
        this.runSnake(this.food, this.map);
        //調用按鍵的方法
        this.bindKey();//========================================
      };

      //添加原型方法---設置小蛇可以自動的跑起來
      Game.prototype.runSnake = function (food, map) {

        //自動的去移動
        var timeId = setInterval(function () {
          //此時的this是window
          //移動小蛇
          this.snake.move(food, map);
          //初始化小蛇
          this.snake.init(map);
          //橫坐標的最大值
          var maxX = map.offsetWidth / this.snake.width;
          //縱坐標的最大值
          var maxY = map.offsetHeight / this.snake.height;
          //小蛇的頭的坐標
          var headX = this.snake.body[0].x;
          var headY = this.snake.body[0].y;
          //橫坐標
          if (headX < 0 || headX >= maxX) {
            //撞牆了,停止定時器
            clearInterval(timeId);
            alert("游戲結束");
          }
          //縱坐標
          if (headY < 0 || headY >= maxY) {
            //撞牆了,停止定時器
            clearInterval(timeId);
            alert("游戲結束");
          }
        }.bind(that), 150);
      };

      //添加原型方法---設置用戶按鍵,改變小蛇移動的方向
      Game.prototype.bindKey = function () {

        //獲取用戶的按鍵,改變小蛇的方向
        document.addEventListener("keydown", function (e) {
          //這裡的this應該是觸發keydown的事件的對象---document,
          //所以,這裡的this就是document
          //獲取按鍵的值
          switch (e.keyCode) {
            case 37: this.snake.direction = "left"; break;
            case 38: this.snake.direction = "top"; break;
            case 39: this.snake.direction = "right"; break;
            case 40: this.snake.direction = "bottom"; break;
          }
        }.bind(that), false);
      };

      //把Game暴露給window,外部就可以訪問Game對象了
      window.Game = Game;
    }());



    //初始化游戲對象
    var gm = new Game(document.querySelector("	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 場景 效果 註: 博客: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 新建Android項目,首先打開activity_main.xml 使用XML設置頁面 將其佈局改為GridLayo ...
  • 前言 作為 的核心模塊,它為我們提供了基於組件的路由配置、路由參數等功能,讓單頁面應用變得更易於管理。良好的路由管理尤為重要,比如路由攔截、路由懶載入、路由許可權等都在開發中起著至關重要的作用。同時路由還支持視圖過渡效果,沒有添加過渡動畫的路由切換會感覺很生硬,為了提高用戶體驗,路由過渡還是很有必要的 ...
  • 菜單快捷導航: CommonJS 之 exports和require用法 ES6 Module 之 export 和 import 用法 CommonJS和ES6 Module的區別 迴圈依賴 和 解決辦法 模塊打包原理簡析 1、CommonJS 之 exports和require用法 Common ...
  • 重點: 原型鏈 重點:不同的繼承 原型的另一個作用 重點:this指向要知道到底是誰 複習原型 原型鏈 原型的指向是否可以改變 繼承 如何實現繼承 原型的方式繼承 借用構造函數繼承 組合繼承 拷貝繼承 函數的不同的表現方式 函數的調用的不同的方式 this指向 嚴格模式 函數也是對象 記住就可以了 ...
  • 學習嘛,無非是深度和廣度。 首先,我們來探討一下深度。 做前端開發的,前端不就是html css js三劍客。 其中,html css就不提了,剩下的不就是js的學習深度。 js的深度靠什麼提高?不是任何框架,也不是任何庫,就是js它本身。 萬變不離其宗嘛,所有的庫和框架,都是基於js寫的。 學會了 ...
  • 面向對象的編程思想(貪吃蛇梳理) 模擬貪吃蛇游戲,做的項目 地圖: 寬,高,背景顏色,因為小蛇和食物都是相對於地圖顯示的, 這裡小蛇和食物都是地圖的子元素, 隨機位置顯示, 脫離文檔流的, 地圖也需要脫離文檔流--css需要設置:寬, 高, 背景顏色, 脫標 食物 div元素 elements >存 ...
  • js驗證回送地址,IP地址不能以127開頭 回送地址(127.x.x.x)是本機回送地址(Loopback Address) ...
  • 案例貪吃蛇,把封裝的函數移動到js文件中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> <style> .map { width: 800px; height: 600px; b ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...