html+js+css做的扫雷

做了个扫雷💣    8×8大小  源代码在文章最后

界面

先点击蓝色开局按钮

0de777cba3484a609a2871b71c1af3d7.jpg

 然后就可以再扫雷的棋盘上玩

db50bebc84fb45da8770963eb94a2f74.jpg

0代表该位置没有雷

其他数字代表周围雷的数量

1d0c1a9ea6604223a47bc4b1d2a6c667.jpg

 源代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>扫雷游戏</title>

    <style>

        /* CSS代码开始 */

        body {

            background-color: #f0f0f0;

            display: flex;

            justify-content: center;

            align-items: center;

            height: 100vh;

            margin: 0;

        }

 

        .container {

            background-color: white;

            padding: 20px;

            border-radius: 5px;

            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);

        }

 

        .title {

            text-align: center;

            font-size: 2em;

            margin-bottom: 20px;

        }

 

        .start-game-btn {

            display: block;

            margin: 0 auto 20px;

            padding: 10px 20px;

            background-color: #007bff;

            color: white;

            border: none;

            border-radius: 5px;

            cursor: pointer;

            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);

            transition: all 0.3s ease;

        }

 

        .start-game-btn:hover {

            background-color: #0056b3;

        }

 

        td {

            width: 30px;

            height: 30px;

            text-align: center;

            vertical-align: middle;

            border: 1px solid #ddd;

            cursor: pointer;

        }

        /* CSS代码结束 */

    </style>

</head>

<body>

    <div class="container">

        <h1 class="title">扫雷</h1>

        <button id="startGameBtn" class="start-game-btn">开局</button>

        <table id="mineField"></table>

    </div>

    <script>

        /* JavaScript代码开始 */

        document.getElementById('startGameBtn').addEventListener('click', startGame);

 

        function startGame() {

            const mineField = document.getElementById('mineField');

            mineField.innerHTML = '';

 

            const rows = 8, cols = 8;

            const mines = 10;

 

            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;

                cell.setAttribute('data-revealed', 'true');

 

                if (cell.getAttribute('data-mine') === 'true') {

                    alert('失败!');

                    resetGame();

                } else {

                    cell.textContent = getAdjacentMinesCount(row, col);

                    if (cell.textContent === '0') {

                        revealAdjacentCells(row, col);

                    }

                    checkWin();

                }

            }

 

            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();

            }

        }

        /* JavaScript代码结束 */

    </script>

</body>

</html>

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

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

相关文章

价格预言机的使用总结(一):Chainlink篇

文章首发于公众号&#xff1a;Keegan小钢 前言 价格预言机已经成为了 DeFi 中不可获取的基础设施&#xff0c;很多 DeFi 应用都需要从价格预言机来获取稳定可信的价格数据&#xff0c;包括借贷协议 Compound、AAVE、Liquity &#xff0c;也包括衍生品交易所 dYdX、PERP 等等。…

【腾讯内推】腾讯2025校招/青云计划/社招——长期有效

及时跟进进度&#xff0c;保证不让简历石沉大海&#xff01; 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …

【Linux】进程创建和终止 | slab分配器

进程创建 fork 1.fork 之后发生了什么 将给子进程分配新的内存块和内核数据结构&#xff08;形成了新的页表映射&#xff09;将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork 返回&#xff0c;开始调度器调度 这样就可以回答之前返回两个值&#xff1f…

Java面试八股之MySQL存储货币数据,用什么类型合适

MySQL存储货币数据&#xff0c;用什么类型合适 在MySQL中存储货币数据&#xff0c;最合适的类型是DECIMAL。这是因为货币数据通常需要高精度&#xff0c;尤其是对于财务交易&#xff0c;即使是极小的精度损失也可能导致严重的会计错误。DECIMAL类型可以提供固定的精度&#xf…

c++:struct和class的区别

C和C中struct的区别 (1)C中不支持成员函数&#xff08;只能通过函数指针成员变量间接支持&#xff09;&#xff0c;而C源生支持。 (2)C中不支持static成员&#xff0c;而C中支持。后面会详细讲&#xff0c;C static class是一个大知识点 (3)访问权限&#xff0c;C中默认public…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论&#xff0c;如何将 CSDN 上的博客&#xff0c;拉取到本地&#xff0c;然后PicGo、Hexo、Github 等工具建立个人博客&#xff0c;环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

