《JavaScript100例|01》之javaScript实现俄罗斯方块,唤起了女朋友儿时的回忆!

导读:小时候我们经常打游戏玩俄罗斯方块,用的是游戏机。

现在我们学会了敲代码,简单用JS实现一下这个游戏把。

目录

先看效果 

操作说明

代码实现

完整代码


先看效果 

操作说明

打开编译器,讲代码复制进去,在浏览器打开即可,通过键盘上下左右控制,一个人就可以玩耍。

↑控制方块的形态(可以使方块旋转),←向左平移,→向右平移,↓加速下落。方块铺满可以消失,方块排列到顶部游戏gameover.

代码实现

CSS

<style type="text/css">.c{margin:1px; width:19px; height:19px; background:red; position:absolute;}.d{margin:1px; width:19px; height:19px; background:gray; position:absolute;}.f{top:0px; left:0px; background:black; position:absolute;}.e{top:0px; background:#151515; position:absolute;}.g{width:100px; height:20px; color:white; position:absolute;}
</style>

 JS

<script type="text/javascript">
var row = 18;
var col = 10;
var announcement = 6;
var size = 20;
var isOver = false;
var shapes = ("0,1,1,1,2,1,3,1;1,0,1,1,1,2,2,2;2,0,2,1,2,2,1,2;0,1,1,1,1,2,2,2;1,2,2,2,2,1,3,1;1,1,2,1,1,2,2,2;0,2,1,2,1,1,2,2").split(";");
var tetris;
var container;
function createElm(tag,css)
{var elm = document.createElement(tag);elm.className = css;document.body.appendChild(elm);return elm;
}
function Tetris(css,x,y,shape)
{// 创建4个div用来组合出各种方块var myCss = css?css:"c";this.divs = [createElm("div",myCss),createElm("div",myCss),createElm("div",myCss),createElm("div",myCss)];if(!shape){this.divs2 = [createElm("div",myCss),createElm("div",myCss),createElm("div",myCss),createElm("div",myCss)];this.score = createElm("div","g");this.score.style.top = 10*size+"px";this.score.style.left = (col- -1)*size+"px";this.score.innerHTML = "score:0";}this.container = null;this.refresh = function(){this.x = (typeof(x)!='undefined')?x:3;this.y = (typeof(y)!='undefined')?y:0;// 如果有传参,优先使用参数的,如果有预告,优先使用预告,都没有就自己生成if(shape)this.shape = shape;else if(this.shape2)this.shape = this.shape2;elsethis.shape = shape?shape:shapes[Math.floor((Math.random()*shapes.length-0.000000001))].split(",");this.shape2 = shapes[Math.floor((Math.random()*shapes.length-0.000000001))].split(",");if(this.container && !this.container.check(this.x,this.y,this.shape)){isOver = true;alert("游戏结束");}else{this.show();this.showScore();this.showAnnouncement();}}// 显示方块this.show = function(){for(var i in this.divs){this.divs[i].style.top = (this.shape[i*2+1]- -this.y)*size+"px";this.divs[i].style.left = (this.shape[i*2]- -this.x)*size+"px";}}// 显示预告this.showAnnouncement = function(){for(var i in this.divs2){this.divs2[i].style.top = (this.shape2[i*2+1]- -1)*size+"px";this.divs2[i].style.left = (this.shape2[i*2]- -1- -col)*size+"px";}}// 显示分数this.showScore = function(){if(this.container && this.score){this.score.innerHTML = "score:" + this.container.score;}}// 水平移动方块的位置this.hMove = function(step){if(this.container.check(this.x- -step,this.y,this.shape)){this.x += step;this.show();}}// 垂直移动方块位置this.vMove = function(step){if(this.container.check(this.x,this.y- -step,this.shape)){this.y += step;this.show();}else{this.container.fixShape(this.x,this.y,this.shape);this.container.findFull();this.refresh();}}// 旋转方块this.rotate = function(){var newShape = [this.shape[1],3-this.shape[0],this.shape[3],3-this.shape[2],this.shape[5],3-this.shape[4],this.shape[7],3-this.shape[6]];if(this.container.check(this.x,this.y,newShape)){this.shape = newShape;this.show();}}this.refresh();
}
function Container()
{this.init = function(){// 绘制方块所在区域var bgDiv = createElm("div","f");bgDiv.style.width = size*col+"px";bgDiv.style.height = size*row+"px";// 绘制预告所在区域var bgDiv = createElm("div","e");bgDiv.style.left = size*col+"px";bgDiv.style.width = size*announcement+"px";bgDiv.style.height = size*row+"px";// 清空积分this.score = 0;}this.check = function(x,y,shape){// 检查边界越界var flag = false;var leftmost=col;var rightmost=0;var undermost=0;for(var i=0;i<8;i+=2){// 记录最左边水平坐标if(shape[i]<leftmost)leftmost = shape[i];// 记录最右边水平坐标if(shape[i]>rightmost)rightmost = shape[i];// 记录最下边垂直坐标if(shape[i+1]>undermost)undermost = shape[i+1];// 判断是否碰撞if(this[(shape[i+1]- -y)*100- -(shape[i]- -x)])flag = true;}// 判断是否到达极限高度for(var m=0;m<3;m++)for(var n=0;n<col;n++)if(this[m*100+n])flag = true;if((rightmost- -x+1)>col || (leftmost- -x)<0 || (undermost- -y+1)>row || flag)return false;return true;}// 用灰色方块替换红色方块,并在容器中记录灰色方块的位置this.fixShape = function(x,y,shape){var t = new Tetris("d",x,y,shape);for(var i=0;i<8;i+=2)this[(shape[i+1]- -y)*100- -(shape[i]- -x)] = t.divs[i/2];}// 遍历整个容器,判断是否可以消除this.findFull = function(){var s = 0;for(var m=0;m<row;m++){var count = 0;for(var n=0;n<col;n++)if(this[m*100+n])count++;if(count==col){s++;this.removeLine(m);}}this.score -= -this.calScore(s);}this.calScore = function(s){if(s!=0)return s- -this.calScore(s-1)elsereturn 0;}// 消除指定一行方块this.removeLine = function(row){// 移除一行方块for(var n=0;n<col;n++)document.body.removeChild(this[row*100+n]);// 把所消除行上面所有的方块下移一行for(var i=row;i>0;i--){for(var j=0;j<col;j++){this[i*100- -j] = this[(i-1)*100- -j]if(this[i*100- -j])this[i*100- -j].style.top = i*size + "px";}}}
}
function init()
{container = new Container();container.init();tetris = new Tetris();tetris.container = container;document.onkeydown = function(e){if(isOver) return;var e = window.event?window.event:e;switch(e.keyCode){case 38: //uptetris.rotate();break;case 40: //downtetris.vMove(1);break;case 37: //lefttetris.hMove(-1);break;case 39: //righttetris.hMove(1);break;}}setInterval("if(!isOver) tetris.vMove(1)",500);
}
</script>

 这样就把项目搞完了,一个简单的俄罗斯方块就完成了,女朋友玩的很快乐!

完整代码

《JavaScript100例|01》之javaScript实现俄罗斯方块源代码

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

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

相关文章

adf4351使用_ADF:将UI类别与动态表单一起使用

adf4351使用JDev 11g R2具有有趣的新功能“ UI类别”。 它使我们可以在视图对象定义级别上以声明方式对VO的属性进行分组。 例如&#xff0c;我的VEmployees视图对象的“ UI Categories”选项卡如下所示&#xff1a; 默认情况下&#xff0c;每个视图对象都有一个预定义的类别“…

使用JavaScript将小写金额转化为大写金额的两种常见方法

导读:在一些支付或者银行确认信息中经常需要将小写金额转换为大写金额,这里做一下归纳, 目录 效果图: 方法一:使用正则表达式 方法二:常规JavaScript实现 效果图: 前面小写,后面大写,这里使用vue测试,其它框架同理.小写是传值的字段money,大写直接调用函数dealBigMoney(money…

h5-列表

<header> <!-- a,div,header,span {-webkit-tap-highlight-color: rgba(255, 255, 255, 0); /*修改a、input和button点击时的蓝色外边框和灰色半透明背景*/ } --><div class"header"> <!-- .header {height: 44px;background: #ff8200;position…

什么是突变测试?

最近&#xff0c;我反复提到“ 突变测试 ”一词。 因为可以说这种方法能够以超出代码覆盖范围的方式检测测试安全网的空白&#xff0c;所以我花了一些时间来追赶这个话题&#xff0c;然后尝试一下。 这篇文章总结了我的发现&#xff0c;作为对该主题的快速介绍。 什么是变异测…

JavaScript数组常用的方法总结

导读&#xff1a;在实际开发中&#xff0c;前端工程师除了写页面布局及样式还要对后端返回的数据进行处理&#xff0c;返回的数据大多数是json格式&#xff0c;一般都是返回一个对象或者数组&#xff0c;下面对常用的数组的使用方法进行总结&#xff0c;方便在开发中手到擒来&a…

Python黑魔法,一行实现并行化

Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题&#xff0c;例如线程的实现和 GIL&#xff0c;我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏“重”。而且往往隔靴搔痒&#xff0c;没有深入探讨日常工作中最有用的内容。 传统…

2. python 参数个数可变的函数

如果想要定义一个参数个数不确定的函数&#xff0c; 可以通过*args,**kwargs实现&#xff1a; *args的使用&#xff1a; **kwargs的使用&#xff1a; 二者的混合使用&#xff1a; 另外还有一些关于调用函数时候的时候常用的技巧&#xff1a; 其和是等价的。 其和是等价的 当然也…

JavaScript常用工具类整理(总结版)

导读&#xff1a;在前端开发过程中需要对常用的功能模块进行封装&#xff0c;常用的方法多次调用需要整合&#xff0c;保证组件的复用性与程序的可维护性&#xff0c;这里总结一下&#xff0c;便于后续的使用&#xff01; 目录 1.全局声明工具类 2.定时器 3.判断变量是否是一…

axis2 json_带有Java和Axis2的JSON Web服务

axis2 json我最近遇到一位客户&#xff0c;要求我使用Java Web服务重建其旧产品。 他们希望它模块化并且易于使用。 我想到的第一件事是使用宁静的方法。 但是让我烦恼的是&#xff0c;Java宁静的方法是使用XML !&#xff0c;我更喜欢一种更简单的通信方式&#xff0c;易于理解…

如何对技术视频转换文章投稿进行二次创作

导读&#xff1a;在技术社区经常会收到一些大的平台&#xff08;华为云博客、infoq等平台的投稿任务&#xff09;&#xff0c;经过对数千篇通用技术稿件&#xff0c;积攒了一些小技巧。所以&#xff0c;在你创作之前还是要好好的看一下&#xff0c;希望对你有帮助&#xff01;看…

iOS开发-UIScrollView原理

转载:http://www.cnblogs.com/xiaofeixiang/p/5144256.html UIScrollView 在开发中是不可避免&#xff0c;关于UIScrollView都有自己一定的理解。滚动视图有两个需要理解的属性&#xff0c;frame和bounds&#xff0c;frame是定义了视 图在窗口的大小和位置&#xff0c;bounds表…

边缘计算如何实现海量IoT数据就地处理

1.什么是IoT边缘&#xff1f;Gartner数据显示&#xff0c;到2021年底将有超过50&#xff05;的大型企业部署至少一个边缘计算应用&#xff1b;到2023年底&#xff0c;50&#xff05;以上的大型企业将至少部署6个用于物联网或沉浸式体验的边缘计算应用。工业一体机的售价一般在1…

《鸿蒙理论知识02》HarmonyOS开发平台和工具

目录 1.应用和开发工具的演进 2.超 级 终 端 应 用 开 发 面 临 全 新 挑 战

用Lucene建立搜索索引

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

twitter api_Java应用程序上的Twitter API

twitter api是否曾想过将推文附加到Java应用程序&#xff1f; 我为此寻找了最好的API&#xff0c;很幸运&#xff0c;我找到了它&#xff01; http://twitter4j.org/ 一个简单的方法&#xff1a; 我们需要做的第一件事是在您的Twitter帐户中创建一个应用程序&#xff0c;为其授…

垂直和水平装饰

装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器&#xff0c;并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确&#xff0c;但是这里有一些值得深思的地方。 公寓&#xff08;1960&#xff09;…

cygwin配置git

对于windows用户来说&#xff0c;使用git bash经常会出现乱码情况&#xff0c;那么一款优质高尚的软件&#xff0c;值得推荐一下了&#xff0c;那就是cygwin 下载cygwin后&#xff0c;在安装过程中&#xff0c;安装git&#xff0c;安装vim编辑器 然后会在安装目录下看到类linux…

前端代码规范网址导航(总结)

在大公司代码规范是非常重要的一件事情,多人协作,还有代码评审。所以能写出漂亮的代码非常重要。 这就好比你自己在家,无论是穿大裤衩子,还是背心,甚至是光膀子,都没人管你。但你要出门去约会,就要把最好的一面展现给别人。这是对别人的尊重,也是给自己的背书。所以遵…

JLupin Next Server乍一看

JEE基础结构现在有了一个新的管理解决方案– JLupin Next Server。 它为应用程序实现提供了另一种方法。 它提供什么&#xff1f; 用于实现JEE应用程序的现有解决方案受到限制。 通过新的应用程序管理方式&#xff0c;JLupin Next Server打破了所有障碍。 JEE的足迹 良好实践…

读《第一次把事情做对》有感

上班的时候&#xff0c;领导在群里发了一个PDF书籍《第一次把事情做对》&#xff0c;被这个书籍名称吸引住了&#xff0c;因为作为程序员每天有开发新任务&#xff0c;解决旧任务的BUG&#xff0c;第一次就把事情做的完全正确几乎不可能呀&#xff0c;觉得很有看的必要&#xf…