好玩的小游戏系列 (一)基于html+js 原生贪吃蛇

news2025/1/17 3:40:26

一朵花如果只被用来观赏那只呈现出它的外在意义只是它生命的一部分若是不能够将其内在更实质的美发挥出来充其量也不过就是一朵死的花而已。


 

目录

一、前言

二、代码介绍

三、效果显示 

四、编码实现

index.html

jquery-1.10.2.js

五、获取源码

        获取源码?私信?关注?点赞?收藏?


一、前言

贪吃蛇是一款经典的小游戏。初始是像素版本,后来又衍生出3D版本、多人对战版本等。

贪食蛇游戏操作简单,可玩性比较高。这个游戏难度最大的不是蛇长得很长的时候,而是开始。那个时候蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小短蛇让人容易走神,失去耐心。由于难度小,你会不知不觉加快调整方向的速度,在游走自如的时候蛇身逐渐加长了,而玩家却没有意识到危险。

贪食蛇的另一个危险期在于游戏开始几十秒之后。由于玩家的注意力高度集中,精神紧张,此时局面稍好,就会不由自主地想放松一下,结果手指一松劲,贪食蛇就死了。所以贪食蛇可以算作一个敏捷型的小游戏。


二、代码介绍

一款简单的 HTML+JS 原生贪吃蛇小游戏

1、HTML

2、JS

3、舒适的画面感

4、流畅的游戏体验


三、效果显示 

我们一起回味一下好玩的贪吃蛇吧!!!

A.

B.

舒适美观的画面,灵动的体验!!!

是否想体验一下呢?


四、编码实现


由于文章篇幅限制,部分代码将不予展示,但会将完整代码文件放在下方

注意路径(⊙o⊙)?

o(* ̄▽ ̄*)ブ 


