<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<style type="text/css">
#container {
width: 670px;
height: 670px;
background-color: #eeffee;
margin: 100px auto;
}
.block {
width: 20px;
height: 20px;
background-color: white;
border: 1px solid;
float: left;
margin: 0 0 0 0px;
text-align: center;
}
.block2 {
width: 10px;
height: 10px;
background-color: red;
float: left;
}
.openedBlockNormal {
width: 20px;
height: 20px;
background-color: green;
border: 1px solid;
float: left;
margin: 0 0 0 0px;
text-align: center;
}
.openedBlockBomb {
width: 20px;
height: 20px;
background-color: red;
border: 1px solid;
float: left;
margin: 0 0 0 0px;
text-align: center;
}
.openedBlockEmpty {
width: 20px;
height: 20px;
background-color: yellow;
border: 1px solid;
float: left;
margin: 0 0 0 0px;
text-align: center;
}
</style>
<script type="text/javascript">
var EventUtil = new Object;
EventUtil.addEvent = function(oTarget, sEventType, funName) {
if (oTarget.addEventListener) {//for DOM;
oTarget.addEventListener(sEventType, funName, false);
} else if (oTarget.attachEvent) {
oTarget.attachEvent("on" + sEventType, funName);
} else {
oTarget["on" + sEventType] = funName;
}
};
EventUtil.removeEvent = function(oTarget, sEventType, funName) {
if (oTarget.removeEventListener) {//for DOM;
oTarget.removeEventListener(sEventType, funName, false);
} else if (oTarget.detachEvent) {
oTarget.detachEvent("on" + sEventType, funName);
} else {
oTarget["on" + sEventType] = null;
}
};
</script>
<script type="text/javascript" src="bomb.js"></script>
</head>
<body>
<div id="containers" style="cursor: pointer"></div>
</body>
<script type="text/javascript">
document.oncontextmenu = function() {
return false;
};
var parent = document.getElementById("containers");
var container = new Container(parent, "600px", "600px", 30, 30, 0);
container.init();
parent.appendChild(container.html);
</script>
</html>
// this class stands for eight direction of every block.
function Direction() {
this.up = null;
this.right = null;
this.down = null;
this.left = null;
this.leftUp = null;
this.rightUp = null;
this.leftDown = null;
this.rightDown = null;
}
// every block object stands for one block in the page.
function Block(className) {
// blocks around.
this.neighbors = new Direction();// [up,rightUp,right,rightDown,down,leftDown,left,leftUp]
// html element. div used here.
this.html = null;
// position of this block.
this.index = -1;
// is this block a bomb?
this.isBomb = false;
// how many bombs around of this blocks.
this.bombNumAround = -1;
// html css style
this.className = className;
// is it already opened?
this.isOpen = false;
// do some preparation for this block;
this.init();
}
// calculate how many bombs of around.
Block.prototype.calcBombAround = function() {
if (!this.isBomb) {
var bombNumber = 0;
for ( var p in this.neighbors) {
if (typeof (this.neighbors[p]) != "function") {
if (null != this.neighbors[p] && this.neighbors[p].isBomb) {
bombNumber++;
}
}
}
this.bombNumAround = bombNumber;
}
};
// return html element.
Block.prototype.getHtml = function() {
return this.html;
};
Block.prototype.init = function() {
var that = this;
// create a html element.
this.html = document.createElement("div");
// adding mouse over handler for this block. change background color for
// this block.
EventUtil.addEvent(this.html, "mouseover", function(evt) {
var element = evt.target ? evt.target : evt.srcElement;
element.style.backgroundColor = "#eeAB6F";
});
// remove the style which were added in mouseover handler.
EventUtil.addEvent(this.html, "mouseout", function(evt) {
var element = evt.target ? evt.target : evt.srcElement;
element.style.backgroundColor = "";
element.style.cursor = "";
});
// user click some block.
EventUtil.addEvent(this.html, "mousedown", function(evt) {
// right click button.
if (evt.button == 2) {
// if this block already indicate as a bomb, then change to normal
// block.
if (that.getStyle() == "openedBlockBomb") {
that.changeStyle("block");
} else if (that.getStyle() == "block") {
// if this block is a normal block, indicate as a bomb.
that.changeStyle("openedBlockBomb");
}
} else {// left click!
// open it
that.open();
}
});
// setting defalut style name.
this.changeStyle(this.className);
};
// change css style.
Block.prototype.changeStyle = function(styleName) {
this.html.setAttribute("class", styleName);
this.html.setAttribute("className", styleName);
};
// getting csss style
Block.prototype.getStyle = function() {
var style = this.html.getAttribute("class");
if (style == null || typeof (style) == "undefined") {
style = this.html.getAttribute("className");
}
return style;
};
Block.prototype.open = function() {
// if there is no bomb around, change style as an empty block.
if (this.bombNumAround == 0) {
this.changeStyle("openedBlockEmpty");
} else if (this.bombNumAround > 0) {
// setting bomb number to inner html.
this.html.innerHTML = this.bombNumAround;
this.changeStyle("openedBlockNormal");
} else {
// setting style as a bomb.
this.changeStyle("openedBlockBomb");
alert("bomb!!");
}
this.isOpen = true;
// if 0 ==bomb number,them open other block around.
if (this.bombNumAround == 0) {
var directions = new Array();
directions.push("up");
directions.push("right");
directions.push("down");
directions.push("left");
directions.push("leftUp");
directions.push("rightUp");
directions.push("leftDown");
directions.push("rightDown");
for ( var i = 0; i < directions.length; i++) {
var blockInDirection = this.neighbors[directions[i]];
if (null != blockInDirection
&& typeof (blockInDirection) != "undefined"
&& !blockInDirection.isBomb && !blockInDirection.isOpen) {
blockInDirection.open();
}
}
}
};
function Container(parent, width, heigth, rows, columns, bomb) {
this.bombNumber = bomb;
this.parent = parent;
this.width = width;
this.heigth = heigth;
this.rows = rows;
this.columns = columns;
this.childObject = new Array();
this.html = null;
}
Container.prototype.init = function() {
this.html = document.createElement("div");
this.html.id = "container";
var bombArray = new Object();
// how many bombs in all.
var bombNumber = 100;
var index = this.rows * this.columns + 1;
var loopNumber = 0;
// randomly generate the position of bomb.
while (true) {
if (loopNumber >= bombNumber) {
break;
}
var randomBombPosition = Math.floor(Math.random() * index);
if (bombArray[randomBombPosition] != true) {
bombArray[randomBombPosition] = true;
loopNumber++;
}
}
// generate block objects.
for ( var i = 0; i < this.rows * this.columns; i++) {
var block = new Block("block");
if (bombArray[i] == true) {
block.isBomb = true;
}
this.childObject.push(block);
this.html.appendChild(block.html);
}
// generating the relation of blocks. neighbors around.
for ( var j = 0; j < this.rows * this.columns; j++) {
block = this.childObject[j];
block.neighbors.up = this.childObject[j - this.columns];
block.neighbors.right = this.childObject[j + 1];
block.neighbors.down = this.childObject[j + this.columns];
block.neighbors.left = this.childObject[j - 1];
block.neighbors.leftUp = this.childObject[j - this.columns - 1];
block.neighbors.rightUp = this.childObject[j - this.columns + 1];
block.neighbors.leftDown = this.childObject[j + this.columns - 1];
block.neighbors.rightDown = this.childObject[j + this.columns + 1];
if (j / this.columns == 0) {
block.neighbors.up = null;
block.neighbors.leftUp = null;
block.neighbors.rightUp = null;
} else if (j / this.columns == this.rows - 1) {
block.neighbors.down = null;
block.neighbors.leftDown = null;
block.neighbors.rightDown = null;
}
if (j % this.columns == 0) {
block.neighbors.left = null;
block.neighbors.leftUp = null;
block.neighbors.leftDown = null;
} else if (j % this.columns == this.columns - 1) {
block.neighbors.right = null;
block.neighbors.rightUp = null;
block.neighbors.rightDown = null;
}
block.calcBombAround();
}
};
分享到:
相关推荐
Windows平台经典软件扫雷,情怀软件,打发时间,发现现在系统中没有了,找到后,分享出来。最喜欢的小游戏了,消磨时间神器。
上班闲着无聊做了一个JAVA版的GUI计时器,包括了中午的打卡时间、下午的下班时间、周末的倒计时和当天已...最后 实在是闲着没事 做了贪吃蛇和扫雷两款小游戏整合到里面 闲着没事 打发打发时间 有兴趣的可以拿去参考参考
java实现的扫雷和连连看,工作之余,写来打发闲暇时间,只实现了游戏主逻辑,计分,计时等功能,我就偷懒了,有兴趣的小伙伴可自行加入。
自制的一个扫雷小游戏。winders 没有 自己写了一个,纯的js来实现的,初学者打发时间写到。磕磕碰碰就写了一个功能已经完成的扫雷小游戏。
1、文件说明: Centos8操作系统textern-0.8-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf textern-0.8-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
基于STM32的循迹避障小车资料源码(高分项目),个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(
金属板卷自动捆扎机器step_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
内容概要:本文详细介绍了SSM框架(Spring、SpringMVC、MyBatis)的相关知识,涵盖Maven项目管理工具、前端开发技术、HTTP协议及Tomcat服务器等内容。文章首先讲解了SSM框架的组成,包括Spring的IOC、DI、AOP等功能,SpringMVC的请求处理流程以及MyBatis的数据操作。接着介绍了Maven作为项目管理工具的作用,如依赖管理和项目构建,并详细描述了Maven的配置文件pom.xml的使用方法。此外,还探讨了HTTP协议的特点、请求响应格式,以及Web服务器Tomcat的基本概念和工作原理。最后,文章对前端开发技术进行了概述,包括HTML、CSS、JavaScript等基础知识,并简要介绍了Ajax技术。 适合人群:具备一定编程基础,特别是Java开发经验的研发人员,尤其是那些正在学习或使用SSM框架进行Web开发的工程师。 使用场景及目标:①理解SSM框架的工作原理及其各组成部分的功能;②掌握Maven的使用,包括项目创建、依赖管理、生命周期等;③熟悉HTTP协议的请求响应机制,能够处理常见的HTTP请求和响应;④掌握前端开发技术,如HTML、CSS、JavaScript等,能够进行简单的前端页面开发;⑤了解Tomcat服务器的工作原理及其配置方法。 阅读建议:本文内容丰富,涵盖了从后端到前端的多个方面,建议读者在学习过程中结合实际项目进行实践,尤其是在Maven项目管理和SSM框架的具体应用上,多动手操作,加深理解。同时,对于HTTP协议和前端开发技术,可以通过实际的网络请求和页面开发来巩固所学知识。
本系统以用户与管理员两类人,作为目标用户,其中用户主要功能包含用户的注册与登录,查看漫画信息进行订阅等,对账号相关信息的修改;管理员主要功能包括了对用户信息、漫画信息、订阅信息、更新通知、在线留言、社区互动等管理;管理员可以实现最高权限级别的全系统管理。 内含文档,可轻松上手。
内容概要:本文详细介绍了NEU-DET数据集,这是一个包含六种常见表面缺陷(如涂层剥落、油污、锈蚀等)的1800张灰度图像的数据集。数据集分为训练集和测试集,分别为1620张和180张。文中探讨了数据集的特点,如灰度图像的优势、标注信息的重要性以及合理的数据集划分。此外,文章展示了如何使用Python读取标注信息,并提供了使用Keras和PyTorch搭建卷积神经网络(CNN)和Faster R-CNN模型的具体代码示例,用于缺陷分类和目标检测任务。通过数据增强技术和模型优化,可以在工业缺陷检测中取得较好的效果。 适合人群:从事工业缺陷检测、计算机视觉、机器学习等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望利用深度学习技术进行表面缺陷检测的研究人员。具体应用场景包括但不限于产品质量检测、自动化生产线监控等。目标是帮助用户理解和掌握如何使用NEU-DET数据集进行模型训练和评估,提高缺陷检测的准确性。 其他说明:文中提到的数据集和代码示例可以帮助初学者快速入门,同时也为高级用户提供了一些优化建议,如使用预训练模型、调整损失函数权重等。
内容概要:本文详细介绍了使用Qt/C++开发的一款多平台二维图形编辑器。该编辑器旨在提供简单直观的图形可视化编辑体验,主要功能包括创建和参数化图形、支持多种图类型、多样化的边与节点端口、自定义属性、动态维护交换列表、搜索功能、自动布局与导出、以及多种文件格式的支持。作者分享了项目的实现路径和技术细节,如通过QGraphicsView框架实现图形绘制、利用GraphViz引擎进行自动布局、采用QProcess处理跨平台进程通信、以及性能优化技巧等。 适合人群:对图形编辑器开发感兴趣的研发人员,尤其是熟悉或想要深入了解Qt/C++框架的开发者。 使用场景及目标:适用于需要开发或改进图形编辑工具的技术团队,帮助他们理解和掌握Qt/C++在图形编辑领域的应用,提高开发效率和产品质量。 其他说明:文中不仅展示了具体的代码片段,还分享了许多实用的经验和技巧,如避免性能瓶颈的方法、处理跨平台兼容性的注意事项等。这对于希望深入研究图形编辑技术和Qt/C++框架的开发者来说是非常宝贵的参考资料。
股票代码:A股600000浦发银行 2023年-2024年2年秒级数据,可用作训练和回测 数据内容: 时间戳(间隔10-12秒,精确到秒) 买/卖成交量 成交价 开/收盘价 最高/低价 另有类似的大盘秒级数据
内含文档,可轻松上手。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
冲击试验机sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
各院校专业录取分数线.zip
内容概要:本文深入探讨了逆变器虚拟同步控制(VSG)技术中的阻抗建模及其验证方法。首先介绍了VSG的基本概念和技术背景,强调了正负序阻抗对系统稳定性和电能质量的影响。随后详细讲解了阻抗建模的理论基础,包括正负序阻抗的计算方法和虚拟同步发电机的序阻抗建模。接着阐述了阻抗扫描的具体步骤,包括扫描范围、点数设置以及通过扫频法在不同频率下注入小信号并测量响应的方法。文中提供了详细的Python和MATLAB代码示例,帮助读者理解和实现阻抗建模和扫描验证。最后,通过对比实测阻抗曲线和理论模型,讨论了常见问题及解决方法。 适合人群:从事电力电子、电力系统稳定性和控制的研究人员和工程师,尤其是对VSG技术和阻抗建模感兴趣的读者。 使用场景及目标:适用于需要评估逆变器在不同工况下的电气特性,确保电力系统稳定性和优化电能质量的研究和工程实践中。主要目标是掌握VSG阻抗建模和扫频法验证的理论与实践技能。 其他说明:本文不仅提供理论知识,还附带了详细的代码实现和注释,便于读者快速上手并在实际项目中应用。此外,文中提到的一些实用技巧和注意事项也有助于提高实验效率和准确性。
c语言打字母游戏源码.zip
内容概要:本文详细介绍了基于SOGI(二阶广义积分器)和DQ变换的数字锁相环(PLL)在STM32G431芯片上的实现过程,并通过MATLAB进行了仿真验证。主要内容涵盖SOGI初始化、ADC采样配置、中断服务程序设计、DQ变换以及PLL频率跟踪等关键技术环节。文中特别强调了定点运算的应用,以提高运算效率和稳定性。同时,通过MATLAB仿真展示了系统的频率跟踪性能,在40Hz-65Hz范围内能够稳定跟踪电网频率变化,误差控制在±0.2Hz以内。此外,文章还讨论了移植性和硬件适配问题,提供了详细的代码片段和调试经验。 适合人群:从事电力电子、嵌入式系统开发的技术人员,尤其是对锁相环(PLL)和SOGI+DQ结构感兴趣的工程师。 使用场景及目标:适用于需要精确频率跟踪和相位同步的应用场合,如光伏逆变器并网、电机控制系统等。目标是帮助开发者理解和实现高效的PLL算法,确保系统在复杂电网环境下的稳定运行。 其他说明:文章不仅提供了理论分析和技术实现,还包括了大量的实践经验分享,如定点运算优化、硬件适配技巧等。对于希望深入理解PLL工作原理和实际应用的读者来说,是一份非常有价值的参考资料。
内容概要:本文档详细介绍了 MATLAB 在 Windows 和 macOS 系统上的下载与安装步骤。首先简述了 MATLAB 的应用领域,包括科学计算、数据分析和工程仿真。接着分别针对 Windows 和 macOS 用户提供了详细的安装指南,涵盖从访问官网、下载安装程序、选择许可证类型、指定安装路径、选择工具箱到最后的激活步骤。最后,通过输入特定命令验证 MATLAB 是否安装成功,确保用户能够顺利开始使用 MATLAB 进行相关工作。; 适合人群:对科学计算、数据分析和工程仿真有需求的科研人员、工程师以及学生等。; 使用场景及目标:①科研人员和工程师在工作中进行复杂的数据处理和建模;②学生学习数学、物理等相关课程时进行实验和模拟。; 阅读建议:本教程操作性强,建议读者按照步骤逐一操作,确保每一步都正确无误。遇到问题可随时查阅官方帮助文档或社区论坛,以便顺利完成 MATLAB 的安装和激活。