快捷搜索:

科学知识

当前位置:betway必威官网手机版 > 科学知识 > 包蕴着那样好多学知识,JavaScript达成俄罗丝四方

包蕴着那样好多学知识,JavaScript达成俄罗丝四方

来源:http://www.abirdfarm.com 作者:betway必威官网手机版 时间:2019-11-15 01:20

1984年的时候,当时还名不见经传的阿列克谢•帕基特诺夫(Alexey Pajitnov)只是苏联科学院计算机中心的一位普通的工程师。他热衷于开发电脑游戏,不过这些游戏卖得都不好。那年夏天,他突然又想到了一个新点子——让不同形状的积木落进一个矩形的玻璃容器里,在容器底部堆叠起来,使之排列成完整的一行或多行。在两位同伴的协助下,他很快编写好了这个游戏。

你知道吗?平时我们生活中所熟悉的玩具和娱乐游戏中,常常含有许多与数学有关的知识,例如俄罗斯方块这一拼图游戏。

观摩一下《编程之美》:“程序虽然很难写,却很美妙。要想把程序写好,需要写好一定的基础知识,包括编程语言、数据结构与算法。程序写得好,需要缜密的逻辑思维能力和良好的梳理基础,而且熟悉编程环境和编程工具。”

虽然他早就预感到这个游戏可能会火起来,但结果还是令他瞠目结舌:这个游戏在莫斯科迅速流行起来,并很快风靡全球。在此后的27年里,这个游戏被移植到了几乎所有的电脑系统和游戏平台上,不少mp3、mp4、手机、电视甚至示波器上也附带有这个游戏。并且它还衍生出其他各类玩法,极大丰富了解谜游戏的类型。这个无人不知无人不晓的经典游戏后来被命名为——俄罗斯方块。

俄罗斯方块游戏里总共会有7种不同形状方块不断随机下落,根据它们的形状来命名,分别为I、J、L、O、S、T、Z

学了几年的计算机,你有没有爱上编程。话说,没有尝试自己写过一个游戏,算不上热爱编程。

俄罗斯方块的小知识

你对俄罗斯方块了解多少?你知道俄罗斯方块的游戏场地大小吗?你知道每一种方块的名字吗?

俄罗斯方块的游戏场地是一个宽为10,高为20的矩形。游戏里共有7种方块,根据它们的形状分别命名为I, J, L, O, S, T, Z。玩家需要控制不断下落的方块填放到合适的位置,被填满的行将自动消除。视局面的不同,玩家一次可消除1行至4行不等,这在游戏里分别叫做 SINGLE、DOUBLE、TRIPLE和TETRIS。一次性消除的行数越多,得分也就越高。随着被消除的总行数的增加,方块下落速度会越来越快。一旦某个方块放置后超出了场地高度,游戏便自动结束。

betway必威官网手机版 1

罗斯方块的游戏规则是玩家需要通过自行调整变换随机掉下的不同形状的方块,将之填放到适当的位置,被填满的行将自动消除。玩家一次可消除1行至4行不等。

俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾。相信大多数同学,曾经为它痴迷得茶不思饭不想。

俄罗斯方块背后的数学问题

到如今俄罗斯方块已经诞生27年了。在这27年里,俄罗斯方块不但让几代玩家为之疯狂,也让不少数学家沉迷于其中。

俄罗斯方块引出的第 一个数学问题是,如果玩家的技术足够高,游戏是否永远也不会结束?1988年,约翰•布鲁托斯基(John Brzustowski)的一篇论文指出,若“S”型方块和“Z”型方块以适当的间隔交替出现时,游戏区域中将不可避免地出现越来越多无法消去的行,最终导致游戏结束。虽然这种情况发生的概率极低,但毕竟是有可能的,因此理论上俄罗斯方块是不能一直玩下去的。

另一个值得思考的问题是,游戏中用到的7种方块总面积为28,那么是否能用这7个不同形状的方块拼出一个4×7的矩形呢?虽然游戏中的方块似乎都是填补空间的好手,但这个问题的答案却是否定的。原因很简单:如果把这7种方块都放到国际象棋棋盘上,你会发现几乎每一种方块都总是占据着两个黑色格子和两个白色格子,只有“T”型方块所占的黑白格子个数始终不等。因而7个方块所占据的黑白格子总数也是不相等的。但在一个4×7的矩形区域中黑白格子数目是相同的,因此它不可能被这7个方块完全覆盖住。

