js 小游戲:貪吃蛇

  • 代碼優(yōu)化空間很大,只是最基礎(chǔ)的钓株,剩下一些簡單的功能不想去寫了戴陡。
  • 可以根據(jù)自己的想法去改變整個(gè)代碼的樣式
  • 以下是貪吃蛇全部代碼褂萧,CV瀏覽器運(yùn)行就行
//snake_eat.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .waice_box {
        overflow: hidden;
        background-image: radial-gradient(#f0c6cc 50%, transparent 0);
        background-size: 20px 20px;
        width: 1000px;
        height: 1000px;
        position: relative;
        background-color: #1e1e4845;
      }
      .sanke_body {
        position: absolute;
        top: 0px;
        width: 20px;
        height: 20px;
        background-color: black;
        border-radius: 50%;
      }
      .snake_food {
        background-color: aquamarine;
        width: 20px;
        height: 20px;
        position: absolute;
      }
      .snake_header {
        background-color: red;
      }
      .snake_footer {
        background-color: yellow;
      }
    </style>
  </head>
  <body>
    <div class="waice_box">
      <div class="sanke_body snake_header" style="left: 80px"></div>
      <div class="sanke_body" style="left: 60px"></div>
      <div class="sanke_body" style="left: 40px"></div>
      <div class="sanke_body" style="left: 20px"></div>
      <div class="sanke_body snake_footer" style="left: 0px"></div>
    </div>
  </body>
  <script>
    const box_dom = document.querySelector(".waice_box");
    let goFLag = "right";
    let food_x, food_y;

    //死亡檢測(cè)函數(shù)
    function ifDeath(arr) {
      let eatSelf = false;
      let eatWall = false;
      const newArr = new Set(
        arr.map((item) => {
          return JSON.stringify(item);
        })
      );
      if (
        arr[0].left > 1000 ||
        arr[0].top > 1000 ||
        arr[0].left < 0 ||
        arr[0].top < 0
      ) {
        eatWall = true;
      }
      if (newArr.size != arr.length) {
        eatSelf = true;
      } else {
        eatSelf = false;
      }
      return eatWall || eatSelf;
    }

    //食物刷新
    function randomFood() {
      const x = parseInt(Math.random() * 1000);
      const y = parseInt(Math.random() * 1000);
      const div = document.createElement("div");
      div.className = "snake_food";
      food_x = x - (x % 20);
      food_y = y - (y % 20);
      div.style.left = `${food_x}px`;
      div.style.top = `${food_y}px`;
      box_dom.appendChild(div);
    }
    randomFood();

    const snake_start = setInterval(() => {
      let snake_dom = document.querySelectorAll(".sanke_body");
      const snake_dom_style = Array.from(snake_dom).map((item, index) => {
        return {
          left: getComputedStyle(snake_dom[index]).left.split("px")[0],
          top: getComputedStyle(snake_dom[index]).top.split("px")[0],
        };
      });

      //死亡檢測(cè)
      if (ifDeath(snake_dom_style)) {
        clearInterval(snake_start);
        alert("over");
      }

      //吃食物
      if (
        Number(snake_dom_style[0].left) === food_x &&
        Number(snake_dom_style[0].top) === food_y
      ) {
        const snake_food_eat = document.querySelectorAll(".snake_food")[0];
        document.querySelectorAll(".snake_footer")[0].className = "sanke_body";
        console.log(snake_food_eat);
        snake_food_eat.className = "sanke_body snake_footer";
        snake_food_eat.style.left = "-100px";
        snake_food_eat.style.top = "-100px";
        randomFood();
      }

      //前進(jìn)
      Array.from(snake_dom).map((item, index) => {
        if (index === 0) {
          if (goFLag === "left") {
            item.style.left = `${Number(snake_dom_style[index].left) - 20}px`;
          } else if (goFLag === "up") {
            item.style.top = `${Number(snake_dom_style[index].top) - 20}px`;
          } else if (goFLag === "right") {
            item.style.left = `${Number(snake_dom_style[index].left) + 20}px`;
          } else {
            item.style.top = `${Number(snake_dom_style[index].top) + 20}px`;
          }
        } else {
          item.style.left = snake_dom_style[index - 1].left + "px";
          item.style.top = snake_dom_style[index - 1].top + "px";
        }
      });
    }, 100);

    //按鍵操作
    document.onkeydown = function (e) {
      if (e.keyCode === 37) {
        if (goFLag === "right") {
          return;
        }
        goFLag = "left";
      } else if (e.keyCode === 38) {
        if (goFLag === "down") {
          return;
        }
        goFLag = "up";
      } else if (e.keyCode === 39) {
        if (goFLag === "left") {
          return;
        }
        goFLag = "right";
      } else if (e.keyCode === 40) {
        if (goFLag === "up") {
          return;
        }
        goFLag = "down";
      }
    };
  </script>
</html>
1663299222661.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稻薇,一起剝皮案震驚了整個(gè)濱河市嫂冻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塞椎,老刑警劉巖桨仿,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異案狠,居然都是意外死亡服傍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門骂铁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吹零,“玉大人,你說我怎么就攤上這事拉庵〔右危” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵钞支,是天一觀的道長茫蛹。 經(jīng)常有香客問我,道長烁挟,這世上最難降的妖魔是什么婴洼? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮撼嗓,結(jié)果婚禮上柬采,老公的妹妹穿的比我還像新娘。我一直安慰自己静稻,他們只是感情好警没,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著振湾,像睡著了一般杀迹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上押搪,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天树酪,我揣著相機(jī)與錄音,去河邊找鬼大州。 笑死续语,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厦画。 我是一名探鬼主播疮茄,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼滥朱,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了力试?” 一聲冷哼從身側(cè)響起徙邻,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畸裳,沒想到半個(gè)月后缰犁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怖糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年帅容,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍伤。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡并徘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚷缭,到底是詐尸還是另有隱情饮亏,我是刑警寧澤耍贾,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布阅爽,位于F島的核電站,受9級(jí)特大地震影響荐开,放射性物質(zhì)發(fā)生泄漏付翁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一晃听、第九天 我趴在偏房一處隱蔽的房頂上張望百侧。 院中可真熱鬧,春花似錦能扒、人聲如沸佣渴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辛润。三九已至,卻和暖如春见秤,著一層夾襖步出監(jiān)牢的瞬間砂竖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工鹃答, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乎澄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓测摔,卻偏偏與公主長得像置济,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容