HTML+CSS+JS扫雷(可自定义雷数,大小,可插旗)

源代码在最后面 点赞❤️ 关注⭐️谢谢😜

实现功能

  1. 随机扫雷
  2. 自定义地雷数、游戏棋盘大小
  3. 插旗

效果图(部分图片)

f369f54117ac4c76ae974f431f59c147.jpg

4e51ddec890e4163af28bf0b84481439.jpg

 1c81a9b318f74187a0a96f0d1730189f.jpg

 源代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>扫雷游戏</title><style>/* CSS代码开始 */body {background-color: #f8f9fa; /* 背景色 */font-family: 'Arial', sans-serif; /* 字体 */display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {background-color: #ffffff; /* 窗口背景色 */padding: 20px;border-radius: 15px; /* 圆角 */box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); /* 阴影效果 */text-align: center; /* 中心对齐 */}.title {font-size: 2em; /* 标题字体大小 */color: #dc3545; /* 标题颜色 */margin-bottom: 20px;}.start-game-btn, .param-btn, .flag-btn {display: block;margin: 10px auto;padding: 10px 20px;background-color: #dc3545; /* 按钮背景色 */color: white;border: none;border-radius: 5px; /* 圆角按钮 */cursor: pointer;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 按钮阴影 */transition: background-color 0.3s ease; /* 过渡效果 */}.start-game-btn:hover, .param-btn:hover, .flag-btn:hover {background-color: #c82333; /* 悬停时变深的颜色 */}table {margin: 0 auto; /* 表格居中 */border-collapse: collapse; /* 合并边框 */}td {width: 40px;height: 40px;text-align: center;vertical-align: middle;background-color: #f7f7f7; /* 单元格背景色 */border-radius: 5px; /* 圆角单元格 */cursor: pointer;font-size: 1.5em; /* 字体大小 */transition: background-color 0.3s; /* 背景色过渡 */border: 1px solid #ccc; /* 添加边框 */}td:hover {background-color: #e2e6ea; /* 悬停效果 */}.mine {color: red; /* 炸弹颜色 */}.flag {color: green; /* 红旗颜色 */}.number-1 { color: blue; }.number-2 { color: green; }.number-3 { color: red; }.number-4 { color: purple; }.number-5 { color: maroon; }.number-6 { color: teal; }.number-7 { color: black; }.number-8 { color: gray; }.revealed {background-color: #d1e7dd; /* 已确认没有雷的区域背景色 */}/* CSS代码结束 */</style>
</head>
<body><div class="container"><h1 class="title">扫雷</h1><button id="startGameBtn" class="start-game-btn">开局</button><button id="paramBtn" class="param-btn">修改参数</button><button id="flagBtn" class="flag-btn">插旗子</button><table id="mineField"></table></div><script>/* JavaScript代码开始 */let flagMode = false; // 插旗模式开关let rows = 8, cols = 8, mines = 10; // 默认参数document.getElementById('startGameBtn').addEventListener('click', startGame);document.getElementById('paramBtn').addEventListener('click', modifyParameters);document.getElementById('flagBtn').addEventListener('click', toggleFlagMode);function startGame() {const mineField = document.getElementById('mineField');mineField.innerHTML = '';// 创建表格for (let i = 0; i < rows; i++) {let row = document.createElement('tr');for (let j = 0; j < cols; j++) {let cell = document.createElement('td');cell.addEventListener('click', () => revealCell(i, j));row.appendChild(cell);}mineField.appendChild(row);}let mineLocations = [];while (mineLocations.length < mines) {let x = Math.floor(Math.random() * rows);let y = Math.floor(Math.random() * cols);if (!mineLocations.includes(x + ',' + y)) {mineLocations.push(x + ',' + y);document.getElementById('mineField').rows[x].cells[y].setAttribute('data-mine', 'true');}}}function revealCell(row, col) {let cell = document.getElementById('mineField').rows[row].cells[col];if (cell.getAttribute('data-revealed') === 'true') return;if (flagMode) {// 插旗子模式if (cell.textContent === '🚩') {cell.textContent = ''; // 移除旗子} else {cell.textContent = '🚩'; // 插旗子}return;}cell.setAttribute('data-revealed', 'true');cell.classList.add('revealed'); // 添加已确认的类if (cell.getAttribute('data-mine') === 'true') {cell.textContent = '💣'; // 显示炸弹revealAllMines(); // 显示所有炸弹alert('失败!');} else {let count = getAdjacentMinesCount(row, col);if (count > 0) {cell.textContent = count;cell.classList.add('number-' + count); // 添加颜色类}if (count === 0) {revealAdjacentCells(row, col);}checkWin();}}function revealAllMines() {const mineField = document.getElementById('mineField');for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {let cell = mineField.rows[i].cells[j];if (cell.getAttribute('data-mine') === 'true') {cell.textContent = '💣'; // 显示炸弹}}}}function getAdjacentMinesCount(row, col) {let count = 0;for (let i = -1; i <= 1; i++) {for (let j = -1; j <= 1; j++) {if (i === 0 && j === 0) continue;let r = row + i, c = col + j;if (r >= 0 && r < rows && c >= 0 && c < cols) {if (document.getElementById('mineField').rows[r].cells[c].getAttribute('data-mine') === 'true') {count++;}}}}return count;}function revealAdjacentCells(row, col) {for (let i = -1; i <= 1; i++) {for (let j = -1; j <= 1; j++) {if (i === 0 && j === 0) continue;let r = row + i, c = col + j;if (r >= 0 && r < rows && c >= 0 && c < cols) {revealCell(r, c);}}}}function checkWin() {let revealedCells = 0;for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {if (document.getElementById('mineField').rows[i].cells[j].getAttribute('data-revealed') === 'true') {revealedCells++;}}}if (revealedCells === rows * cols - mines) {alert('成功!');resetGame();}}function resetGame() {window.location.reload();}function modifyParameters() {let newRows = prompt("请输入行数(默认8):", rows);let newCols = prompt("请输入列数(默认8):", cols);let newMines = prompt("请输入雷数(默认10):", mines);if (newRows) rows = parseInt(newRows);if (newCols) cols = parseInt(newCols);if (newMines) mines = parseInt(newMines);startGame(); // 重新开始游戏}function toggleFlagMode() {flagMode = !flagMode; // 切换插旗子模式alert(flagMode ? "插旗子模式已开启" : "插旗子模式已关闭");}/* JavaScript代码结束 */</script>
</body>
</html>

 

 

 

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

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

相关文章

学习TS-类

class Car{ // 字段 name : String; age : Number; //静态 静态成员可以直接通过类名调用 static shooch:string; // 构造函数 // 构造函数会在对象创建时调用 constructor(name:string,age:Number){ //在实例方法中&#xff0c;this就表示当前当前的实例 //在构造函数中当前对…

kettle从入门到精通 第七十九课 ETL之kettle kettle读取数据库BLOB字段转换为文件

上一课我们讲解了如何将文件以二进制流的方式写入数据库&#xff0c;本节课我们一起学习下如何将二进制数据读取为文件。 1、将二进制流转换为文件这里主要用到了步骤【文本文件输出】。表输入步骤从表中读取blob字段&#xff0c;java代码定义二进制流转换为文件的全路径&#…

openmv学习笔记(24电赛笔记)

#opemv代码烧录清除详解 openmv的代码脱离IDE运行程序&#xff0c;只需要在IDE中将代码烧录道flash里面&#xff0c;断开IDE连接&#xff0c;上电之后&#xff0c;会自动执行main.py中的程序&#xff0c;IDE烧录的时候&#xff0c;会默认将程序后缀保存为 .py文件。 ​​​​​…

SpringBoot3整合Druid报错Cannot load driver class: org.h2.Driver

报错显示springboot自带的H2数据库报错&#xff0c;其实是因为druid并未加载进去。如果你其它配置都没问题的话&#xff0c;请检查druid的依赖是什么版本的&#xff0c;因为springboot3刚开始是不支持druid的。 方案一&#xff1a; 即需要手动在resources目录下创建META-INF/s…

利用request + BeautifulSoup 模块批量爬取内容,实现批量获取书名对应的豆瓣评分

文章目录 代码代码解释控制台输出结果 代码 #-*- coding:utf-8 -*- from bs4 import BeautifulSoup import requests, time, jsonheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.39…

实际生活中网段不通的典型分析及处理方案

关于端口&#xff1a; 应用层&#xff1a; FTP TELNET SMTP DNS TFTP SNMP 端口号&#xff1a; 21 23 25 53 69 161 传输层&#xff1a; TCP UDP&#xff08;DNS两个都占…

《Java初阶数据结构》----3.<线性表---LinkedList与链表>

目录 前言 一、链表的简介 1.1链表的概念 1.2链表的八种结构 重点掌握两种 1.3单链表的常见方法 三、单链表的模拟实现 四、LinkedList的模拟实现&#xff08;双链表&#xff09; 4.1 什么是LinkedList 4.2LinkedList的使用 五、ArrayList和LinkedList的区别 前言 …

【C++中的IO流和文件操作精讲】

【本节目标】 1. C语言的输入与输出 2. 流是什么 3. CIO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 ⭐scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。 ⭐printf(): 将…

苹果和乔布斯的传奇故事,从车库创业到万亿市值巨头

苹果公司的品牌故事&#xff0c;就像一部充满创新、挑战与辉煌的科幻大片&#xff0c;让人目不暇接。 故事始于1976年&#xff0c;那时&#xff0c;年轻的史蒂夫乔布斯与斯蒂夫沃兹尼亚克在加州的一个简陋车库里&#xff0c;用他们的热情和智慧&#xff0c;捣鼓出了世界上第一…

【vue教程】三. 组件复用和通信(7 种方式)

目录 本章涵盖知识点回顾 组件开发与复用组件的创建和注册全局定义局部定义单文件组件&#xff08;.vue 文件&#xff09;组件的注册方式在实例中注册在 Vue 中注册 组件的 props定义 props传递 props 组件事件自定义事件的创建和触发父组件监听子组件事件父组件处理事件 Vue 实…

数字孪生:变电站监测和运维的智能化实践

随着夏季高温天气的到来&#xff0c;我国用电也迎来了高峰。用电负荷持续走高&#xff0c;对全国各地电网运维也迎来了挑战。电力系统作为现代社会的基础设施&#xff0c;其稳定性和可靠性至关重要&#xff0c;变电站则是实现电力系统电力互联互通的枢纽。 在传统变电站中&…

Python文字识别

在对于图片文字识别中&#xff0c;可以采用Python进行&#xff0c;对于下面图片&#xff1a; """ 程序实现思路&#xff1a; 1、怎么从图片中识别文字&#xff1f; 实例化OCR模型进行识别 2、怎么打开文件进行识别&#xff1f; 识别图片中的文字内容 …

SVN 服务 安装部署 Docker(compose) 方式

通过 dockerhub 或者 命令行运行 &#xff1a; docker search svn 查看 svn 的镜像 如命令行&#xff1a; [rootSGP ~]# docker search svn NAME DESCRIPTION STARS OFFICIAL AUTOMATED garethflower…

《0基础》学习Python——第十八讲__爬虫/<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序&#xff08;通常使用Python&#xff09;&#xff0c;爬虫可以自动化地访问网页&#xff0c;解析网页内容并提取出所需的数据。爬虫可以用于各种用途&#xff0c;如搜索引擎的索引&#xff0c;数据分析和挖掘&#x…

系统编程--Linux下文件的“其他操作”函数

这里写目录标题 文件存储理论补充dentry、inode 文件其他操作stat函数作用函数原型代码&#xff08;以获取文件大小为例&#xff09;补充&#xff08;获取文件类型&#xff09; lstat函数作用函数原型代码补充&#xff08;获取文件权限&#xff09;总结 tipslink函数作用简介函…

有哪些好用的 AI 学术研究工具和科研工具?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ AI 应用其实分两个层面&#xff0c;第一是模型&#xff0c;第二是应用。现在很多模型厂家都是既做 toC 的对话应用&#xff0c;也做 t…

使用API有效率地管理Dynadot域名,处理域名推送请求

简介 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

Nginx学习-相关概念

Nginx学习-相关概念 主要学习几个概念&#xff1a;Nginx&#xff0c;正向代理、反向代理、负载均衡、动静分离。–2020年05月29日 什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 特点是占有内存少&…

绘制混淆矩阵热力图

Python绘制混淆矩阵热力图 用matplotlib绘制混淆矩阵&#xff0c;可以通过改变 imshow 函数中的 cmap 参数来修改颜色。cmap 参数接受一个 colormap 的名字&#xff0c;你可以选择许多不同的 colormap&#xff0c;例如 ‘viridis’, ‘plasma’, ‘inferno’, ‘magma’, ‘civ…

Rust代码答疑报错|Python一对一辅导答疑

Question 你好&#xff0c;我是悦创。 学员答疑&#xff1a; https://code.bornforthis.cn/?id4e72084d-1eaf-44ed-8067-744671491574https://code.bornforthis.cn/?id664ff169-41d6-409f-a05b-02ed42279759 问题代码&#xff1a; // You can bring module paths into sc…