betway必威官网手机版 2

有趣的是,这7种方块恰好能构成一个平面镶嵌。如果一组几何图形能够既无重叠又无空缺地填满整个平面,我们就把它称作一种平面镶嵌。地砖的形状基本上都是等边三角形、正方形和正六边形,这就是因为单用一种正多边形构造平面镶嵌仅有这三种情况。如果允许使用多种图形,我们还能构造出更多漂亮的平面镶嵌图。一些设计师别出心裁,把墙砖做成了俄罗斯方块的形状,给居家生活带来几分创意。

betway必威官网手机版 3

而随着被消除的总行数的不断增加,方块下落的速度也会越来越快。一旦某个方块放置后超出了原规定矩形的高度,游戏便自动结束。

游戏规则

趣味拼图题

我坚信人人都玩过这极易上手的游戏。还有很多人用俄罗斯方块搭建出各种创意图形。那你能搞定下面两个问题吗:

如何把6个“L”形状的方块摆放在一起,使得每个“L”恰好都和另外三个“L”相邻?

怎样用奇数个“L”摆成一个轴对称图形?

(答案随后揭晓)

在游戏过程中,一次消去1行得100分,消去2行得300分,消去3行得600分,消去4行得1000分。

1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。

从俄罗斯方块到多联骨牌

数学家们还对这几种方块进行了扩展,用于更深层次的研究。通常把所有由若干个小正方形拼接起来组成的图形统称为多联骨牌 (Polyomino)。多联骨牌是组合数学中一个有趣而又非常具有挑战性的课题。俄罗斯方块中所用到的就是四联骨牌,它一共有7种。利用计算机穷举我们还能很快知道,五联骨牌有18种,六联骨牌则有60种。但对于一般的n联骨牌的数目,数学家们只找到了一些近似公式,目前仍然没有一个准确的答案。另外,哪些多联骨牌可以拼成完全对称图形,哪些多联骨牌能够平铺整个平面,这都是数学家们研究的课题。多联骨牌不仅是电子游戏和数学谜题中的常客,在生活各个领域中也都随处可见。包装盒的展开图、组合家具的设计、元素周期表的排版、围棋中的死活棋⋯⋯它们都和俄罗斯方块有着千丝万缕的联系。

答案揭晓:

第一问答案:

betway必威官网手机版 4

第二问答案:

betway必威官网手机版 5

由此可知,消1行的得分与消掉行数的比值是100:1;消2行的得分与消掉行数的比值是150:1;消3行的得分与消掉行数的比值是200:1;消4行的得分与消掉行数的比值是250:1。显然,这一比值是呈递增形式的,而且依次增值的数额为50。

2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

如果我们从总得分上来分析,可发现100、300、600、1000的变化规律是300-100=200,600-300=300,1000-600=400,相邻两个数间的差额同样也呈递增形式,而且依次增值的数额是100。

betway必威官网手机版 6

这两条规律都说明了——如果把方块一次聚积到2行、3行、4行再消掉的话,那得分会比一行一行消去的分数要高得多。

I:一次最多消除四层

俄罗斯方块引发了一个值得思考的数学问题,假如玩家的技术水平高超,那么这一游戏是否永远不会结束?

J(左右):最多消除三层,或消除二层

包蕴着那样好多学知识,JavaScript达成俄罗丝四方游戏进程解析及源码分享。答案是否定的。

L:最多消除三层,或消除二层

曾有论文指出,当“S”型方块和“Z”型方块以适当的间隔交替出现时,游戏区域中将不可避免地出现越来越多无法消去的行,最终导致游戏结束。虽然这种情况发生的概率极低,但仍然是有可能的。

O:消除一至二层

另一个问题是,游戏中用到的7种方块的总面积为28格,若每块只能用一次且允许翻转,是否能用这7个不同形状的方块拼出一个完整的矩形呢?

S(左右):最多二层,容易造成孔洞

答案仍然是否定的。

Z (左右):最多二层,容易造成孔洞

原因很简单,利用染色策略,将每个方格按黑白相间进行染色,会发现每一种方块都总是占据着两个黑色格子和两个白色格子,只有“T”型方块所占的黑白格子个数始终不等。

T:最多二层