index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>JS贪吃蛇</title>
    <script src="static/js/jquery-1.10.2.js"></script>
    <style>
      @font-face {
        font-family: "game";
        src: url("https://fonts.googleapis.com/css2?family=Poppins:wght@500;800&display=swap");
      }
      * {
        padding: 0;
        margin: 0;
        box-sizing: border-box;
      }
      button:focus {
        outline: 0;
      }

      html,
      body {
        height: 100%;
        font-family: "Poppins", sans-serif;
        color: #6e7888;
      }
      body {
        background-color: #222738;
        display: flex;
        justify-content: center;
        align-items: center;
        color: #6e7888;
      }
      canvas {
        background-color: #181825;
      }
      .container {
        display: flex;
        width: 100%;
        height: 100%;
        flex-flow: column wrap;
        justify-content: center;
        align-items: center;
      }
      #ui {
        display: flex;
        align-items: center;
        font-size: 10px;
        flex-flow: column;
        margin-left: 10px;
      }
      h2 {
        font-weight: 200;
        transform: rotate(270deg);
      }
      #score {
        margin-top: 20px;
        font-size: 30px;
        font-weight: 800;
      }
      .noselect {
        user-select: none;
      }
      #replay {
        font-size: 10px;
        padding: 10px 20px;
        background: #6e7888;
        border: none;
        color: #222738;
        border-radius: 20px;
        font-weight: 800;
        transform: rotate(270deg);
        cursor: pointer;
        transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
      }
      #replay:hover {
        background: #a6aab5;
        background: #4cffd7;
        transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);
      }
      #replay svg {
        margin-right: 8px;
      }
      @media (max-width: 600px) {
        #replay {
          margin-bottom: 20px;
        }
        #replay,
        h2 {
          transform: rotate(0deg);
        }
        #ui {
          flex-flow: row wrap;
          margin-bottom: 20px;
        }
        #score {
          margin-top: 0;
          margin-left: 20px;
        }
        .container {
          flex-flow: column wrap;
        }
      }
      #author {
        width: 100%;
        bottom: 40px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        font-weight: 600;
        color: inherit;
        text-transform: uppercase;
        padding-left: 35px;
      }
      #author span {
        font-size: 10px;
        margin-left: 20px;
        color: inherit;
        letter-spacing: 4px;
      }
      #author h1 {
        font-size: 25px;
      }
      .wrapper {
        display: flex;
        flex-flow: row wrap;
        justify-content: center;
        align-items: center;
        margin-bottom: 20px;
      }
    </style>
  </head>
  <body>
    <div class="container noselect">
      <div class="wrapper">
        <button id="replay">
          <i class="fas fa-play"></i>
          RESTART
        </button>
        <div id="canvas"></div>
        <div id="ui">
          <h2>SCORE</h2>
          <span id="score">00</span>
        </div>
      </div>
      <div id="author">
        <h1>SNAKE</h1>
        <span><p>小键盘方向键控制</p></span>
      </div>
    </div>

    <script>
      /** 
This is a snake game I made with Vanilla Javascript.
Follow me on twitter @fariatondo
**/

      let dom_replay = document.querySelector("#replay");
      let dom_score = document.querySelector("#score");
      let dom_canvas = document.createElement("canvas");
      document.querySelector("#canvas").appendChild(dom_canvas);
      let CTX = dom_canvas.getContext("2d");

      const W = (dom_canvas.width = 400);
      const H = (dom_canvas.height = 400);

      let snake,
        food,
        currentHue,
        cells = 20,
        cellSize,
        isGameOver = false,
        tails = [],
        score = 00,
        maxScore = window.localStorage.getItem("maxScore") || undefined,
        particles = [],
        splashingParticleCount = 20,
        cellsCount,
        requestID;

      let helpers = {
        Vec: class {
          constructor(x, y) {
            this.x = x;
            this.y = y;
          }
          add(v) {
            this.x += v.x;
            this.y += v.y;
            return this;
          }
          mult(v) {
            if (v instanceof helpers.Vec) {
              this.x *= v.x;
              this.y *= v.y;
              return this;
            } else {
              this.x *= v;
              this.y *= v;
              return this;
            }
          }
        },
        isCollision(v1, v2) {
          return v1.x == v2.x && v1.y == v2.y;
        },
        garbageCollector() {
          for (let i = 0; i < particles.length; i++) {
            if (particles[i].size <= 0) {
              particles.splice(i, 1);
            }
          }
        },
        drawGrid() {
          CTX.lineWidth = 1.1;
          CTX.strokeStyle = "#232332";
          CTX.shadowBlur = 0;
          for (let i = 1; i < cells; i++) {
            let f = (W / cells) * i;
            CTX.beginPath();
            CTX.moveTo(f, 0);
            CTX.lineTo(f, H);
            CTX.stroke();
            CTX.beginPath();
            CTX.moveTo(0, f);
            CTX.lineTo(W, f);
            CTX.stroke();
            CTX.closePath();
          }
        },
        randHue() {
          return ~~(Math.random() * 360);
        },
        hsl2rgb(hue, saturation, lightness) {
          if (hue == undefined) {
            return [0, 0, 0];
          }
          var chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;
          var huePrime = hue / 60;
          var secondComponent = chroma * (1 - Math.abs((huePrime % 2) - 1));

          huePrime = ~~huePrime;
          var red;
          var green;
          var blue;

          if (huePrime === 0) {
            red = chroma;
            green = secondComponent;
            blue = 0;
          } else if (huePrime === 1) {
            red = secondComponent;
            green = chroma;
            blue = 0;
          } else if (huePrime === 2) {
            red = 0;
            green = chroma;
            blue = secondComponent;
          } else if (huePrime === 3) {
            red = 0;
            green = secondComponent;
            blue = chroma;
          } else if (huePrime === 4) {
            red = secondComponent;
            green = 0;
            blue = chroma;
          } else if (huePrime === 5) {
            red = chroma;
            green = 0;
            blue = secondComponent;
          }

          var lightnessAdjustment = lightness - chroma / 2;
          red += lightnessAdjustment;
          green += lightnessAdjustment;
          blue += lightnessAdjustment;

          return [
            Math.round(red * 255),
            Math.round(green * 255),
            Math.round(blue * 255),
          ];
        },
        lerp(start, end, t) {
          return start * (1 - t) + end * t;
        },
      };

      let KEY = {
        ArrowUp: false,
        ArrowRight: false,
        ArrowDown: false,
        ArrowLeft: false,
        resetState() {
          this.ArrowUp = false;
          this.ArrowRight = false;
          this.ArrowDown = false;
          this.ArrowLeft = false;
        },
        listen() {
          addEventListener(
            "keydown",
            (e) => {
              if (e.key === "ArrowUp" && this.ArrowDown) return;
              if (e.key === "ArrowDown" && this.ArrowUp) return;
              if (e.key === "ArrowLeft" && this.ArrowRight) return;
              if (e.key === "ArrowRight" && this.ArrowLeft) return;
              this[e.key] = true;
              Object.keys(this)
                .filter(
                  (f) => f !== e.key && f !== "listen" && f !== "resetState"
                )
                .forEach((k) => {
                  this[k] = false;
                });
            },
            false
          );
        },
      };

      class Snake {
        constructor(i, type) {
          this.pos = new helpers.Vec(W / 2, H / 2);
          this.dir = new helpers.Vec(0, 0);
          this.type = type;
          this.index = i;
          this.delay = 5;
          this.size = W / cells;
          this.color = "white";
          this.history = [];
          this.total = 1;
        }
        draw() {
          let { x, y } = this.pos;
          CTX.fillStyle = this.color;
          CTX.shadowBlur = 20;
          CTX.shadowColor = "rgba(255,255,255,.3 )";
          CTX.fillRect(x, y, this.size, this.size);
          CTX.shadowBlur = 0;
          if (this.total >= 2) {
            for (let i = 0; i < this.history.length - 1; i++) {
              let { x, y } = this.history[i];
              CTX.lineWidth = 1;
              CTX.fillStyle = "rgba(225,225,225,1)";
              CTX.fillRect(x, y, this.size, this.size);
            }
          }
        }
        walls() {
          let { x, y } = this.pos;
          if (x + cellSize > W) {
            this.pos.x = 0;
          }
          if (y + cellSize > W) {
            this.pos.y = 0;
          }
          if (y < 0) {
            this.pos.y = H - cellSize;
          }
          if (x < 0) {
            this.pos.x = W - cellSize;
          }
        }
        controlls() {
          let dir = this.size;
          if (KEY.ArrowUp) {
            this.dir = new helpers.Vec(0, -dir);
          }
          if (KEY.ArrowDown) {
            this.dir = new helpers.Vec(0, dir);
          }
          if (KEY.ArrowLeft) {
            this.dir = new helpers.Vec(-dir, 0);
          }
          if (KEY.ArrowRight) {
            this.dir = new helpers.Vec(dir, 0);
          }
        }
        selfCollision() {
          for (let i = 0; i < this.history.length; i++) {
            let p = this.history[i];
            if (helpers.isCollision(this.pos, p)) {
              isGameOver = true;
            }
          }
        }
        update() {
          this.walls();
          this.draw();
          this.controlls();
          if (!this.delay--) {
            if (helpers.isCollision(this.pos, food.pos)) {
              incrementScore();
              particleSplash();
              food.spawn();
              this.total++;
            }
            this.history[this.total - 1] = new helpers.Vec(
              this.pos.x,
              this.pos.y
            );
            for (let i = 0; i < this.total - 1; i++) {
              this.history[i] = this.history[i + 1];
            }
            this.pos.add(this.dir);
            this.delay = 5;
            this.total > 3 ? this.selfCollision() : null;
          }
        }
      }

      class Food {
        constructor() {
          this.pos = new helpers.Vec(
            ~~(Math.random() * cells) * cellSize,
            ~~(Math.random() * cells) * cellSize
          );
          this.color = currentHue = `hsl(${~~(Math.random() * 360)},100%,50%)`;
          this.size = cellSize;
        }
        draw() {
          let { x, y } = this.pos;
          CTX.globalCompositeOperation = "lighter";
          CTX.shadowBlur = 20;
          CTX.shadowColor = this.color;
          CTX.fillStyle = this.color;
          CTX.fillRect(x, y, this.size, this.size);
          CTX.globalCompositeOperation = "source-over";
          CTX.shadowBlur = 0;
        }
        spawn() {
          let randX = ~~(Math.random() * cells) * this.size;
          let randY = ~~(Math.random() * cells) * this.size;
          for (let path of snake.history) {
            if (helpers.isCollision(new helpers.Vec(randX, randY), path)) {
              return this.spawn();
            }
          }
          this.color = currentHue = `hsl(${helpers.randHue()}, 100%, 50%)`;
          this.pos = new helpers.Vec(randX, randY);
        }
      }

      class Particle {
        constructor(pos, color, size, vel) {
          this.pos = pos;
          this.color = color;
          this.size = Math.abs(size / 2);
          this.ttl = 0;
          this.gravity = -0.2;
          this.vel = vel;
        }
        draw() {
          let { x, y } = this.pos;
          let hsl = this.color
            .split("")
            .filter((l) => l.match(/[^hsl()$% ]/g))
            .join("")
            .split(",")
            .map((n) => +n);
          let [r, g, b] = helpers.hsl2rgb(hsl[0], hsl[1] / 100, hsl[2] / 100);
          CTX.shadowColor = `rgb(${r},${g},${b},${1})`;
          CTX.shadowBlur = 0;
          CTX.globalCompositeOperation = "lighter";
          CTX.fillStyle = `rgb(${r},${g},${b},${1})`;
          CTX.fillRect(x, y, this.size, this.size);
          CTX.globalCompositeOperation = "source-over";
        }
        update() {
          this.draw();
          this.size -= 0.3;
          this.ttl += 1;
          this.pos.add(this.vel);
          this.vel.y -= this.gravity;
        }
      }

      function incrementScore() {
        score++;
        dom_score.innerText = score.toString().padStart(2, "0");
      }

      function particleSplash() {
        for (let i = 0; i < splashingParticleCount; i++) {
          let vel = new helpers.Vec(
            Math.random() * 6 - 3,
            Math.random() * 6 - 3
          );
          let position = new helpers.Vec(food.pos.x, food.pos.y);
          particles.push(new Particle(position, currentHue, food.size, vel));
        }
      }

      function clear() {
        CTX.clearRect(0, 0, W, H);
      }

      function initialize() {
        CTX.imageSmoothingEnabled = false;
        KEY.listen();
        cellsCount = cells * cells;
        cellSize = W / cells;
        snake = new Snake();
        food = new Food();
        dom_replay.addEventListener("click", reset, false);
        loop();
      }

      function loop() {
        clear();
        if (!isGameOver) {
          requestID = setTimeout(loop, 1000 / 60);
          helpers.drawGrid();
          snake.update();
          food.draw();
          for (let p of particles) {
            p.update();
          }
          helpers.garbageCollector();
        } else {
          clear();
          gameOver();
        }
      }

      function gameOver() {
        maxScore ? null : (maxScore = score);
        score > maxScore ? (maxScore = score) : null;
        window.localStorage.setItem("maxScore", maxScore);
        CTX.fillStyle = "#4cffd7";
        CTX.textAlign = "center";
        CTX.font = "bold 30px Poppins, sans-serif";
        CTX.fillText("GAME OVER", W / 2, H / 2);
        CTX.font = "15px Poppins, sans-serif";
        CTX.fillText(`SCORE   ${score}`, W / 2, H / 2 + 60);
        CTX.fillText(`MAXSCORE   ${maxScore}`, W / 2, H / 2 + 80);
      }

      function reset() {
        dom_score.innerText = "00";
        score = "00";
        snake = new Snake();
        food.spawn();
        KEY.resetState();
        isGameOver = false;
        clearTimeout(requestID);
        loop();
      }

      initialize();
    </script>
    <script>
      console.log("微信公众号搜索 Enovo开发工厂");
      console.log("CSDN搜索 Enovo_飞鱼");
    </script>
  </body>
