原生JS手写扫雷小游戏

简介: 实现一个完整的扫雷游戏需要一些复杂的逻辑和界面交互。我将为你提供一个简化版的扫雷游戏示例,帮助你入门。请注意,这只是一个基本示例,你可以根据自己的需求进行扩展和改进。

场景


实现一个完整的扫雷游戏需要一些复杂的逻辑和界面交互。我将为你提供一个简化版的扫雷游戏示例,帮助你入门。请注意,这只是一个基本示例,你可以根据自己的需求进行扩展和改进。



思路


  • 创建游戏板(Grid):


创建一个二维数组来表示游戏板格子,每个格子包含信息如是否是地雷、周围地雷数量、是否被揭示等。


  • 生成地雷:


在游戏板上随机生成指定数量的地雷位置,确保不重复。


  • 计算周围地雷数量:


遍历游戏板格子,对每个格子计算周围八个格子中地雷的数量,用于显示数字。


  • 揭示格子:


实现点击格子的交互,点击时根据格子状态进行不同操作。
如果是地雷,游戏结束。
如果是数字,显示数字。
如果是空白格子,递归地揭示周围的空白格子。


  • 标记地雷:


允许玩家标记可能的地雷格子,以帮助他们辨认哪些格子是地雷。
确保标记的数量与实际地雷数量一致。


  • 计时器:


开始计时器当游戏开始,停止计时器当游戏结束。
显示游戏进行的时间。


  • 游戏状态检测:


每次揭示格子或标记地雷后,检查游戏是否胜利或失败。


  • 胜利条件:所有非地雷格子都被揭示。

  • 失败条件:揭示到地雷格子。

  • 重新开始功能:


提供一个重新开始按钮,用于重置游戏状态。


  • 界面设计:


创建游戏界面,包括游戏板、计时器、标记地雷数等元素。
点击事件、按钮交互等用户界面交互。


  • 游戏难度设置(可选):


允许玩家选择不同的难度,调整地雷数量和游戏板大小。


  • 游戏结束界面:


在游戏结束时,显示一个弹出窗口或提示信息,展示游戏胜负结果。


代码


HTML


<body>
  <div class="header">
    <div class="timer" id="timer">Time: 0</div>
    <button class="restart-button" id="restartButton">Restart</button>
  </div>
  <div class="board" id="board"></div>
</body>


JS


 const board = document.getElementById('board');
const restartButton = document.getElementById('restartButton');
const timerDisplay = document.getElementById('timer');
const rows = 10;
const cols = 10;
const mines = 20;
let minePositions = [];
let revealedCells = 0;
let timer;
let seconds = 0;
function createBoard() {
  for (let i = 0; i < rows; i++) {
    for (let j = 0; j < cols; j++) {
      const cell = document.createElement('div');
      cell.classList.add('cell');
      cell.dataset.row = i;
      cell.dataset.col = j;
      board.appendChild(cell);
      cell.addEventListener('click', () => revealCell(cell));
    }
  }
}
function generateMines() {
  minePositions = [];
  while (minePositions.length < mines) {
    const row = Math.floor(Math.random() * rows);
    const col = Math.floor(Math.random() * cols);
    const position = `${row}-${col}`;
    if (!minePositions.includes(position)) {
      minePositions.push(position);
    }
  }
}
function startTimer() {
  timer = setInterval(() => {
    seconds++;
    timerDisplay.textContent = `Time: ${seconds}`;
  }, 1000);
}
function stopTimer() {
  clearInterval(timer);
}
function revealCell(cell) {
  const row = parseInt(cell.dataset.row);
  const col = parseInt(cell.dataset.col);
  const position = `${row}-${col}`;
  if (minePositions.includes(position)) {
    cell.textContent = '💣';
    console.log(cell.textContent,"cell");
    alert('炸弹💣');
    setTimeout(()=>{
      resetGame();
    },1000)
  } else {
    const minesAround = countMinesAround(row, col);
    cell.textContent = minesAround;
    cell.classList.add('revealed');
    revealedCells++;
  }
  // ...
  // 之前的 revealCell 函数代码不变
  if (revealedCells === rows * cols - mines) {
    stopTimer();
    alert('Congratulations! You win!');
    resetGame();
  }
}
function countMinesAround(row, col) {
  let count = 0;
  for (let i = -1; i <= 1; i++) {
    for (let j = -1; j <= 1; j++) {
      const newRow = row + i;
      const newCol = col + j;
      const position = `${newRow}-${newCol}`;
      if (minePositions.includes(position)) {
        count++;
      }
    }
  }
  return count;
}
function resetGame() {
  board.innerHTML = '';
  revealedCells = 0;
  seconds = 0;
  timerDisplay.textContent = `Time: ${seconds}`;
  stopTimer();
  generateMines();
  createBoard();
  startTimer();
}
restartButton.addEventListener('click', resetGame);
generateMines();
createBoard();
startTimer();


