HTML实现 扫雷游戏

前言:

游戏起源与发展

  • 扫雷游戏的雏形可追溯到 1973 年的 "方块(cube)" 游戏,后经改编出现了 "rlogic" 游戏,玩家需为指挥中心探出安全路线避开地雷。在此基础上,开发者汤姆・安德森编写出了扫雷游戏的雏形.

  • 1992 年,微软在 windows3.1 系统中首次预装了《扫雷》,将其作为训练用户鼠标操作能力的软件.

  • 虽从 windows8 开始,系统不再默认安装扫雷游戏,但它依旧凭借自身魅力受到众多玩家喜爱,甚至有玩家不断刷新时间记录来挑战自我.

游戏规则

  • 胜利条件:找出所有地雷且不踩到地雷,或者在规定时间内尽可能多地找出地雷.

  • 失败条件:翻开了埋有地雷的方块.

  • 基础操作:左键点击未打开的格子可将其打开;右键点击可标雷 / 取消标雷;双击(左右键同时点击)已打开的数字,若该数字周围标的雷数量等于该数字,会同时打开该数字周围剩余所有格子.

游戏界面及信息

  • 剩余雷数:显示在游戏界面左上角,为总雷数减去已标雷数,可据此了解雷区剩余雷的大致情况.

  • 计时器:位于右上角,从本局游戏第一次操作为 0.001 秒开始计时,可用于记录游戏所用时间及玩家挑战自我时作为参考

技巧与策略

  • 数字推理:数字代表其周围 8 个方格中的雷数,若数字为 0,游戏会自动打开周围所有格子;若一个方格周围已标记的雷数等于该方格上的数字,那么其周围未标记的方格都可安全打开.

  • 常见阵型判断:如 "111""22""112" 等常见数字组合,可依据特定规律快速判断雷的位置.

  • 边缘优先:可先从雷区边缘开始点击,因为边缘方格的周围方格数量相对较少,更容易判断雷的位置,降低推理难度7.

  • 标记问号:当无法确定方格是否有雷时,可右键点击两次标记问号,后续再根据其他信息进一步判断.

游戏变化与创新

  • 在线多人模式:如《一起来扫雷》,玩家可与世界各地的玩家合作或竞争,共同清除地图上的地雷,还能积累积分兑换装饰,装扮游戏界面.

  • VR 版扫雷:扫雷 VR 将平面的扫雷游戏搬到了 3D 场景中,增加了游戏的趣味性和沉浸感.

  • 融合其他元素:《扫雷俄罗斯方块》结合了扫雷和俄罗斯方块的元素,雷区不断向上生长,找到所有地雷时行才会被清除

以上内容由ai生成

正文:

1.自己实现一个扫雷游戏