Midjourney 预设

使用命令/settings 进入预设,根据点击不同选项来配置。 🌹 1. 设置工作所使用的模型版本。 1️⃣ MJ Version 1 2️⃣ MJ Version 2 3️⃣ MJ Version 3 4️⃣ MJ Version 4 5️⃣ MJ Version 5 5️⃣ MJ Version 5.1 🔧Raw Mode 🌈 Niji Version 4 🍎 Niji Versio…

深入探索C语言中的结构体:定义、特性与应用

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 目录 结构体的介绍结构体定义结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构体的介绍 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许开发者将不同类型的变量组合在一起…

数据库管理工具 -- Navicat Premium v17.0.8 特别版

软件简介 Navicat Premium 是一款功能强大的数据库管理工具&#xff0c;适用于Windows、Mac和Linux平台。它支持多种数据库&#xff0c;包括MySQL、MariaDB、SQL Server、PostgreSQL、Oracle、SQLite等。用户可以通过Navicat Premium轻松地连接到各种数据库服务器&#xff0c;…

ASP.NET Core----基础学习02----中间件的执行顺序 静态文件中间件

文章目录 1.终端中间件&#xff08;Middleware&#xff09;2.中间件的执行顺序&#xff08;1&#xff09;当只有2个中间件的时候&#xff0c;先执行普通中间件&#xff0c;再执行终端中间件&#xff08;2&#xff09;当有多个中间件的时候&#xff0c;中间件的执行顺序 3.添加静…

接口自动化测试思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

Nacos服务注册总流程(源码分析)

文章目录 服务注册NacosClient找看源码入口NacosClient服务注册源码NacosServer处理服务注册 服务注册 服务注册 在线流程图 NacosClient找看源码入口 我们启动一个微服务&#xff0c;引入nacos客户端的依赖 <dependency><groupId>com.alibaba.cloud</groupI…

免密ssh和自定义服务器名字【远程连接服务器】

免密ssh和自定义服务器名字【远程连接服务器】 免密ssh和自定义服务器名字【远程连接服务器】服务器添加本地公钥ssh-copy-id使用别名登录config 免密ssh和自定义服务器名字【远程连接服务器】 原理 实现免密登录需要 本地的公钥id_rsa.pub放在服务器上的 authorized_keys 文件…

Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;&#x1f427;Linux高级管理专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️…

Thisjavabean对象数组

This 1.概念 this是一个对象this是一个构造函数 2.介绍 解决局部变量和成员变量命名冲突 this在面向对象-封装那一篇里&#xff0c;有被两个地方提及。 但我们先简单给一个例子&#xff1a; public Person(String name, String phone, String qqPassword, String bankCar…

豆瓣评分9.6,这本书不看损失巨大!

点击上方△腾阳 关注 转载请联系授权 这些年&#xff0c;我就像是个热心向导&#xff0c;逢人就劝读那本《毛泽东选集》。 结果呢&#xff1f;有人一听就摆手&#xff0c;笑言&#xff1a;“哎呀&#xff0c;那书太高大上了&#xff0c;咱啃不动啊&#xff01;” 特别是咱们…

WEB编程-了解Tomcat服务器

第⼀章⽹络编程 1.1 概述 计算机⽹络&#xff1a;是指将地理位置不同的具有独⽴功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在⽹络 操作系统、⽹络管理软件及⽹络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 …

智慧矿山建设规划方案(121页Word)

智慧矿山建设项目方案摘要 一、项目背景及现状分析 项目背景 随着信息技术的迅猛发展&#xff0c;智慧化、数字化已成为矿山行业转型升级的必然趋势。智慧矿山建设项目旨在通过集成先进的信息技术手段&#xff0c;实现对矿山生产、管理、安全等全过程的智能化监控与管理&…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

G9 - ACGAN理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 环境步骤环境设置数据准备工具方法模型设计模型训练模型效果展示 总结与心得体会 上周已经简单的了解了ACGAN的原理&#xff0c;并且不经实践的编写了部分…