<html>
<style>.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;}
</style>
<body></body><html>
<script>
var over=false,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(";");
function create(tag,css){
var elm=document.createElement(tag);
elm.className = css;
document.body.appendChild(elm);
return elm;}
function Tetris(c, t, x, y){
var c=c?c:"c";
this.divs = [create("div",c),create("div",c),create("div",c),create("div",c)];
this.reset = function(){
this.x = typeof x != 'undefined'?x:3;
this.y = typeof y != 'undefined'?y:0;
this.shape = t?t:shapes[Math.floor(Math.random()*(shapes.length-0.00001))].split(",");
this.show();
if(this.field&&this.field.check(this.shape,this.x,this.y,'v')=='D'){
over=true;
this.field.fixShape(this.shape,this.x,this.y);
alert('game over');}}
this.show = function(){
for(var i in this.divs){
this.divs[i].style.left = (this.shape[i*2]*1+this.x)*20+'px';
this.divs[i].style.top = (this.shape[i*2+1]*1+this.y)*20+'px';}}
this.field=null;
this.hMove = function(step){
var r = this.field.check(this.shape,this.x- -step,this.y,'h');
if(r!='N'&&r==0){
this.x-=-step;
this.show();}}
this.vMove = function(){
if(this.field.check(this.shape,this.x,this.y- -1,'v')=='N'){
this.y++;
this.show();}
else{
this.field.fixShape(this.shape,this.x,this.y);
this.field.findFull();
this.reset();}}
this.rotate = function(){
var s=this.shape;
var newShape=[3-s[1],s[0],3-s[3],s[2],3-s[5],s[4],3-s[7],s[6]];
var r = this.field.check(newShape,this.x,this.y,'h');
if(r=='D')return;
if(r==0){
this.shape=newShape;
this.show();}
else if(this.field.check(newShape,this.x-r,this.y,'h')==0){
this.x-=r;
this.shape=newShape;
this.show();}}
this.reset();}
function Field(w,h){
this.width = w?w:10;
this.height = h?h:20;
this.show = function(){
var f = create("div","f")
f.style.width=this.width*20+'px';
f.style.height=this.height*20+'px';}
this.findFull = function(){
for(var l=0;l<this.height;l++){
var s=0;
for(var i=0;i<this.width;i++){
s+=this[l*this.width+i]?1:0;}
if(s==this.width){
this.removeLine(l);}}}
this.removeLine = function(line){
for(var i=0;i<this.width;i++){
document.body.removeChild(this[line*this.width+i]);}
for(var l=line;l>0;l--){
for(var i=0;i<this.width;i++){
this[l*this.width- -i]=this[(l-1)*this.width- -i];
if(this[l*this.width- -i])this[l*this.width- -i].style.top = l*20+'px';}}}
this.check = function(shape, x, y, d){
var r1=0,r2='N';
for(var i=0;i<8;i+=2){
if(shape[i]- -x < 0 && shape[i]- -x <r1)
{r1 = shape[i]- -x;}
else if(shape[i]- -x>=this.width && shape[i]- -x>r1)
{r1 = shape[i]- -x;}
if(shape[i+1]- -y>=this.height || this[shape[i]- -x- -(shape[i+1]- -y)*this.width])
{r2='D'}}
if(d=='h'&&r2=='N')return r1>0?r1-this.width- -1:r1;
else return r2;}
this.fixShape = function(shape,x,y){
var d=new Tetris("d",shape,x,y);
d.show();
for(var i=0;i<8;i+=2){
this[shape[i]- -x- -(shape[i+1]- -y)*this.width]=d.divs[i/2];}}}
var f = new Field();
f.show();
var s = new Tetris();
s.field = f;
s.show();
window.setInterval("if(!over)s.vMove();",500);
document.onkeydown = function(e){
if(over)return;
var e = window.event ? window.event : e;
switch(e.keyCode){
case 38: //up
s.rotate();
break;
case 40: //down
s.vMove();
break;
case 37: //left
s.hMove(-1);
break;
case 39: //right
s.hMove(1);
break;}}
</script>