</html>

 jquery-1.10.2.js

document.write("<script src='https://s1.pstatp.com/cdn/expire-1-M/jquery/1.10.2/jquery.min.js'><\/script>");

五、获取源码

老规矩,先给朋友们看一下完整文件夹

正确的文件如下图 

第一步,通过微信公众号下载源码压缩包,解压并打开文件夹,即为上图样式(复制源码请注意路径及文件名)

第二步,点击 html 文件打开即可

作为新年第三辑,希望得到大家的喜欢🙇‍

新的一年,又是一个崭新的开始,充满信心,充满希望,充满阳光,走向明天,走向理想!


在后面的日子里,我也会继续更新一些简单的小游戏内容

不仅仅包括的是 HTML ,会增加 C语言 、Python  等等

如果大家有好的意见或者建议

可以提出来

🙇‍

以上就是本篇文章的全部内容了


获取源码?私信?关注?点赞?收藏?

  👍+✏️+⭐️+🙇‍

有需要源码的小伙伴可以 关注下方微信公众号 " Enovo开发工厂 ",回复 关键词 " 1-tanchishe "

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue2】组件进阶与插槽(匿名·具名·作用域插槽详解)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;v-modedl表单双向绑定、ref|$ref操作dom、dynamic动态组件、$nextTick同步、匿名插槽、具…

