<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>敲玻璃游戏</title>
<style>
body {
margin: 0;
padding: 0;
background: #2c3e50;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
font-family: Arial, sans-serif;
}

#gameContainer {
background: #34495e;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 20px rgba(0,0,0,0.5);
}

#gameBoard {
display: grid;
grid-template-columns: repeat(8, 60px);
grid-template-rows: repeat(6, 60px);
gap: 5px;
background: #1a252f;
padding: 10px;
border-radius: 5px;
}

.glass {
background: linear-gradient(135deg, #87CEEB 0%, #4682B4 100%);
border: 2px solid #5F9EA0;
border-radius: 5px;
cursor: pointer;
position: relative;
transition: all 0.3s ease;
box-shadow: inset 0 0 10px rgba(255,255,255,0.3);
}

.glass:hover {
transform: scale(1.05);
box-shadow: 0 0 15px rgba(135, 206, 235, 0.8);
}

.glass.cracked {
background: linear-gradient(135deg, #B0C4DE 0%, #708090 100%);
animation: crack 0.5s ease-out;
}

.glass.broken {
background: transparent;
border: 2px dashed #7f8c8d;
pointer-events: none;
}

@keyframes crack {
0% { transform: scale(1); }
50% { transform: scale(1.1) rotate(5deg); }
100% { transform: scale(1); }
}

.crack-lines {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}

.crack-lines::before,
.crack-lines::after {
content: '';
position: absolute;
background: #2c3e50;
opacity: 0.7;
}

.crack-lines::before {
width: 2px;
height: 80%;
top: 10%;
left: 30%;
transform: rotate(45deg);
}

.crack-lines::after {
width: 2px;
height: 60%;
top: 20%;
left: 60%;
transform: rotate(-30deg);
}

#scoreBoard {
text-align: center;
color: white;
margin-bottom: 20px;
}

#score {
font-size: 24px;
font-weight: bold;
color: #3498db;
}

#message {
font-size: 18px;
margin-top: 10px;
height: 30px;
}

button {
background: #3498db;
color: white;
border: none;
padding: 10px 20px;
font-size: 16px;
border-radius: 5px;
cursor: pointer;
margin-top: 10px;
transition: background 0.3s ease;
}

button:hover {
background: #2980b9;
}

.hammer {
position: absolute;
width: 40px;
height: 40px;
pointer-events: none;
z-index: 1000;
display: none;
}

.hammer::before {
content: '🔨';
font-size: 30px;
}
</style>
</head>
<body>
<div id="gameContainer">
<div id="scoreBoard">
<h1>敲玻璃游戏</h1>
<div id="score">得分: 0</div>
<div id="message"></div>
<button onclick="resetGame()">重新开始</button>
</div>
<div id="gameBoard"></div>
</div>
<div class="hammer" id="hammer"></div>

    <script>
let score = 0;
let gameBoard = document.getElementById('gameBoard');
let scoreDisplay = document.getElementById('score');
let messageDisplay = document.getElementById('message');
let hammer = document.getElementById('hammer');
let glasses = [];

// 创建游戏板
function createBoard() {
gameBoard.innerHTML = '';
glasses = [];

for (let i = 0; i < 48; i++) {
let glass = document.createElement('div');
glass.className = 'glass';
glass.dataset.index = i;
glass.dataset.state = 'intact';

glass.addEventListener('click', hitGlass);
glass.addEventListener('mouseenter', showHammer);
glass.addEventListener('mouseleave', hideHammer);

gameBoard.appendChild(glass);
glasses.push(glass);
}
}

// 敲玻璃
function hitGlass(e) {
let glass = e.target;
let state = glass.dataset.state;

if (state === 'broken') return;

if (state === 'intact') {
glass.dataset.state = 'cracked';
glass.classList.add('cracked');

let crackLines = document.createElement('div');
crackLines.className = 'crack-lines';
glass.appendChild(crackLines);

score += 10;
showMessage('裂开了!+10分');

// 添加破碎音效(使用Web Audio API模拟)
playBreakSound();
} else if (state === 'cracked') {
glass.dataset.state = 'broken';
glass.classList.add('broken');
glass.innerHTML = '';

score += 20;
showMessage('破碎了!+20分');
playShatterSound();
}

updateScore();
checkWin();
}

// 显示锤子光标
function showHammer(e) {
hammer.style.display = 'block';
hammer.style.left = e.pageX - 20 + 'px';
hammer.style.top = e.pageY - 20 + 'px';
}

// 隐藏锤子光标
function hideHammer() {
hammer.style.display = 'none';
}

// 鼠标移动时更新锤子位置
document.addEventListener('mousemove', (e) => {
if (hammer.style.display === 'block') {
hammer.style.left = e.pageX - 20 + 'px';
hammer.style.top = e.pageY - 20 + 'px';
}
});