2.使用HTML实现

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>扫雷游戏</title>
    <link
      href="https://fonts.googleapis.com/css?family=Space+Mono:400,700"
      rel="stylesheet"
    />
    <link
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css"
    />
    <style>
      @charset "UTF-8";
      *,
      *:before,
      *:after {
        box-sizing: inherit;
      }

      html {
        box-sizing: border-box;
      }

      body {
        text-align: center;
        color: #333;
        padding: 20px 20px 100px;
        background-color: #efefef;
        font-family: 'Space Mono', monospace;
      }

      h1 {
        margin: 0 0 32px;
      }

      p {
        font-size: 1em;
        line-height: 1.25em;
      }

      a {
        color: inherit;
      }

      img {
        height: auto;
        max-width: 100%;
      }

      .wrap {
        text-align: center;
        position: relative;
        display: inline-block;
      }

      .legend {
        font-size: 14px;
        margin: 0 auto 32px;
      }
      .legend h4,
      .legend p {
        margin: 0 0 6px;
      }
      .legend code {
        background: #e3e3e3;
      }
      .legend code .key {
        color: #ec433c;
      }
      .legend code .click {
        color: #2a48ec;
      }

      .top {
        border: 6px solid #e3e3e3;
        background-color: #e3e3e3;
      }

      #scoreboard {
        display: flex;
        padding-bottom: 12px;
        justify-content: space-between;
      }
      #scoreboard .select-wrap {
        font-weight: 700;
        vertical-align: top;
        display: inline-block;
      }
      #scoreboard .select-wrap select {
        margin: 0;
        height: 36px;
        border-radius: 0;
        border-width: 3px;
        border-style: solid;
        background-color: #d1d1d1;
        border-color: white #9e9e9e #9e9e9e white;
      }
      #scoreboard .select-wrap select:hover,
      #scoreboard .select-wrap select:focus {
        backgroudn-color: #ebebeb;
      }
      #scoreboard .reset {
        padding: 0 4px;
        font-size: 24px;
        cursor: pointer;
        font-weight: 700;
        line-height: 30px;
        border-width: 3px;
        border-style: solid;
        background-color: #d1d1d1;
        border-color: white #9e9e9e #9e9e9e white;
      }
      #scoreboard .reset:hover,
      #scoreboard .reset:focus {
        outline: none;
        background-color: #ebebeb;
      }
      #scoreboard .counter {
        padding: 0 4px;
        color: #ec433c;
        border: 3px inset;
        line-height: 30px;
        letter-spacing: 0.08em;
        display: inline-block;
        background: #333;
        text-shadow: 0 0 2px #ec433c;
      }
      #scoreboard .counter:first-of-type {
        margin-right: 20px;
      }
      #scoreboard .counter:last-of-type {
        margin-left: 20px;
      }

      #grid {
        margin: 0 auto;
        position: relative;
        display: inline-block;
      }
      #grid ::-moz-selection {
        background-color: transparent;
      }
      #grid ::selection {
        background-color: transparent;
      }
      #grid.disabled .cell {
        pointer-events: none;
      }
      #grid.disabled .status-indicator {
        top: 50%;
        left: 50%;
        z-index: 11;
        width: 8vw;
        height: 8vw;
        font-size: 4vw;
        cursor: pointer;
        line-height: 8vw;
        position: absolute;
        border-radius: 50%;
        pointer-events: auto;
        background-color: #d1d1d1;
        transform: translate(-50%, -50%);
        border: 1px solid rgba(51, 51, 51, 0.25);
      }
      #grid.disabled .status-indicator::after {
        content: '';
      }
      #grid.disabled.win .status-indicator::after {
        content: '😎';
      }
      #grid.disabled.lose .status-indicator::after {
        content: '☹️';
      }
      #grid .row {
        display: flex;
      }
      #grid .cell {
        cursor: pointer;
        width: 24px;
        height: 24px;
        position: relative;
        background-color: #d1d1d1;
        border-width: 3px;
        border-style: solid;
        border-color: white #9e9e9e #9e9e9e white;
      }
      #grid .cell i {
        left: 0;
        bottom: 0;
        margin: 0;
        width: 100%;
        font-size: 14px;
        font-weight: 700;
        font-style: normal;
        position: absolute;
        line-height: 24px;
      }
      #grid .cell::before {
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: 1;
        content: '';
        position: absolute;
        background-color: #d1d1d1;
      }
      #grid .cell::after {
        top: 50%;
        left: 50%;
        content: '';
        position: absolute;
        transform: translate(-50%, -50%);
      }
      #grid .cell:hover::before {
        background-color: #ebebeb;
      }
      #grid .cell.revealed {
        border: 1px solid #b8b8b8;
      }
      #grid .cell.revealed::before {
        display: none;
      }
      #grid .cell.revealed .flag {
        display: none;
      }
      #grid .cell .flag {
        top: 50%;
        left: 50%;
        z-index: 1;
        width: 10px;
        height: 4px;
        position: absolute;
        border-style: solid;
        border-width: 4px 0 4px 10px;
        transform: translate(-50%, -50%);
        border-color: transparent transparent transparent #ec433c;
      }
      #grid .cell.maybe .flag {
        border-color: transparent transparent transparent #d7af42;
      }
      #grid .cell.mine {
        background-color: #ec433c;
      }
      #grid .cell.mine::after {
        border-radius: 50%;
        width: 12px;
        height: 12px;
        background-color: #333;
      }
      #grid .cell.incorrect .flag::before,
      #grid .cell.incorrect .flag::after {
        top: 50%;
        z-index: 1;
        left: -13px;
        height: 2px;
        width: 16px;
        content: '';
        position: absolute;
        background-color: black;
      }
      #grid .cell.incorrect .flag::before {
        transform: rotate(-45deg);
      }
      #grid .cell.incorrect .flag::after {
        transform: rotate(45deg);
      }
      #grid .cell.mousedown {
        border: none;
      }

      #leaderboard {
        margin-top: 20px;
        text-align: center;
      }
      #leaderboard h4 {
        margin: 0 0 10px;
      }
      #leaderboard ul {
        margin: 0;
        padding: 10px;
        display: inline-block;
        background-color: rgba(209, 209, 209, 0.5);
      }
      #leaderboard ul li {
        padding: 2px;
        list-style: none;
      }
      #leaderboard ul li span {
        font-weight: 900;
        text-transform: capitalize;
      }
      #leaderboard ul li.highlight {
        background-color: #fef178;
      }
      #leaderboard button {
        border: none;
        outline: none;
        cursor: pointer;
        font-size: 12px;
        font-weight: 700;
        -webkit-appearance: none;
        -moz-appearance: none;
        appearance: none;
        background: none;
        text-decoration: underline;
      }

      .cell.white {
        color: #fff;
      }

      .cell.gray-light {
        color: #efefef;
      }

      .cell.gray-mid {
        color: #e3e3e3;
      }

      .cell.gray {
        color: #d1d1d1;
      }

      .cell.gray-dark {
        color: #808080;
      }

      .cell.black {
        color: #333;
      }

      .cell.red {
        color: #ec433c;
      }

      .cell.maroon {
        color: #a6070f;
      }

      .cell.purple {
        color: #a42887;
      }

      .cell.yellow {
        color: #d7af42;
      }

      .cell.yellow-light {
        color: #fef178;
      }

      .cell.blue {
        color: #2a48ec;
      }

      .cell.blue-dark {
        color: #233db7;
      }

      .cell.green {
        color: #2bb13d;
      }

      .cell.turquoise {
        color: #28907d;
      }

      #devbox {
        top: 10px;
        right: 10px;
        position: fixed;
        text-align: left;
        max-width: 300px;
        color: #fff;
        background-color: #333;
      }
      #devbox p {
        margin: 0;
        font-size: 12px;
        padding: 10px 20px;
      }
      #devbox p + p {
        padding-top: 5px;
      }
    </style>
  </head>
  <body>
    <header class="site-header" role="banner">
      <div class="wrap">
        <h1>扫雷</h1>
        <div class="legend">
          <p>
            <strong>插旗:</strong>
            <code
              ><span class="key">alt</span>+<span class="click"
                >click(单击)</span
              ></code
            >
          </p>
        </div>
      </div>
    </header>
    <main class="site-main" role="main">
      <div class="wrap">
        <div id="board">
          <div class="top">
            <div id="scoreboard">
              <div id="minecounter" class="counter"></div>
              <div>
                <div class="select-wrap">
                  <select name="level" id="level">
                    <option value="beginner">初级</option>
                    <option value="intermediate">中级</option>
                    <option value="expert" selected>高级</option>
                  </select>
                </div>
                <button class="reset">🙂</button>
              </div>
              <div id="timer" class="counter"></div>
            </div>
            <div id="grid"></div>
          </div>
          <div class="bottom"></div>
        </div>
      </div>
    </main>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
      $(document).ready(function () {
        var $body, $document, $board, $grid, timer, time, unstarted;

        function _init() {
          // Cache some common DOM queries
          $document = $(document);
          $body = $('body');
          $body.addClass('loaded');

          // Start Minesweeper
          $board = $('#board');
          $grid = $('#grid');
          var $timer = $('#timer');
          var $mineCounter = $('#minecounter');
          var $levelSelect = $('#level');
          var levels = {
            beginner: '9x9x10',
            intermediate: '16x16x44',
            expert: '16x30x99',
          };
          var level = $levelSelect.val();
          var levelParams,
            rows,
            $rows,
            columns,
            cellCount,
            mines,
            freeCells,
            mineTally,
            pauseTime,
            beginnerHighScore = 999,
            intermediateHighScore = 999,
            expertHighScore = 999;

          var countColors = {
            0: '',
            1: 'blue',
            2: 'green',
            3: 'red',
            4: 'blue-dark',
            5: 'maroon',
            6: 'turquoise',
            7: 'purple',
            8: 'gray-dark',
          };

          time = 0;
          timer = false;
          unstarted = true;
          var statusIndicator = '<div class="status-indicator"></div>';

          // Check for existing high score
          // if (localStorage.getItem('beginner')) {
          //   beginnerHighScore = localStorage.getItem('beginner');
          //   populateHighScore('beginner', localStorage.getItem('beginner'));
          // }
          // if (localStorage.getItem('intermediate')) {
          //   intermediateHighScore = localStorage.getItem('intermediate');
          //   populateHighScore('intermediate', localStorage.getItem('intermediate'));
          // }
          // if (localStorage.getItem('expert')) {
          //   expertHighScore = localStorage.getItem('expert');
          //   populateHighScore('expert', localStorage.getItem('expert'));
          // }

          function setLevel(level) {
            levelParams = levels[level];
            rows = parseInt(levelParams.split('x')[0]);
            columns = parseInt(levelParams.split('x')[1]);
            cellCount = rows * columns;
            mines = levelParams.split('x')[2];
            freeCells = cellCount - mines;
          }

          function setBoard(level) {
            // Clear Grid
            $grid
              .html(statusIndicator)
              .removeClass('disabled lose win')
              .addClass('unstarted');

            // Set Up Grid
            setLevel(level);

            // Set unstarted
            unstarted = true;

            // Build Rows
            for (r = 0; r < rows; r++) {
              var newCells = '';
              // Build Cells
              for (c = 0; c < columns; c++) {
                newCells += '<div class="cell"></div>';
              }
              $grid.append('<div class="row">' + newCells + '</div>');
            }

            // Set Minecounter
            mineTally = mines;
            $mineCounter.html(mineTally);

            // Set Timer
            resetTimer();
          }

          // Set initially
          setBoard(level);
          // Set on reset
          $('html')
            .on('mousedown', '.reset', function () {
              $(this).text('😮');
            })
            .on('mouseup', '.reset', function () {
              $(this).text('🙂');
              stopTimer();
              level = $levelSelect.val();
              setBoard(level);
            });
          // Set when clicking status indicator
          $('html').on('click', '.status-indicator', function () {
            level = $levelSelect.val();
            setBoard(level);
          });
          // Set on level change
          $levelSelect.on('change', function () {
            stopTimer();
            resetTimer();
            level = $levelSelect.val();
            setBoard(level);
          });

          // Lay Mines
          function layMines(level, clickedCellIndex) {
            $rows = $('.row');
            var freeCells = $('.cell');
            var takenCells = [clickedCellIndex];

            // Lay Mines
            for (m = 0; m < mines; m++) {
              var mineCell = Math.floor(
                Math.random() * Math.floor(freeCells.length)
              );
              // If it happens to be the clicked cell, skip it
              if ($.inArray(mineCell, takenCells) > -1) {
                m--;
                continue;
              }
              takenCells.push(mineCell);
              $(freeCells[mineCell]).addClass('mine');
            }

            // Identify Cell Numbers
            var $cells = $('.cell');
            for (c = 0; c < $cells.length; c++) {
              var $cell = $($cells[c]);
              $cell.attr('data-cell', c);
              // Skip if it's a mine
              if ($cell.is('.mine')) {
                continue;
              }

              var mineCount = 0;
              var rowPos = Math.floor(c / columns);
              var $currentRow = $cell.closest('.row');
              $currentRow.attr('data-row', rowPos);
              var rowCells = $currentRow.find('.cell');
              var cellPos = c % columns;

              if ($(rowCells[cellPos - 1]).is('.mine')) {
                mineCount++;
              }
              if ($(rowCells[cellPos + 1]).is('.mine')) {
                mineCount++;
              }

              if (rowPos > 0) {
                var prevRowCells = $($rows[rowPos - 1]).find('.cell');
                if ($(prevRowCells[cellPos - 1]).is('.mine')) {
                  mineCount++;
                }
                if ($(prevRowCells[cellPos]).is('.mine')) {
                  mineCount++;
                }
                if ($(prevRowCells[cellPos + 1]).is('.mine')) {
                  mineCount++;
                }
              }

              if (rowPos < rows - 1) {
                var nextRowCells = $($rows[rowPos + 1]).find('.cell');
                if ($(nextRowCells[cellPos - 1]).is('.mine')) {
                  mineCount++;
                }
                if ($(nextRowCells[cellPos]).is('.mine')) {
                  mineCount++;
                }
                if ($(nextRowCells[cellPos + 1]).is('.mine')) {
                  mineCount++;
                }
              }

              if (mineCount > 0) {
                $cell.html('<i>' + mineCount + '</i>');
                // Styling classes
                var colorClass = countColors[mineCount];
                $cell.addClass(colorClass);
              } else {
                $cell.addClass('zero');
              }
            }
          }

          // Click cell to start game
          $('html')
            .off('click', '#grid.unstarted .cell')
            .on('click', '#grid.unstarted .cell', function (e) {
              $grid.removeClass('unstarted');
              if (unstarted && !$(e.target).is('.mine')) {
                layMines(level, $('.cell').index(this));
                timer = window.setInterval(startTimer, 1000);
                unstarted = false;
              }
            });

          // Timer Functions
          function resetTimer() {
            $timer.html('000');
            time = 0;
          }
          function startTimer() {
            time++;
            if (time < 10) {
              $timer.html('00' + time);
            } else if (time > 9 && time < 100) {
              $timer.html('0' + time);
            } else {
              $timer.html(time);
            }
          }

          function stopTimer() {
            window.clearInterval(timer);
          }

          function pauseTimer() {
            stopTimer();
            pauseTime = parseInt($('#timer').html());
          }

          function unpauseTimer() {
            time = pauseTime;
            timer = window.setInterval(startTimer, 1000);
            pauseTime = false;
          }

          // Pause when window loses focus
          $(window)
            .on('blur', function () {
              pauseTimer();
            })
            .on('focus', function () {
              if (pauseTime) {
                unpauseTimer();
              }
            });

          // Check Cell
          function checkCell($cell) {
            if (!$cell.is('.mine') && !$cell.is('.revealed')) {
              cellClick($cell, 'reveal');

              if ($cell.is('.zero')) {
                $cell.trigger('click');
              }
            }
          }

          // Clicking on a cell
          function cellClick($cell, action) {
            // If Flagging
            if (action === 'flag' && !$cell.is('.revealed')) {
              if ($cell.is('.flagged')) {
                $cell.removeClass('flagged');
                $cell.addClass('maybe');
                mineTally++;
                updateMinecounter(mineTally);
              } else if ($cell.is('.maybe')) {
                $cell.removeClass('maybe');
                var flag = $cell.find('.flag');
                flag.remove();
              } else {
                $cell.addClass('flagged');
                $cell.append('<span class="flag"></span>');
                mineTally--;
                updateMinecounter(mineTally);
              }
              // If Revealing
            } else if (action === 'reveal') {
              $cell.addClass('revealed');

              // If it's a mine you lose!
              if ($cell.is('.mine')) {
                lose();
              }

              statusCheck();
            } else if (action === 'clear') {
              if (!$cell.is('.revealed') || $cell.is('.zero')) {
                return;
              }

              clearClick($cell);
            }
          }

          // Update Minecounter
          function updateMinecounter(mineTally) {
            if (mineTally < 10) {
              $mineCounter.html('0' + mineTally);
            } else {
              $mineCounter.html(mineTally);
            }
          }

          // Clicking on a Zero cell
          function zeroClick($cell) {
            var cellPos = $cell.prevAll().length;
            var $currentRow = $cell.closest('.row');
            var rowPos = parseInt($currentRow.attr('data-row'));
            var rowCells = $currentRow.find('.cell');

            checkCell($(rowCells[cellPos - 1]));
            checkCell($(rowCells[cellPos + 1]));

            if (rowPos > 0) {
              var prevRowCells = $($rows[rowPos - 1]).find('.cell');
              checkCell($(prevRowCells[cellPos - 1]));
              checkCell($(prevRowCells[cellPos]));
              checkCell($(prevRowCells[cellPos + 1]));
            }

            if (rowPos < rows) {
              var nextRowCells = $($rows[rowPos + 1]).find('.cell');
              checkCell($(nextRowCells[cellPos - 1]));
              checkCell($(nextRowCells[cellPos]));
              checkCell($(nextRowCells[cellPos + 1]));
            }
          }

          // Clicking on a number to clear free cells
          function clearClick($cell) {
            var cellPos = $cell.prevAll().length;
            var $currentRow = $cell.closest('.row');
            var rowPos = parseInt($currentRow.attr('data-row'));
            var rowCells = $currentRow.find('.cell');
            var adjacentCells = [];
            var correctClear = true;
            var adjacentMines = 0;
            var adjacentFlags = 0;
            var i;
            adjacentCells.push($(rowCells[cellPos - 1]));
            adjacentCells.push($(rowCells[cellPos + 1]));

            if (rowPos > 0) {
              var prevRowCells = $($rows[rowPos - 1]).find('.cell');
              adjacentCells.push($(prevRowCells[cellPos - 1]));
              adjacentCells.push($(prevRowCells[cellPos]));
              adjacentCells.push($(prevRowCells[cellPos + 1]));
            }

            if (rowPos < rows) {
              var nextRowCells = $($rows[rowPos + 1]).find('.cell');
              adjacentCells.push($(nextRowCells[cellPos - 1]));
              adjacentCells.push($(nextRowCells[cellPos]));
              adjacentCells.push($(nextRowCells[cellPos + 1]));
            }

            for (i = 0; i < adjacentCells.length; i++) {
              // add to mine count
              if ($(adjacentCells[i]).is('.mine')) {
                adjacentMines++;
              }
              // add to flag cout
              if ($(adjacentCells[i]).is('.flagged')) {
                adjacentFlags++;
              }
            }

            if (adjacentFlags === adjacentMines) {
              for (i = 0; i < adjacentCells.length; i++) {
                if ($(adjacentCells[i]).is('.mine')) {
                  if ($(adjacentCells[i]).is('.flagged')) {
                    continue;
                  } else {
                    $(adjacentCells[i]).addClass('revealed');
                    correctClear = false;
                  }
                } else if ($(adjacentCells[i]).is('.flagged')) {
                  correctClear = false;
                  $(adjacentCells[i]).addClass('incorrect');
                  lose();
                }
              }

              if (correctClear) {
                for (i = 0; i < adjacentCells.length; i++) {
                  if (!$(adjacentCells[i]).is('.mine')) {
                    if ($(adjacentCells[i]).is('.zero')) {
                      zeroClick($(adjacentCells[i]));
                    }
                    cellClick($(adjacentCells[i]), 'reveal');
                  }
                }
              }
            } else {
              return;
            }
          }

          // Check status
          function statusCheck() {
            if ($('.cell.revealed').length == freeCells) {
              stopTimer();
              var winTime = $('#timer').html();
              $grid.addClass('disabled win');
              resetHighScore(level, winTime);
            }
          }

          function lose() {
            $grid.addClass('disabled lose');
            stopTimer();
          }

          // Clicking on a cell
          $('html').on('click', '.cell', function (e) {
            e.preventDefault();
            var action = 'reveal';
            var $cell = $(this);

            if (e.altKey || e.which === 3) {
              action = 'flag';
            } else if (
              $cell.is('.revealed') ||
              (e.which === 1) & (e.which === 3)
            ) {
              action = 'clear';
            }

            if ($cell.is('.flagged') && !e.altKey) {
              return;
            }

            if ($cell.is('.zero')) {
              zeroClick($cell);
            }

            cellClick($cell, action);
          });

          // Mouse down on a cell
          $('html')
            .on('mousedown', '.cell:not(.revealed,.flagged)', function (e) {
              if (!e.altKey && e.which !== 3) {
                $(this).addClass('mousedown');
              }
            })
            .on('mouseup mouseleave', '.cell.mousedown', function () {
              $(this).removeClass('mousedown');
            });

          // Scoreboard functionality
          function resetHighScore(level, winTime) {
            if (localStorage.getItem(level)) {
              if (winTime < localStorage.getItem(level)) {
                localStorage.setItem(level, winTime);
                populateHighScore(level, winTime, true);
              }
            } else {
              localStorage.setItem(level, winTime);
              populateHighScore(level, winTime, true);
            }
          }

          function populateHighScore(level, highScore, highlight) {
            if (!$('#leaderboard').length) {
              $board
                .find('.bottom')
                .append(
                  '<div id="leaderboard"><h4>High Scores</h4><ul><li class="beginner"></li><li class="intermediate"></li><li class="expert"></li></ul><div><button id="score-reset" class="score-reset">Clear Scores</button></div></div>'
                );
            }
            if (highlight === true) {
              $('#leaderboard .highlight:not(.' + level + ')').removeClass(
                'highlight'
              );
              $('#leaderboard .' + level).addClass('highlight');
            }
            var highScoreDisplay = parseInt(highScore, 10);
            $('#leaderboard .' + level).html(
              '<span>' + level + '</span>: ' + highScoreDisplay + ' seconds'
            );
          }

          function clearScores() {
            localStorage.clear();
            $('#leaderboard').remove();
          }

          // Clicking on score reset to clear scores
          $('html').on('click', '#score-reset', clearScores);
        }

        _init();
      });
    </script>
  </body>