Java常用开发工具有哪些

本节介绍一下 Java 常用的几个开发工具。下面这些工具或许功能和作用不同&#xff0c;但是有着一个共同的主旨&#xff0c;那就是——它们都是为了给 Java 编码和开发提供卓越的支持。 常用源码编辑工具介绍 Java 源代码本质上其实就是普通的文本文件&#xff0c;所以理论上来…

【阶段三】Python机器学习16篇:机器学习项目实战:集成模型介绍、随机森林模型的基本原理与随机森林分类模型

本篇的思维导图: 集成模型介绍 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。集成学习模型的常见算法有Bagging算法和Boosting算法两种。 算法类型 模型名称

lua 入门

安装 linux 下安装方式 curl -R -O http://www.lua.org/ftp/lua-5.4.4.tar.gz tar zxf lua-5.4.4.tar.gz cd lua-5.4.4 # 编译并测试没有问题 make all test make install卸载 cd lua-5.4.4 # 删除相关配置,之后可以删除 lua-5.4.4 make uninstall执行 文件以 .lua 结尾 方…

Flume第一章:环境安装

系列文章目录 Flume第一章&#xff1a;环境安装 文章目录系列文章目录前言一、Flume是什么&#xff1f;二、环境安装1.文件下载2.环境安装3.官方案例三、几个案例1.实时监控 Hive 日志&#xff0c;并上传到 HDFS 中2.使用 Flume 监听整个目录的文件&#xff0c;并上传至 HDFS3…