// 更新分数
function updateScore() {
scoreDisplay.textContent = `得分: ${score}`;
}

// 显示消息
function showMessage(msg) {
messageDisplay.textContent = msg;
setTimeout(() => {
messageDisplay.textContent = '';
}, 1000);
}

// 检查是否获胜
function checkWin() {
let brokenCount = glasses.filter(g => g.dataset.state === 'broken').length;
if (brokenCount === glasses.length) {
showMessage('恭喜!所有玻璃都被敲碎了!');
setTimeout(() => {
alert(`游戏结束!最终得分:${score}`);
}, 500);
}
}

// 重置游戏
function resetGame() {
score = 0;
updateScore();
createBoard();
showMessage('游戏重新开始!');
}

// 模拟破碎音效
function playBreakSound() {
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();

oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);

oscillator.frequency.value = 200;
oscillator.type = 'square';
gainNode.gain.setValueAtTime(0.1, audioContext.currentTime);
gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.1);

oscillator.start(audioContext.currentTime);
oscillator.stop(audioContext.currentTime + 0.1);
}

// 模拟粉碎音效
function playShatterSound() {
const audioContext = new (window.AudioContext || window.webkitAudioContext)();

for (let i = 0; i < 3; i++) {
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();

oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);

oscillator.frequency.value = 100 + Math.random() * 200;
oscillator.type = 'sawtooth';
gainNode.gain.setValueAtTime(0.1, audioContext.currentTime + i * 0.05);
gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + i * 0.05 + 0.1);

oscillator.start(audioContext.currentTime + i * 0.05);
oscillator.stop(audioContext.currentTime + i * 0.05 + 0.1);
}
}

// 初始化游戏
createBoard();
</script>
</body>
</html>

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

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

相关文章

996引擎-ItemTips特效框层级自定义

996引擎-ItemTips特效框层级自定义 需求场景 ItemTips 中相关方法 创建特效的位置 创建特效框 核心修改 调整视图,自己加个背景,不用原来的 设置 tipsLayout_bg 的层级 结果预览 参考资料 需求场景 策划说我们的tips特效框,遮挡文字。如果按官方说的设为底层又跑到背景框后…

Java 注解与 APT(Annotation Processing Tool)

Java 注解与 APT&#xff08;Annotation Processing Tool&#xff09; 注解&#xff08;Annotation&#xff09;基础 注解是 Java 语言的一种元数据形式&#xff0c;它可以在代码中添加标记信息&#xff0c;用于描述代码的额外信息&#xff0c;但不会直接影响代码的执行逻辑。注…

Unity 检测网络-判断当前(Android/Windows平台)设备是否连接了指定WiFi

判断设备是否连接了特定的网络1.Unity 脚本2.Unity AndroidManifest.xml文件①改个设置②补充权限语句1.Unity 脚本 using UnityEngine; using System.Collections; using System.Diagnostics; using Debug UnityEngine.Debug; using UnityEngine.UI;#if UNITY_ANDROID &…

通过网络强化增强混合IT环境的安全

网络是企业运营的支柱&#xff0c;也是网络犯罪分子和恶意威胁者的主要目标&#xff0c;他们会破坏IT运营的连续性。随着混合云基础设施、远程办公和物联网&#xff08;IoT&#xff09;生态系统的出现&#xff0c;网络边界正在不断扩大&#xff0c;新的漏洞不断产生&#xff0c…

ACP(四):RAG工作流程及如何创建一个RAG应用

RAG的工作原理 你在考试的时候有可能会因为忘记某个概念或公式而失去分数&#xff0c;但考试如果是开卷形式&#xff0c;那么你只需要找到与考题最相关的知识点&#xff0c;并加上你的理解就可以进行回答了。 对于大模型来说也是如此&#xff0c;在训练过程中由于没有见过某个知…

宇视设备视频平台EasyCVR视频设备轨迹回放平台监控摄像头故障根因剖析

监控摄像头的类型繁多&#xff0c;市场上提供了广泛的选择。然而&#xff0c;在使用监控摄像头的过程中&#xff0c;用户可能会遇到云台在很短的时间内出现运转不灵或完全无法转动的问题。这里&#xff0c;我们将对这一常见问题进行深入分析。一、具体的原因&#xff1a; 1、距…

【Uni-App+SSM 宠物项目实战】Day15:购物车添加

大家好!今天是学习路线的第15天,我们正式进入订单与购物车核心模块。昨天完成了商家服务列表的分页加载,今天聚焦“购物车添加”功能——这是连接“商品浏览”与“订单提交”的关键环节,用户可将宠物用品(如粮食、玩具)加入购物车,后续统一结算。 为什么学这个? 购物车…

