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

现在我们学会了敲代码,简单用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实现俄罗斯方块源代码

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

  1. 《javaScript100例|01》超级经典一套鼠标控制左右滚动图片带自动翻滚

    目录 HTML示例 图片示例 HTML示例 <html > <head> <meta http-equiv="Content-Type" conten ...

  2. 如何在 Lightly 用 JavaScript 制作俄罗斯方块游戏

    在之前的两篇文章中,我们通过介绍 Web 语言的编程软件与简易的网页编程实例来说明 HTML/CSS 和 JavaScript 的概况及关系. 如果还未了解过 Web 编程的小伙伴可以先参考前两个文章 ...

  3. 《javaScript100例|03》自写javaScript+CSS轮显效果

    目录 效果图 代码示例 源码地址:自写Js+CSS轮显效果.rar-互联网文档类资源-CSDN下载https://download.csdn.net/download/weixin_41937552/ ...

  4. Java小白入门200例01之基本打印输出

    作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java.JavaScript,博主也是从零开始一步步把学习成长.深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢 ...

  5. 详解动态规划01背包问题--JavaScript实现

    对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...

  6. javascript实现俄罗斯方块

    以前一直想写俄罗斯方块,连连看,坦克大战等经典的小游戏,不过本人太浮躁,每次写一半遇到问题就放弃了. 这次是自己第一次坚持写完了这个俄罗斯方块. 对javascript不是很熟,所以一些编程的格式,用 ...

  7. 0-1背包问题 动态规划c语言,详解动态规划01背包问题--JavaScript实现

    一开始在接触动态规划的时候,可能会云里雾里,似乎能理解思路,但是又无法准确地表述或者把代码写出来.本篇将一步一步通过作图的方式帮助初次接触动态规划的同学来理解问题.这一篇将以经典的 01背包 问题为例 ...

  8. 01初识JavaScript

    技术交流QQ群:1027579432,欢迎你的加入! 1.JavaScript历史 布兰登-艾奇(Brendan Eich,1961年-): 他在1995年利用10天时间完成JavaScript设计: ...

  9. 《javaScript100例|04》自动播放——Js幻灯片缓冲效果

    目录 效果图 示例 源码地址: 效果图 示例 <html> <head> <title>自动播放--幻灯片缓冲效果</title> <style& ...

最新文章

  1. 基于YOLOv3和PyTorch 的视频-图像模型
  2. iPhone 6 屏幕揭秘
  3. 计算机系本科毕业论文评阅评语,毕业论文评阅教师评语
  4. Spring Cloud【Finchley】-02服务发现与服务注册Eureka + Eureka Server的搭建
  5. 直播预告丨告别后知后觉的指标波动,神策智能预警分析直播来袭
  6. 专家:我国青少年网络安全立法还需完善
  7. q7goodies事例_Java 8 Friday Goodies:Lambda和排序
  8. matlab自考本科真题,行政管理学自考专科试题及答案
  9. C语言入门的三个简易程序
  10. RabbitMQ之交换机总结(图文并茂讲解)
  11. android投屏功能开发,Android PC投屏功能实现的示例代码
  12. 教你PDF怎么压缩的小一点?PDF压缩方法
  13. 计算机pe教程,win7 winpe安装过程图文教程
  14. Hibernate中@Embedded和@Embeddable注解的使用
  15. javascript中获取非行间样式的方法
  16. apple 西单大悦城维修_如何检查Apple是否已召回MacBook(免费维修)
  17. 函数模板的特例化(专用化)以及类型含有const的特殊情况
  18. 走过一片麦田,只能摘一次,并且不能回头,如何保证摘到的麦穗尽可能大
  19. 微短剧:爱优腾、抖快、喜马拉雅的新航线
  20. 计算机网络——概述(1)

热门文章

  1. 【渝粤题库】陕西师范大学700004 植物生理学
  2. lora近几年发展的具体介绍
  3. js中的数据类型分为两大类分别是什么_数据类型有这么重要吗?
  4. mysql names gb2312_mysql_query(set names gb2312)设置客户端字符集
  5. java+语音识别+谷歌_JAVA使用谷歌语音识别API
  6. QPSK信号调制之ASCII码
  7. Java常用类(4)--System类
  8. 很多文章是在下转载贴在此处,是为了自己以后遇到类似问题一时想不起来
  9. 数据竞赛利器 —— xgboost 学习清单
  10. 微信小程序需要https后台的创业机会思考