原生JS手写扫雷小游戏

news2025/2/13 2:01:10

场景

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

思路

  • 创建游戏板(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;
}

在这里插入图片描述
以上就是js手写扫雷小游戏感谢大家的阅读
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请 点赞 收藏谢谢~!
关注收藏博客 作者会持续更新…

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

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

相关文章

Vue [Day7] 综合案例

核心概念回顾 state&#xff1a;提供数据 getters&#xff1a;提供与state相关的计算属性 mutations&#xff1a;提供方法&#xff0c;用于修改state actions&#xff1a;存放异步操作 modules&#xff1a;存模块 功能分析 https://www.npmjs.com/package/json-server#ge…

企业运单管理教程

随着电子面单的普及&#xff0c;以及商务寄件稳步增加&#xff0c;快递公司为了留住商企客户&#xff0c;推出了月结协议模式寄件。企业可以根据寄件量大小&#xff0c;和快递公司签订月结协议&#xff0c;运费每月结算一次&#xff0c;还能根据自身的寄件量&#xff0c;向快递…

评述6种室内定位技术的底层原理及未来展望

从古至今&#xff0c;人类始终关心一个颇具哲学意味的问题——“我在哪里”。从千年前的人类在夜空下遥望星河&#xff0c;到依靠经验和模糊的观测绘制的初具现代化意味的地图&#xff0c;再到近现代人类在计算机技术、无线通信技术甚至空间技术的帮助下&#xff0c;不断探索更…

ORA-04031

ORA-04031&#xff1a;unable to allocate 3264 bytes of shared memory 1、问题背景 修改SGA重启数据库后报错系统内存&#xff1a;8G 原SGA大小&#xff1a;3G 修改后SGA大小&#xff1a;5G数据库可以正常重启&#xff0c;但是trance日志一直在报错 2、解决办法 调整shared…

湘大 XTU OJ 1148 三角形 题解(非常详细):根据题意朴素模拟+观察样例分析需要计算几轮 具体到一般

一、链接 1148 三角形 二、题目 题目描述 给一个序列&#xff0c;按下面的方式进行三角形累加&#xff0c;求其和值。 比如序列为 1,2,3,4,5 1 2 3 4 53 5 7 98 12 1620 2848输入 有多组样例。每个样例的第一行是一个整数N(1≤N≤100),表示序列的大小&…

uni-app实现图片上传功能

效果 代码 <uni-forms-item name"ViolationImg" label"三违照片 :"><uni-file-picker ref"image" limit"1" title"" fileMediatype"image" :listStyles"listStyles" :value"filePathsL…

docker通用镜像方法,程序更新时不用重新构建镜像

docker通用镜像方法&#xff0c;程序更新时不用重新构建镜像。更新可执行文件后&#xff0c;重新启动容器就可运行。 功能 1、在demo目录下添加脚本文件start.sh&#xff0c;里面执行demo.jar文件。 2、将demo目录映射到镜像下的 /workspace目录。 3、Dockerfile文件中默认…

CDN(Content Delivery Network)内容分发网络

从DNS域名系统到CDN内容分发网络 DNS什么是DNS直接使用DNS的缺点 CDNCDN加速过程使用CDN的优势 DNS 什么是DNS 输入域名www.baidu.com后&#xff0c;浏览器先检查缓存和本地Host文件&#xff0c;看有没有对应的ip地址&#xff0c;有则直接使用&#xff0c;没有就会向本地DNS服…

ubuntu安装nginx以及php的部署

目录 1.安装依赖包 2.安装nginx 3.编译nginx 4.启动nginx 5.访问nginx 6.增加源地址 7.安装php 8.配置php-fpm 9.修改权限 10.配置nginx里的php 11.启动php-fpm 12.配置php文件以及权限 13.登陆查看 1.安装依赖包 apt-get install gcc apt-get install libpcre3 l…

C++:模板初阶以及string类使用