因而7个方块所占据的黑白格子总数也不相等,但在一个规定的矩形区域中黑白格子数目是相同的,因此它不能被这7个方块完全覆盖住,用7种俄罗斯方块拼成一个完整的矩形是不可能的。

方块会从区域上方开始缓慢继续落下。玩家可以以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。

玩了那么多年的俄罗斯方块,其中巧妙的数学思维和空间想象你了解了吗?

分析与解法

betway必威官网手机版 7

每块方块落下的过程中,我们可以做:

1)旋转到合适的方向

2)水平移动到某一列

3)垂直下落到底部

首先,需要用一个二维数组,area[18][10]表示18*10的游戏区域。其中,数组中值为0表示空,1表示有方块。

方块一共7种,每种有4种方向。定义activeBlock[4],在编译之前这个数组的值预定算好,在程序中直接使用。

难点

 1)边界检查。

 //检查左边界,尝试着朝左边移动一个,看是否合法。
function checkLeftBorder(){ 
  for(var i=0; i<activeBlock.length; i  ){ 
    if(activeBlock[i].y==0){ 
      return false; 
    } 
    if(!isCellValid(activeBlock[i].x, activeBlock[i].y-1)){ 
      return false; 
    } 
  } 
  return true; 
} //同理,需要检测右边界和底边界

 2)旋转, 需要数理逻辑, 一个点相对另外一个点旋转90度的问题。
 3)定时和监听键盘事件机制让游戏自动运行下去。

//开始 
function begin(e){ 
  e.disabled = true; 
  status = 1; 
  tbl = document.getElementById("area"); 
  if(!generateBlock()){ 
    alert("Game over!"); 
    status = 2; 
    return; 
  } 
  paint(); 
  timer = setInterval(moveDown,1000); 
} 
document.onkeydown=keyControl;

程序过程

1)用户点开始->构造一个活动图形, 设置定时器。

//当前活动的方块, 它可以左右下移动, 变型。当它触底后, 将会更新area; 
var activeBlock; 
//生产方块形状, 有7种基本形状。 
function generateBlock(){ 
  activeBlock = null; 
  activeBlock = new Array(4); 
  //随机产生0-6数组,代表7种形态。
  var t = (Math.floor(Math.random()*20) 1)%7; 
  switch(t){ 
    case 0:{ 
      activeBlock[0] = {x:0, y:4}; 
      activeBlock[1] = {x:1, y:4}; 
      activeBlock[2] = {x:0, y:5}; 
      activeBlock[3] = {x:1, y:5}; 

      break; 
    } 
    //省略部分代码..............................
    case 6:{ 
      activeBlock[0] = {x:0, y:5}; 
      activeBlock[1] = {x:1, y:4}; 
      activeBlock[2] = {x:1, y:5}; 
      activeBlock[3] = {x:1, y:6}; 
      break; 
    } 
  } 
  //检查刚生产的四个小方格是否可以放在初始化的位置. 
  for(var i=0; i<4; i  ){ 
    if(!isCellValid(activeBlock[i].x, activeBlock[i].y)){ 
        return false; 
      } 
    } 
  return true; 
}

2)每次向下移动后, 都检查是否触底, 如果触底了, 则尝试消行。

//消行 
function deleteLine(){ 
  var lines = 0; 
  for(var i=0; i<18; i  ){ 
    var j=0; 
    for(; j<10; j  ){ 
      if(area[i][j]==0){ 
        break; 
    } 
  } 
  if(j==10){ 
    lines  ; 
    if(i!=0){ 
      for(var k=i-1; k>=0; k--){ 
        area[k 1] = area[k]; 
      } 
    } 
    area[0] = generateBlankLine(); 
    } 
  } 
  return lines; 
}

3)完了之后再构造一个活动图形, 再设置定时器。

效果图

betway必威官网手机版 8

betway必威官网手机版 9

betway必威官网手机版 10

有待优化

1)设置不同形状方块的颜色。

  思路:在创建方块函数内,设定activeBlockColor颜色,七种不同形态方块颜色各异(除了修改generateBlock方法之外,还需要修改paintarea方法。因为一开始考虑不周全,消除一行后,重绘方块的同时将颜色统一,因此可以考虑移除表格n行,然后在顶部增添n行,以保证没消除方块的完整性)。