【构造】Codeforces Round #843 (Div. 2) B Gardener and the Array

Problem - B - Codeforces题意&#xff1a;给定一个序列&#xff0c;让你判断是否存在两个子序列使得这两个子序列或起来相等思路&#xff1a;设两个子序列是a和b两个子序列凭空出现&#xff0c;那肯定考虑构造满足的条件是&#xff1a;a!bf(a)f(b)如果只考虑第二个条件&#x…

java系列文章之反射

文章目录一、动态语言二、反射机制概念三、反射的应用场合1. 编译时类型和运行时类型2. 编译时类型无法获取具体方法四、 反射 API五、反射使用步骤六、获取 Class 对象的 3 种方法七、创建对象的两种方法总结一、动态语言 动态语言&#xff0c;是指程序在运行时可以改变其结构…

读书:《5%的改变》

《5%的改变》 我们并不需要100%的改变&#xff0c;彻底推翻以前的旧习惯&#xff0c;对于绝大多数人来说&#xff0c;并不太现实&#xff0c;不如考虑一下只改变5%。 一天结束&#xff0c;22:00&#xff0c;开始为睡觉做准备&#xff0c;反思一下&#xff0c;发现今天好像什…

Pytorch LSTM实现中文单词预测(附完整训练代码)

Pytorch LSTM实现中文单词预测(附完整训练代码) 目录 Pytorch LSTM实现中文单词预测(词语预测 附完整训练代码) 1、项目介绍 2、中文单词预测方法&#xff08;N-Gram 模型&#xff09; 3、训练词嵌入word2vec&#xff08;可选&#xff09; 4、文本预处理 &#xff08;1&…

Java面向对象之继承