C&#xff1a;模板初阶以及string类使用 模板的简单认识1.泛型编程2.函数模板模板的原理图函数模板格式函数模板实例化非模板函数和模板函数的匹配原则 3.类模板类模板的定义格式类模板的实例化 string1.string简介2.string常用的接口 题目练习1.字符串相加2.字符串里面最后一个…

MySQL REGEXP_SUBSTR() 函数

MySQL 8.0 的 REGEXP_SUBSTR()函数从一个字符串获取和指定模式匹配的子串并返回。默认情况下&#xff0c;REGEXP_SUBSTR()函数执行不区分大小写的匹配。 REGEXP_SUBSTR() 语法如下&#xff1a; REGEXP_SUBSTR (expression, pattern [, position[, occurrence[, match_type]]])…

服务质量(QoS)监控工具

企业网络的使用正变得越来越复杂&#xff0c;由于越来越依赖企业网络进行广泛的应用&#xff0c;网络格局发生了翻天覆地的变化。语音、视频和数据网络的融合增加了更多的变量来确定网络的行为。不同的应用程序以不同的方式影响网络&#xff0c;这要求完全控制网络带宽的使用&a…

年薪50W+的测试大佬都在用这个:Jmeter 脚本开发之——扩展函数

很多同学&#xff0c;都问我&#xff1a;“老师&#xff0c;我的 jmeter 里面&#xff0c;怎么没有 MD5 函数&#xff0c;base64 函数也没有&#xff0c;我是不是用了假的 jmeter&#xff1f;” 哈哈哈&#xff0c;不是的。jmeter 的函数&#xff0c;有自带函数和扩展函数两大…

Python数据分析实战-列表字符串、字符串列表、字符串的转化(附源码和实现效果)

实现功能 str([None,master,hh]) ---> [None,"master","hh"] ---> "None,master,hh" 实现代码 import re import astx1 str([None,master,hh]) print(x1)x2 ast.literal_eval(x1) print(x2)x3 ",".join(str(item) for item…

【C++奇遇记】智能的函数探幽

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

CSS前端开发指南:创造精美的用户界面

简介&#xff1a; 《CSS前端开发指南&#xff1a;创造精美的用户界面》是一本旨在帮助读者掌握CSS技术&#xff0c;实现令人惊叹的前端用户界面的实用指南。无论您是初学者还是有经验的开发者&#xff0c;本书都将为您提供全面的知识和实用技巧&#xff0c;帮助您创建引人注目…

程序的运行(6/13)

程序的运行分为两种&#xff1a;一种基于操作系统环境&#xff0c;另一种是在无操作系统的环境下执行裸机程序。在 Linux 环境下&#xff0c;可执行文件是 ELF 格式&#xff08;除了基本的代码段、数据段、还有文件头、符号表等用来辅助程序运行的信息&#xff09;&#xff0c;…

Arcgis中影像图切片有白斑或者白点

效果 步骤 1、3dmax渲染或者其它原片 2、Arcgis中加载图片 原数据效果 3、定义投影和转换坐标系等等 我这边测试数据是EPSG:4326的坐标系 4、导出jp2(JPG2000)格式 转换后效果 5、发布服务 6、效果对比

机器学习---梯度下降代码

1. 归一化 # Read data from csv pga pd.read_csv("pga.csv") print(type(pga))print(pga.head())# Normalize the data 归一化值 (x - mean) / (std) pga.distance (pga.distance - pga.distance.mean()) / pga.distance.std() pga.accuracy (pga.accuracy - pg…

centos7部署openldap开启memberof并接入jumpserver

文章目录 前言1.yum安装openldap2.配置密码3.导入配置4.定义域5.配置memberof6.配置base dn7.安装phpldapadmin管理8.调整httpd的配置9.调整php的配置10.登陆php管理页面11.同步旧ldapsever用户数据(可省略)12.客户端配置13.对接jumpserver 前言 介绍如何在centos7上部署openl…