2)当当前方块下落时,可以提前查看下一个方块。

  思路:将generateBlock方法拆分成两部分,一部分用于随机尝试下一个方块,一部分用于缓存当前所要描绘的方块。当当前方块碰到底部被固定后,下一方块开始描绘,同时又再次随机产生新方块。如此反复。

完整HTML源码:

<!DOCTYPE>
<html> 
<head> 
<title>Tetris</title> 
<meta charset="UTF-8">
<style> 
*{
 font-family: "微软雅黑";
}
.tetrisContainer{
 width: 230px;
 height: 400px;
 position: relative;
 left: 50%;
 margin-left: -115px;
 top: 40%;
 margin-top: -200px;
}
#area tr td{ 
 width: 20px; 
 height: 20px; 
 border:1px solid #ccc;
} 
</style> 
</head> 
 <body> 
  <div class = "tetrisContainer">
   <input type="button" value="开始游戏" onclick="begin(this);"/> 得分:  0
   <table id="area" cellspacing="0" cellpadding="0" border="1" style="border-collapse:collapse"><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table>
  </div>
 </body> 
 <script type="text/javascript" src="script/tetris.js"></script>
</html> 

完整tetris.js源码:

/** 
* JS俄罗斯方块游戏 v 1.0
*/ 
//表示页面中的table, 这个table就是将要显示游戏的主面板 
var tbl; 
//游戏状态 0: 未开始;1 运行; 2 中止; 
var status = 0; 
//定时器, 定时器内将做moveDown操作 
var timer; 
//分数 
var score = 0; 

//area是一个18*10的数组,也和页面的table对应。初始时都为0, 如果被占据则为1 

var area = new Array(18); 
for(var i=0;i<18;i  ){ 
 area[i] = new Array(10); 
} 
for(var i=0;i<18;i  ){ 
 for(var j=0; j<10; j  ){ 
  area[i][j] = 0; 
 } 
} 

//当前活动的方块, 它可以左右下移动, 变型。当它触底后, 将会更新area; 
var activeBlock; 
//生产方块形状, 有7种基本形状。 
function generateBlock(){ 
 activeBlock = null; 
 activeBlock = new Array(4); 
 //随机产生0-6数组,代表7种形态。
 var t = (Math.floor(Math.random()*20) 1)%7; 
 switch(t){ 
  case 0:{ 
   activeBlock[0] = {x:0, y:4}; 
   activeBlock[1] = {x:1, y:4}; 
   activeBlock[2] = {x:0, y:5}; 
   activeBlock[3] = {x:1, y:5}; 

   break; 
  } 
  case 1:{ 
   activeBlock[0] = {x:0, y:3}; 
   activeBlock[1] = {x:0, y:4}; 
   activeBlock[2] = {x:0, y:5}; 
   activeBlock[3] = {x:0, y:6}; 
   break; 
  } 
  case 2:{ 
   activeBlock[0] = {x:0, y:5}; 
   activeBlock[1] = {x:1, y:4}; 
   activeBlock[2] = {x:1, y:5}; 
   activeBlock[3] = {x:2, y:4}; 
   break; 
  } 
  case 3:{ 
   activeBlock[0] = {x:0, y:4}; 
   activeBlock[1] = {x:1, y:4}; 
   activeBlock[2] = {x:1, y:5}; 
   activeBlock[3] = {x:2, y:5}; 
   break; 
  } 
  case 4:{ 
   activeBlock[0] = {x:0, y:4}; 
   activeBlock[1] = {x:1, y:4}; 
   activeBlock[2] = {x:1, y:5}; 
   activeBlock[3] = {x:1, y:6}; 
   break; 
  } 
  case 5:{ 
   activeBlock[0] = {x:0, y:4}; 
   activeBlock[1] = {x:1, y:4}; 
   activeBlock[2] = {x:2, y:4}; 
   activeBlock[3] = {x:2, y:5}; 
   break; 
  } 
  case 6:{ 
   activeBlock[0] = {x:0, y:5}; 
   activeBlock[1] = {x:1, y:4}; 
   activeBlock[2] = {x:1, y:5}; 
   activeBlock[3] = {x:1, y:6}; 
   break; 
  } 
 } 
 //检查刚生产的四个小方格是否可以放在初始化的位置. 
 for(var i=0; i<4; i  ){ 
  if(!isCellValid(activeBlock[i].x, activeBlock[i].y)){ 
    return false; 
   } 
  } 
 return true; 
} 
//向下移动 
function moveDown(){ 
 //检查底边界. 
 if(checkBottomBorder()){ 
  //没有触底, 则擦除当前图形, 
  erase(); 
  //更新当前图形坐标 
  for(var i=0; i<4; i  ){ 
   activeBlock[i].x = activeBlock[i].x   1; 
  } 
  //重画当前图形 
  paint(); 
 } 
 //触底, 
 else{ 
  //停止当前的定时器, 也就是停止自动向下移动. 
  clearInterval(timer); 
  //更新area数组. 
  updatearea(); 
  //消行 
  var lines = deleteLine(); 
  //如果有消行, 则 
  if(lines!=0){ 
   //更新分数 
   score = score   lines*10; 
   updateScore(); 
   //擦除整个面板 
   erasearea(); 
   //重绘面板 
   paintarea(); 
  } 
  //产生一个新图形并判断是否可以放在最初的位置. 
  if(!generateBlock()){ 
   alert("Game over!"); 
   status = 2; 
   return; 
  } 
  paint(); 
  //定时器, 每隔一秒执行一次moveDown 
  timer = setInterval(moveDown,1000) 
 } 
} 
//左移动 
function moveLeft(){ 
 if(checkLeftBorder()){ 
  erase(); 
  for(var i=0; i<4; i  ){ 
   activeBlock[i].y = activeBlock[i].y - 1; 
  } 
  paint(); 
  } 
 } 
 //右移动 