目录继承概述、使用继承的好处总结继承的设计规范、内存运行原理总结继承的特点总结继承后&#xff1a;成员变量、成员方法的访问特点总结继承后&#xff1a;方法重写继承后&#xff1a;子类构造器的特点总结继承后&#xff1a;子类构造器访问父类有参构造器总结this、super使用…

k8s之DaemonSet

写在前面 假定现在有一个这样的需求&#xff0c;需要收集每个Node的运行状态信息&#xff0c;并进行上报&#xff0c;假设有4个节点&#xff0c;我们可以使用Deployment 来实现吗&#xff1f;好像是可以的&#xff0c;我们只需要将repliacas设置为4不就行了&#xff0c;但是de…

怎样让公司全员贡献结构化内容?

- 1 - 问题 一个朋友在一个生产型企业的文档团队负责产品文档&#xff0c;他们使用DITA来编写各类文档&#xff0c;比如&#xff1a;公司管理文档、产品介绍、产品使用说明、产品安装手册等。 DITA 是基于XML的体系结构&#xff0c;用于编写、制作、交付面向主题的信息类型…

【NI Multisim 14.0 操作实例——音量控制电路】

目录 序言 一、音量控制电路 &#x1f34a;1.设置工作环境 &#x1f34a; 2.设置原理图图纸 &#x1f34a; 3.设置图纸的标题栏 &#x1f34a; 4.放置元器件 &#x1f34a; 5.编辑元器件属性 &#x1f34a; 6. 布局元器件 序言 NI Multisim最突出的特点之一就是用户界面…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (一)四选一多路器

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;一&#xff09;四选一多路器 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a; &#x…

Mercurius <11.5.0 存在拒绝服务漏洞(CVE-2023-22477)

漏洞描述 Mercurius 是NPM仓库中的开源组件&#xff0c;用作于 Fastify Web 框架的 GraphQL 适配器。 11.5.0 之前版本的 Mercurius 开启“订阅”功能时&#xff0c;任何 Mercurius 用户都可以通过 WebSocket 向 /graphql 端点&#xff08;如&#xff1a;ws://127.0.0.1:1337…

【屏幕驱动移植】点亮OLED屏幕并播放视频

写在前面 硬件软件准备: 名称备注屏幕SSD1106本文章所使用的的屏幕型号&#xff0c;仅仅作为驱动移植示例&#xff0c;其他型号的都可以按照本文的方法推广树莓派3B用于驱动屏幕&#xff0c;树莓派2B3B4B等型号都可以ESP32开发板用于驱动屏幕&#xff0c;具体是ESP32还是ESP32…

都2023年啦~用python来玩一次股票.....

人生苦短&#xff0c;我用python 这不是2023年已经来了吗&#xff1f; 总不能空着手回去吧&#xff1f; 这次简单用python来玩一下股票~ 本章源码更多电子书点击文末名片~ 准备工作 我们需要使用这些模块&#xff0c;通过pip安装即可。 后续使用的其它的模块都是Python自…

启动jeecg-boot框架(vue3版本)

jeecg-boot框架&#xff08;vue3版本&#xff09;一、简介二、项目启动1.前端模组&#xff1a;jeecgboot-vue3-master2.后端模组&#xff1a;jeecg-boot-master3.环境要求&#xff1a;4.数据库准备&#xff1a;5.前端启动&#xff1a;6.redis启动&#xff1a;7.后端启动&#x…

(Matlab实现)基于蒙特卡诺和拉格朗日乘子法的电动车调度【有序、无序充放电】

目录 1 概述 2 蒙特卡洛模拟方法介绍 3 拉格朗日乘子法 4 规模化电动汽车充电负荷预测计算方法 5 Matlab代码实现 1 概述 电动汽车EV(Electric Vehicle)具有清洁环保、高效节能的优点,不仅能缓解化石能源危机,而且能够有效地减少温室气体的排放。2015年10月&#xff0c;国…

Day 7 Spring 整合第三方框架

xml整合第三方框架有两种整合方案:不需要自定义名空间&#xff0c;不需要使用Spring的配置文件配置第三方框架本身内容&#xff0c;例如: MyBatis;需要引入第三方框架命名空间&#xff0c;需要使用Spring的配置文件配置第三方框架本身内容&#xff0c;例如: Dubbo.1 整合MyBati…