js俄罗斯方块的更多相关文章

  1. 原生js俄罗斯方块

    效果图 方块定位原理通过16宫格定位坐标,把坐标存到数组中去 [ [[2,0],[2,1],[2,2],[1,2]],//L [[1,1],[2,1],[2,2],[2,3]], //左L [[2,0 ...

  2. js 俄罗斯方块源码,简单易懂

    1.自己引入jquery <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  3. 纯JS实现俄罗斯方块,打造属于你的游戏帝国

    纯JS俄罗斯方块,打造属于你的游戏帝国. 本文原始作者博客 http://www.cnblogs.com/toutou 俄罗斯方块(Tetris, 俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏 ...

  4. 使用JS实现俄罗斯方块游戏

    简单的JS俄罗斯方块游戏源码 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  5. 用纯JS做俄罗斯方块 - 简要思路介绍(1)

    大家都知道俄罗斯方块是一款大众化的游戏了,我很小的时候就玩过,今年已经25岁了,可以说俄罗斯方块确实是历史悠久,做俄罗斯方块是我上个星期开始的想法.也许是由于自己从来没有写过这种东西吧,所以有生疏.代 ...

  6. JS/Jquery版本的俄罗斯方块(附源码分析)

    转载于http://blog.csdn.net/unionline/article/details/63250597 且后续更新于此 1.前言 写这个jQuery版本的小游戏的缘由在于我想通过从零到有 ...

  7. 俄罗斯方块(JS+CSS)

    这是一个用 js + css 写的网页版俄罗斯方块. 具体代码与示例可访问我的另一个博客查看,源码与示例.

  8. js手写俄罗斯方块

    代码如下 html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  9. d3.js 制作简单的俄罗斯方块

    d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块.话不多说先上图片. 1. js tetris类 由于方法拆分 ...

随机推荐

  1. spring boot.定时任务问题记录(TaskScheduler/ScheduledExecutorService异常)

    一.背景 spring boot的定时任务非常简单,只需要在启动类中加上@EnableScheduling注解,然后在对应的方法上配置@Scheduled就可以了,系统会自动处理并按照Schedule ...

  2. posix线程库1

    posix线程库重要的程度不言而喻,这些天学习这个,参考 https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/   首先先 ...

  3. mybatis+mysql返回插入的主键,参数只是提供部分参数

    mybatis+mysql返回插入的主键,参数只是提供部分参数 <insert id="insertByChannelIdOpenid" useGeneratedKeys=& ...

  4. 2014 北京 DevFest 大会能够报名啦,小伙伴们还在等什么

    一年一度的大型开发人员活动,2014 北京 DevFest 大会站点正式上线: http://devfest.gdgbeijing.org/. 还等什么,開始报名了! 今年 DevFest 大会将再次 ...

  5. 写一个android内置android程序

    当我们编译完毕android源代码之后,就须要对他做点什么事情,我如今正在看老罗的"Android源代码情景分析"一书.在这里主要是记录一些书中没有说清楚的地方. 相同.我们创建一 ...

  6. POJ 2891 Strange Way to Express Integers 中国剩余定理解法

    一种不断迭代,求新的求余方程的方法运用中国剩余定理. 总的来说,假设对方程操作.和这个定理的数学思想运用的不多的话.是非常困难的. 參照了这个博客的程序写的: http://scturtle.is-p ...

  7. requireJS使用shim注入非标准模块详解

    在javascript中定义全局变量有2种方式,本质上是等价的,都是向window对象注入属性或者方法. // global.js var g_name = "aty"; wind ...

  8. centos改动sshport

    vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22port.加入一行例如以下: Port 34981 然后保存退出 然后service sshd rest ...

  9. K度限制MST poj 1639

    /* k度限制MST:有一个点的度<=k的MST poj 1639 要求1号点的度不超过k 求MST 我们先把1号点扔掉 跑MST 假设有sum个连通分支 然后把这sum个分支连到1上 就得到了 ...

  10. Middle-help 终极实现元素水平垂直居中

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...