Java 黑马程序员学习笔记(进阶篇6)

常用的 API1. 正则表达式(1) 题目&#xff1a;贪婪爬取和非贪婪爬取① 贪婪爬取&#xff1a;爬取数据的时候尽可能的多获取数据 ② 非贪婪爬取&#xff1a;爬取数据的时候尽可能的少获取数据 ③ Java中默认的是贪婪爬取 ④ 后面加上 ? 可以转变为非贪婪爬取(2) 捕获分组捕获分…

计算机网络---数据链路层上

文章目录1. 数据链路层的功能2. 组帧2.1 字符填充法2.2 字节填充法2.3 零比特填充法2.4 违规编码2.5 总结3. 差错控制3.1 检错编码3.1.1 奇偶校验3.1.2 循环冗余校验码&#xff08;CRC&#xff09;3.1.3 总结3.2 纠错编码&#xff08;海明校验码&#xff09;3.3 总结4. 流量控制…

机器学习实战项目中,回归与分类模型中该如何科学定义目标变量Y?

前言 在机器学习项目里&#xff0c;目标变量 (Y) 的定义决定了你能解答什么问题&#xff0c;以及模型能给业务带来什么价值。选择不当不仅可能导致模型误差大、偏差严重&#xff0c;还可能让业务决策方向偏离。 本文分两大场景&#xff1a; 供应链项目中的 销量预测&#xff08…

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是动态规划算法的基础入门篇&#xff0c;我将通过三道简单题 一道中等难度的一维动态规划题来带你对动态规划有个初认识&#xff0c;并基本了解动…

深入对比Tomcat与Netty:HTTP请求从网卡到Controller的全链路追踪

我们日常用Spring Boot写的RestController&#xff0c;感觉上就是一个简单的方法&#xff0c;但它背后其实有一套复杂的网络服务在支撑。一个HTTP请求到底是怎么从用户的浏览器&#xff0c;穿过层层网络&#xff0c;最终抵达我们代码里的Controller方法的&#xff1f;理解这个过…

GO学习记录十——发包

记录下不同平台的发包操作和期间遇到的问题 1.命令&#xff1a; $env:GOOSlinux $env:GOARCHamd64 go build -o release/HTTPServices-linux第一行&#xff0c;配置平台&#xff0c;linux、windows 第二行&#xff0c;配置部署服务器的处理器架构 第三行&#xff0c;输出目标文…

贪心算法与动态规划

1. 什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。 核心思想&#xff1a;“每步都贪心地选择眼前最好的&#xff0c;不去考虑整个未来的长…

学会“读网页”:生成式 AI 在足球赛事信息整理中的实战

逐步教程&#xff08;Step-by-Step&#xff09; — 适合初学者与教学类文章 背景&#xff08;为什么要这样做&#xff09; 对于足球迷、资讯编辑与数据分析师来说&#xff0c;最快、最准确把握一场比赛的核心信息至关重要&#xff1a;比分、关键事件&#xff08;进球、点球、红…

BM3D 图像降噪快速算法的 MATLAB 实现

BM3D 图像降噪快速算法的 MATLAB 实现1. 快速 BM3D 算法流程&#xff08;概述&#xff09;步骤操作加速技巧① 分组块匹配 堆叠FFT 互相关② 协同滤波3D 变换 硬阈值FFT 沿第三维③ 聚合加权平均稀疏矩阵累加 2. 核心函数&#xff08;单文件版&#xff09; 保存为 bm3d_fast.…

Go的schedt调度(runtime/proc.go)

1. 创建go的入口函数// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服务器配置转发网络访问

配置文档&#xff1a;Ubuntu 服务器转发网络访问 一、网络拓扑以以下网络拓扑为示例Ubuntu 服务器&#xff08;两个网卡&#xff09; eth1 10.66.71.222 &#xff08;接入内网&#xff09;eno1 192.168.2.100 &#xff08;直连相机&#xff09; 相机ip 192.168.2.1 Windows 客…

为什么企业需要高防IP

1. 抵御日益猖獗的DDoS攻击 现代DDoS攻击规模已突破Tbps级别 传统防火墙无法应对大规模流量攻击 高防IP采用分布式清洗中心&#xff0c;可轻松抵御300Gbps以上的攻击流量 2. 保障业务连续性 网络中断1小时可能造成数百万损失 高防IP确保服务99.99%可用性 智能切换机制实…

CSS基础 - 选择器备忘录 --笔记5

目录基础选择器组合器伪类选择器属性选择器选择器可以选中页面上的特定元素并为其指定样式。 CSS有多种选择器。 基础选择器 标签选择器 – tagname&#xff1a;匹配目标元素的标签名。优先级是0,0,1。如&#xff1a;p、h1、div类选择器 – .class&#xff1a;匹配class属性中…