CSS


 .header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 10px;
}
.timer {
  font-size: 18px;
}
.restart-button {
  padding: 5px 10px;
  font-size: 16px;
  background-color: #007bff;
  color: white;
  border: none;
  cursor: pointer;
}
.board {
  display: grid;
  grid-template-columns: repeat(10, 30px);
  gap: 2px;
}
.cell {
  width: 30px;
  height: 30px;
  border: 1px solid #ccc;
  text-align: center;
  line-height: 30px;
  font-size: 18px;
  cursor: pointer;
}


452fc0d979e945b6bc746cbab77564b3.gif

以上就是js手写扫雷小游戏感谢大家的阅读


如碰到其他的问题 可以私下我 一起探讨学习


如果对你有所帮助还请 点赞 收藏谢谢~!


关注收藏博客 作者会持续更新…

相关文章
|
25天前
|
JavaScript
JS实现简单的打地鼠小游戏源码
这是一款基于JS实现简单的打地鼠小游戏源码。画面中的九宫格中随机出现一个地鼠,玩家移动并点击鼠标控制画面中的锤子打地鼠。打中地鼠会出现卡通爆破效果。同时左上角统计打地鼠获得的分数
53 1
|
23天前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
29 3
|
23天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
30 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
24天前
|
移动开发 HTML5
html5+three.js公路开车小游戏源码
html5公路开车小游戏是一款html5基于three.js制作的汽车开车小游戏源代码,在公路上开车网页小游戏源代码。
54 0
html5+three.js公路开车小游戏源码
|
24天前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
33 0
JS趣味打字金鱼小游戏特效源码
|
3月前
|
JavaScript 前端开发 开发工具
五子棋小游戏(JS+Node+Websocket)可分房间对战
本文介绍了通过JS、Node和WebSocket实现的五子棋游戏,支持多人在线对战和观战功能。
61 1
五子棋小游戏(JS+Node+Websocket)可分房间对战
|
3月前
|
移动开发 前端开发 JavaScript
JS配合canvas实现贪吃蛇小游戏_升级_丝滑版本_支持PC端和移动端
本文介绍了一个使用JavaScript和HTML5 Canvas API实现的贪吃蛇游戏的升级版本,该版本支持PC端和移动端,提供了丝滑的转向效果,并允许玩家通过键盘或触摸屏控制蛇的移动。代码中包含了详细的注释,解释了游戏逻辑、食物生成、得分机制以及如何响应不同的输入设备。
69 1
JS配合canvas实现贪吃蛇小游戏_升级_丝滑版本_支持PC端和移动端
|
3月前
|
移动开发 前端开发 JavaScript
JS配合canvas实现贪吃蛇小游戏
本文通过详细的代码示例介绍了如何使用JavaScript和HTML5的Canvas API实现一个贪吃蛇游戏,包括蛇的移动、食物的生成、游戏的开始与结束逻辑,以及如何响应键盘事件来控制蛇的方向。
47 1
|
3月前
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
39 0
原生JavaScript+canvas实现五子棋游戏_值得一看
|
4月前
|
Devops 持续交付 测试技术
JSF遇上DevOps:开发流程将迎巨变?一篇文章带你领略高效协同的魅力!
【8月更文挑战第31天】本文探讨了如何在JavaServer Faces(JSF)开发中融入DevOps文化,通过持续集成与部署、自动化测试、监控与日志记录及反馈机制,提升软件交付速度与质量。文中详细介绍了使用Jenkins进行自动化部署、JUnit与Selenium进行自动化测试、ELK Stack进行日志监控的具体方法,并强调了持续改进的重要性。
41 0