function moveRight(){ 
 if(checkRightBorder()){ 
  erase(); 
  for(var i=0; i<4; i  ){ 
   activeBlock[i].y = activeBlock[i].y   1; 
  } 
  paint(); 
 } 
} 
//旋转, 因为旋转之后可能会有方格覆盖已有的方格. 
//先用一个tmpBlock,把activeBlock的内容都拷贝到tmpBlock, 
//对tmpBlock尝试旋转, 如果旋转后检测发现没有方格产生冲突,则 
//把旋转后的tmpBlock的值给activeBlock. 
function rotate(){ 
 var tmpBlock = new Array(4); 
 for(var i=0; i<4; i  ){ 
  tmpBlock[i] = {x:0, y:0}; 
 } 
 for(var i=0; i<4; i  ){ 
  tmpBlock[i].x = activeBlock[i].x; 
  tmpBlock[i].y = activeBlock[i].y; 
 } 
 //先算四个点的中心点,则这四个点围绕中心旋转90度。 
 var cx = Math.round((tmpBlock[0].x   tmpBlock[1].x   tmpBlock[2].x   tmpBlock[3].x)/4); 
 var cy = Math.round((tmpBlock[0].y   tmpBlock[1].y   tmpBlock[2].y   tmpBlock[3].y)/4); 
 //旋转的主要算法. 可以这样分解来理解。 
 //先假设围绕源点旋转。然后再加上中心点的坐标。 

 for(var i=0; i<4; i  ){ 
  tmpBlock[i].x = cx cy-activeBlock[i].y; 
  tmpBlock[i].y = cy-cx activeBlock[i].x; 
 } 
 //检查旋转后方格是否合法. 
 for(var i=0; i<4; i  ){ 
 if(!isCellValid(tmpBlock[i].x,tmpBlock[i].y)){ 
  return; 
 } 
} 
//如果合法, 擦除 
erase(); 
//对activeBlock重新赋值. 
for(var i=0; i<4; i  ){ 
 activeBlock[i].x = tmpBlock[i].x; 
 activeBlock[i].y = tmpBlock[i].y; 
} 
//重画. 
paint(); 
} 
//检查左边界,尝试着朝左边移动一个,看是否合法。
function checkLeftBorder(){ 
 for(var i=0; i<activeBlock.length; i  ){ 
  if(activeBlock[i].y==0){ 
   return false; 
  } 
  if(!isCellValid(activeBlock[i].x, activeBlock[i].y-1)){ 
   return false; 
  } 
 } 
 return true; 
} 
//检查右边界,尝试着朝右边移动一个,看是否合法。
function checkRightBorder(){ 
 for(var i=0; i<activeBlock.length; i  ){ 
  if(activeBlock[i].y==9){ 
   return false; 
  } 
  if(!isCellValid(activeBlock[i].x, activeBlock[i].y 1)){ 
   return false; 
  } 
 } 
 return true; 
} 
//检查底边界,尝试着朝下边移动一个,看是否合法。
function checkBottomBorder(){ 
 for(var i=0; i<activeBlock.length; i  ){ 
  if(activeBlock[i].x==17){ 
   return false; 
  } 
  if(!isCellValid(activeBlock[i].x 1, activeBlock[i].y)){ 
   return false; 
  } 
 } 
 return true; 
} 
//检查坐标为(x,y)的是否在area种已经存在, 存在说明这个方格不合法。
function isCellValid(x, y){ 
 if(x>17||x<0||y>9||y<0){ 
  return false; 
 } 
 if(area[x][y]==1){ 
  return false; 
 } 
 return true; 
} 
//擦除 
function erase(){ 
 for(var i=0; i<4; i  ){ 
  tbl.rows[activeBlock[i].x].cells[activeBlock[i].y].style.backgroundColor="white"; 
 } 
} 
//绘活动图形 
function paint(){ 
 for(var i=0; i<4; i  ){ 
  tbl.rows[activeBlock[i].x].cells[activeBlock[i].y].style.backgroundColor="#CC3333"; 
 } 
} 
//更新area数组 
function updatearea(){ 
 for(var i=0; i<4; i  ){ 
  area[activeBlock[i].x][activeBlock[i].y]=1; 
 } 
} 
//消行 
function deleteLine(){ 
 var lines = 0; 
 for(var i=0; i<18; i  ){ 
  var j=0; 
  for(; j<10; j  ){ 
   if(area[i][j]==0){ 
    break; 
  } 
 } 
 if(j==10){ 
  lines  ; 
  if(i!=0){ 
   for(var k=i-1; k>=0; k--){ 
    area[k 1] = area[k]; 
   } 
  } 
  area[0] = generateBlankLine(); 
  } 
 } 
 return lines; 
} 
//擦除整个面板 
function erasearea(){ 
 for(var i=0; i<18; i  ){ 
  for(var j=0; j<10; j  ){ 
   tbl.rows[i].cells[j].style.backgroundColor = "white"; 
  } 
 } 
} 
//重绘整个面板 
function paintarea(){ 
 for(var i=0;i<18;i  ){ 
  for(var j=0; j<10; j  ){ 
   if(area[i][j]==1){ 
    tbl.rows[i].cells[j].style.backgroundColor = "#CC3333"; 
   } 
  } 
 } 
} 
//产生一个空白行. 
function generateBlankLine(){ 
 var line = new Array(10); 
 for(var i=0; i<10; i  ){ 
  line[i] = 0; 
 } 
 return line; 
} 
//更新分数 
function updateScore(){ 
 document.getElementById("score").innerText=" "   score; 
} 
//键盘控制 
function keyControl(){ 
 if(status!=1){ 
  return; 
 } 
 var code = event.keyCode; 
 switch(code){ 
  case 37:{ 
   moveLeft(); 
   break; 
  } 
  case 38:{ 
   rotate(); 
   break; 
  } 
  case 39:{ 
   moveRight(); 
   break; 
  } 
  case 40:{ 
   moveDown(); 
   break; 
  } 
 } 
} 
//开始 
function begin(e){ 
 e.disabled = true; 
 status = 1; 
 tbl = document.getElementById("area"); 
 if(!generateBlock()){ 
  alert("Game over!"); 
  status = 2; 
  return; 
 } 
 paint(); 
 timer = setInterval(moveDown,1000); 
} 
document.onkeydown=keyControl; 

您可能感兴趣的文章:

  • betway必威官网手机版,JS Canvas实现的俄罗斯方块游戏完整实例
  • JAVASCRIPT代码编写俄罗斯方块网页版
  • javascript实现俄罗斯方块游戏的思路和方法
  • 60行js代码实现俄罗斯方块
  • JS俄罗斯方块,包含完整的设计理念
  • JS 俄罗斯方块完美注释版代码
  • js实现俄罗斯方块小游戏分享
  • 原生JavaScript编写俄罗斯方块
  • Javascript编写俄罗斯方块思路及实例
  • JS和canvas实现俄罗斯方块

本文由betway必威官网手机版发布于科学知识,转载请注明出处:包蕴着那样好多学知识,JavaScript达成俄罗丝四方

关键词: