双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

[散分]aasddsasda的JS俄罗斯方块全解释

natineprince natineprince 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
http://blog.csdn.net/natineprince/archive/2010/08/20/5825692.aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html>
<style>
div {display:block;background-color:black;position:absolute;font:17px Tahoma;color:#fff;}
<!-- 层 -->
span {float:left;background-color:gray;width:12px;height:12px;border:4px gray outset;margin:0 1 1 0;overflow:hidden;}
<!-- 游戏区单体方块 -->
p {float:left;width:8px;height:8px;border:2px gray outset;overflow:hidden;margin:0;padding:0}
<!-- 预览区单体方块 -->
#main {width:375px;height:430px;display:block;background-color:gray;position:relative;}
<!-- 全面版 -->
#body {width:241px;height:401px;left:15px;top:15px;border:1px solid #999;}
<!-- 主游戏区 -->
#score {width:80px;height:24px;left:270px;top:15px;padding:4px;}
<!-- 计分区 -->
#level {width:80px;height:24px;left:270px;top:50px;padding:4px;}
<!-- 等级区 -->
#next {width:50px;height:50px;left:270px;top:85px;border:19px black solid;}
<!-- 预览区 -->
#ctrl {width:80px;height:55px;left:270px;top:360px;padding:4px;text-align:center;background-color:gray}
<!-- 按钮区 -->
#ctrl button{width:80px;height:25px;}
<!-- 按钮 -->
</style>
<script>
//By: X!ao_f QQ:120000512
var G = {
fs:[], // 游戏区点阵
fn:[], // 预览区点阵
score:0,
l:['#9F0','#FF3','#F33','#C0C','#33C','#0F3','#F93'],// 颜色选择器
v:[0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0xFFFF],
// 游戏区行点阵
d:[[0xCC00],[0x4444,0xF0],[0x8C40,0x6C00],[0x4C80,0xC600],[0x44C0,0x8E00,0xC880,0xE200],[0x88C0,0xE800,0xC440,0x2E00],[0x4E00,0x8C80,0xE400,0x4C40]],
// 方块造型点阵
init:function(){
var body = document.getElementById('body');
var next = document.getElementById('next');
for(var i=0;i<240;i++){ // 以游戏区单体方块填充点阵
G.fs.push(body.appendChild(document.createElement("span")));
}
for(var i=0;i<16;i++){ // 以预览区单体方块填充点阵
G.fn.push(next.appendChild(document.createElement("p")));
}
G.domScore = document.getElementById('score');
G.domLevel = document.getElementById('level');
document.onkeydown=function(e){G.event(e||window.event,0)}; // 页面按键事件控制转移到闭包
G.rand();
G.next();
},
timeTesk:function(){
if(G.pause)return;// 如果暂停按钮按下,则停止该函数运行
if(!G.move(G.x, G.y+1, G.t)){ // 是否能继续下移
var s = 0;
for(var i=0;i<19;i++){
G.v[i]=G.v[i]|G.m[i];
if(G.v[i]==0xFFF){// 根据行点阵判断是否已达到可消除行
for(var k=i;k>0;k--){
G.v[k] = G.v[k-1];// 消除已完全成行(向下移位)
}
G.score+=++s;// 计分
}
}
G.next();
return false;
}
G.draw();
return true;
},
move:function(x,y,t){ // 位移函数
var m = [];
for(var k=0;k<4;k++){ // 因为方块形状建模是4X4点阵.所以循环4次
m[y+k] = (G.d[G.n][t]>>(3-k)*4&0xF)<<Math.max(x,0)>>-Math.min(x,0);
// G.d[G.n]为现在使用的方块点阵模型,[t]为第t种旋转模型点阵
// G.d[G.n][t]>>(3-k)*4&0xF为获取单行位移后的点阵
// <<Math.max(x,0)>>-Math.min(x,0)为判断x为左移还是右移
// m[y+k]对应位移点阵行
if(m[y+k] & G.v[y+k]){// 判断是否位移后点阵与游戏区现有点阵重叠
return false;
}
}
G.x = x;// 保存当前下落点阵模型坐标
G.y = y;// 保存当前下落点阵模型坐标
G.t = t;// 保存当前下落点阵模型旋转模型
G.m = m;// 保存当前下落点阵模型在类游戏区的位置(镜像位置)
G.draw();
return true;
},
rand:function(){
G.n = G._n; // 获取上次生成的随机方块点阵模型
G.t = G._t; // 获取上次生成的随机方块点阵旋转系数
G.c = G._c; // 获取上次生成的随机颜色
G._n = parseInt(Math.random()*G.d.length); // 以模型长度生成随机数
G._t = parseInt(Math.random()*G.d[G._n].length); // 同上
G._c = parseInt(Math.random()*G.l.length); // 同上
},
next:function(){
G.rand();
if(parseInt(G.score/20)!=G.level){ // 分数与等级互换的概念...20分一级哦...
G.level = parseInt(G.score/20); // 不等于当前等级则升级
clearInterval(G.handle); // 清楚上一计时器
G.handle = setInterval("G.timeTesk()",500/(G.level+1));// 按等级设计时器(控制速度的地方哦!)
}
G.domScore.innerHTML = 'Score:'+G.score; // 更新分数
G.domLevel.innerHTML = 'Level:'+G.level; // 更新等级
var i = 0;
while(!(G.d[G.n][G.t]>>i*4&0xF))i++; // 将i移动到点阵模型有显示的第一行
if(!G.move(3, i-3, G.t)){// 如果在点阵模型3行内不能进行向上位移(即点阵到游戏区顶部)
alert('Game over!'); // 则Game over并提示
clearInterval(G.handle); // 良好习惯,清除计时器
}
},
draw:function(){
for(var i=0;i<240;i++){// 遍历游戏区全点阵,每i为全点阵中的1点
if((G.v[parseInt(i/12)]>>(11-i%12))&0x1){
// G.v[parseInt(i/12)为该点所在行
// >>(11-i%12))&0x1为整体操作,&运算前将点移后,让&运算能判断点是否显示
G.fs[i].style.visibility = ''; // 判断为真则显示
}else if((G.m[parseInt(i/12)]>>(11-i%12))&0x1){ // 同上理画下落中的模型镜像点阵
G.fs[i].style.visibility = '';
G.fs[i].style.borderColor = G.fs[i].style.background = G.l[G.c]; // 上色
}else{
G.fs[i].style.visibility ='hidden'; // 判断为假则隐藏
}
}
for(var i=0;i<16;i++){ // 同理画预览区点阵
if(G.d[G._n][G._t]>>(15-i)&0x1){
G.fn[i].style.visibility = '';
G.fn[i].style.borderColor = G.fn[i].style.background = G.l[G._c];
}else{
G.fn[i].style.visibility ='hidden';
}
}
},
event:function(e,t){
switch(e.keyCode){
case 37: // 左键
G.move(G.x + 1, G.y, G.t);
break;
case 39: // 右键
G.move(G.x - 1, G.y, G.t);
break;
case 38: // 上键
G.move(G.x, G.y, (G.t + 1) % G.d[G.n].length);
break;
case 40: // 下键
G.timeTesk();
break;
case 32: // 空格...看了半天才知道原来按空格直接落底...
while(G.timeTesk());
}
}
}
</script>
<body onload='G.init();'><!-- 网页读取后初始化 -->
<div id='main'>
<div id='body'></div>
<div id='score'></div>
<div id='level'></div>
<div id='next'></div>
<div id='ctrl'>
<button onclick="javascript:location.href=location.href;">New</button>
<!-- 重置等于重新读取网页 -->
<button onclick="javascript:this.innerHTML={'true':'Start','false':'Pause'}[G.pause=!!!G.pause];">Pause</button>
<!-- 这里运用了一个很好的技巧:!!的用法,可以将为空的数据转成false,避免出现空指针异常 -->
</div>
</div>
</body>
</html>

...全文

相关推荐

飞轮储能系统机侧PQ控制+网侧变流器恒压双闭环控制【附参考文献】

内容概要:本文针对含分布式电源的配电网在遭受自然灾害或外力破坏导致多条线路同时故障的复杂场景,提出并实现了一种将网络重构、孤岛划分与检修进度统筹考虑的多时段故障恢复优化模型。该模型以最小化系统网损和甩负荷惩罚为综合目标,采用混合整数二阶锥规划(MISOCP)方法,通过引入大常数松弛处理支路的投切状态,利用二阶锥松弛技术将非线性的潮流方程转化为凸优化问题,并创新性地应用虚拟流方法确保各供电孤岛内部的连通性。模型在IEEE 33节点系统上进行了仿真验证,能够逐时段生成最优的开关操作序列、负荷恢复策略以及分布式电源协同供电方案,有效提升了配电网在故障期间的韧性与供电恢复能力。文章还深入评述了模型的实现细节,并指出了在负荷分级、无功处理、辐射状约束精确性等方面的潜在改进方向。; 适合人群:电力系统自动化、智能电网、配电网规划与运行等相关领域的研究生、科研人员及从事配电网故障恢复与韧性提升工作的工程技术人员。; 使用场景及目标:①应对由极端天气或外力破坏引发的配电网多点并发故障;②在故障后通过协同优化网络重构与动态孤岛划分,最大化恢复关键负荷供电;③将故障线路的修复时序纳入优化框架,实现检修资源调度与供电恢复路径的联合决策,以提升系统整体恢复效率与韧性。; 阅读建议:本文理论深度较高,综合运用了电力系统分析、数学优化建模与凸松弛技术,建议读者具备扎实的电力系统潮流计算、优化理论和MATLAB/YALMIP建模基础。阅读时应重点关注虚拟流、二阶锥松弛等核心技术的设计原理与实现逻辑,结合文中详细的公式推导与算例结果,深入理解模型的构建过程与求解机制,为进一步研究考虑储能、柔性负荷及多能协同的主动配电网高级恢复策略奠定基础。

wytm

风光储协同并网发电系统仿真(Simulink仿真实现)

内容概要:本文围绕“风光储协同并网发电系统仿真(Simulink仿真实现)”展开,重点介绍了一套基于Simulink/MATLAB平台的电力系统仿真体系,涵盖风力发电、光伏发电、储能系统(如电池、飞轮、抽水蓄能)以及制氢系统(PEM电解槽)等多种能源形式的协同建模与控制策略。系统实现了并网与孤岛模式下的协调控制,采用了虚拟同步发电机(VSG)、下垂控制、模型预测控制(MPC)、双闭环控制等多种先进控制算法,并结合多时段故障恢复、网络重构与孤岛划分的优化模型,提升配电网在故障情况下的韧性与恢复能力。文中详细阐述了基于二阶锥松弛与虚拟流理论的混合整数二阶锥规划(MISOCP)建模方法,用于求解含分布式电源的配电网多时段故障恢复问题,确保供电连通性与辐射状结构。整体资源体系丰富,包含仿真模型、参考文献、建模报告及代码实现,适用于科研与教学实践。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉MATLAB/Simulink仿真环境,从事新能源、微电网、智能配电系统研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 构建风光储协同发电系统的动态仿真模型,研究其并网运行特性与稳定性;② 设计与验证微电网在故障情况下的孤岛划分、网络重构与多源协同恢复控制策略;③ 学习并应用二阶锥松弛、虚拟流、混合整数规划等高级建模技术解决电力系统优化问题。; 阅读建议:建议结合提供的参考文献与仿真模型逐步实践,重点关注模型的约束构建、目标函数设计与求解器接口实现;在复现过程中注意变量定义、参数设置与物理意义的一致性,建议拓展加入负荷分级、储能动态调度与通信延迟等实际因素以提升模型实用性。

wytm

基于人工神经网络的类噪声环境声音声学识别(Matlab代码实现)

内容概要:本文系统阐述了基于人工神经网络的类噪声环境声音声学识别方法,并提供了完整的Matlab代码实现。研究聚焦于构建和训练人工神经网络模型,以实现对在复杂类噪声环境中采集的声音信号进行高效识别与分类。内容涵盖数据预处理、特征提取、网络模型设计、训练优化等关键技术环节,重点探讨了如何提升模型在低信噪比条件下的鲁棒性与识别精度。该方法融合了现代信号处理技术与深度学习架构,为复杂声学环境下的音频分析提供了有效的解决方案。; 适合人群:具备一定信号处理和机器学习基础,从事音频识别、环境监测、智能安防或相关领域研究的研发人员及研究生。; 使用场景及目标:①应用于智能监控、工业设备故障诊断、城市环境声音感知等需在强噪声背景下识别特定声源的场景;②为科研人员提供一个可复现、可扩展的Matlab实现框架,用于进一步改进和优化声学识别算法。; 阅读建议:建议读者结合所提供的Matlab代码逐段研读,深入理解算法实现细节,重点关注特征工程与网络结构设计部分,并尝试在不同类型的噪声条件下调试模型,以全面评估其泛化能力与实际应用潜力。

大龙不吃小鱼干

政府科技管理者在推动科技成果转化时,如何精准识别高价值科技成果?.docx

政府科技管理者在推动科技成果转化时,如何精准识别高价值科技成果?

BIZKEEN

产业园区运营负责人如何实现科技成果与产业资源的精准匹配和高效配置?.docx

产业园区运营负责人如何实现科技成果与产业资源的精准匹配和高效配置?

BIZKEEN
评论 184
收藏 已收藏
分享
返回顶部
natineprince
JavaScript 87,983 成员 224,681 内容