</html>

3.电脑单机就可玩耍

最后:

你今天扫雷了吗?后台回复"扫雷"获取在线连接。
扫雷游戏

相关推荐
张晓~183399481212 小时前
碰一碰发抖音源码技术搭建部署方案
线性代数·算法·microsoft·矩阵·html5
某柚啊1 天前
iOS移动端H5键盘弹出时页面布局异常和滚动解决方案
前端·javascript·css·ios·html5
huangql5202 天前
截图功能技术详解:从原理到实现的完整指南
前端·html5
java水泥工3 天前
基于Echarts+HTML5可视化数据大屏展示-电信厅店营业效能分析
前端·echarts·html5·大屏展示
月光技术杂谈3 天前
用Deepseek 实现一个基于web的扣图应用
前端·javascript·html5·ccs·tensorflow.js·canvas api
.生产的驴4 天前
React useEffect组件渲染执行操作 组件生命周期 监视器 副作用
前端·css·react.js·ajax·前端框架·jquery·html5
ZTLJQ5 天前
植物大战僵尸HTML5游戏完整实现教程
前端·游戏·html5
Hello123网站5 天前
300多个Html5小游戏列表和下载地址
前端·html·html5
rising start6 天前
前端基础一、HTML5
前端·html·html5
tryCbest7 天前
Html5实现弹出表单
html5