JavaScript 游戏 : 俄罗斯方块

javascript

应该看得懂吧?

没时间写注释。。。:(

这个差不多美的啦!只要向Block里面添加或修改就能改变方块的形状。:)

 

 

<!--
http://futurecom.vze.com
http://dewin.vze.com
http://dewin.126.com
http://dewin.tk

Copyright(c) 1998-2003 dewin all rights reserved

Start 2002-09-20 14:45
Finish  2002-10-31 23:50
Last Edit 2003-08-14 01:25
-->
<body>
<script>

var Rows = 17;
var Cells = 10;
var ObjW = ObjH = 20;

var Scores= 0;
var Marks = [100,400,900,1600];

var BaseBW = 5;
var BaseBGColor = 'white';

var BlockBW = 2;
var BlockBS = 'inset';
var BlockBC = 'orange';

var GlowColor = '#ffff00';
var GlowStrength = 5;

var oSpeed = 151;

//方块数据

Block = [];
Block[0]=[
'   ',
'  1',
'111']
Block[0].change = 4;
Block[0].color = 'red';

Block[1]=[
'   ',
'1  ',
'111']
Block[1].change = 4;
Block[1].color = 'green';

Block[2]=[
'   ',
' 1 ',
'111']
Block[2].change = 4;
Block[2].color = 'orange';

Block[3]=[
' 11',
'11 ']
Block[3].change = 2;
Block[3].color = 'fuchsia';

Block[4]=[
'11 ',
' 11']
Block[4].change = 2;
Block[4].color = 'yellow';

Block[5]=[
'1111']
Block[5].change = 2;
Block[5].color = 'lime';

Block[6]=[
'11',
'11']
Block[6].change = 1;
Block[6].color = 'blue';

Block[7]=[
'1']
Block[7].change = 1;
Block[7].color = 'gold';

Block[8]=[
'   ',
'1 1',
'111']
Block[8].change = 4;
Block[8].color = 'pink';

Block[9]=[
'111',
' 1 ',
' 1 ']
Block[9].change = 4;
Block[9].color = 'black';

//方块准备下落
function ReadyForDown(obj1,obj2){
obj1.k = parseInt(Math.random()*Block.length);
if(!NewBlock[obj1.k].length){
 switch(Block[obj1.k].change){
  case 1:Change0(obj1.k);break;
  case 2:Change0(obj1.k);Change1(obj1.k);break;
  case 4:Change0(obj1.k);Change1(obj1.k);Change2(obj1.k);break;
  }
 }
obj1.Change = parseInt(Math.random()*Block[obj1.k].change);
obj2.innerHTML = NewBlock[obj1.k][obj1.Change].iHtml;
obj1.GapX = parseInt(NewBlock[obj1.k][obj1.Change][0].length/2);
CheckObjGapY(obj1,NewBlock[obj1.k][obj1.Change].length);
obj1.X = parseInt(Cells/2);
obj1.Y = 0;
}

function CheckObjGapY(obj,k){
if(!NewBlock[obj.k][obj.Change][k-1].join('').match(/\d+/)){
 obj.GapY = 1-k;
 CheckObjGapY(obj,k-1);
 }
else obj.GapY = -k;
}

//改变方块形状
function ChangeBlock(){
if(Block[Obj1.k].change > 1){
 Obj1.TestChange = (Obj1.Change+1 >= Block[Obj1.k].change)?0:Obj1.Change+1;
 Obj1.TestGapX = parseInt(NewBlock[Obj1.k][Obj1.TestChange][0].length/2);
 Obj1.TestGapY = -NewBlock[Obj1.k][Obj1.TestChange].length;
 Obj1.TestL = Obj1.X-Obj1.TestGapX;
 Obj1.TestT = Obj1.Y+Obj1.TestGapY;
 var k1 = k2 = Areas;
 for(var i=Obj1.TestL;i>=0 && i>Obj1.TestL-NewBlock[Obj1.k][Obj1.TestChange].lg;i--){if((k1=CheckChangeBlock(i))!=Areas)break}
 for(var i=Obj1.TestL+1;i<Cells && i<Obj1.TestL+NewBlock[Obj1.k][Obj1.TestChange].lg;i++){if((k2=CheckChangeBlock(i))!=Areas)break}
 if(k1 == k2) return;
 Obj1.L = (Math.abs(Obj1.TestL-k1)>Math.abs(Obj1.TestL-k2))?k2:k1;
 Obj1.T = Obj1.TestT;
 Obj1.GapX = Obj1.TestGapX;
 Obj1.GapY = Obj1.TestGapY;
 Obj1.X = Obj1.L+Obj1.GapX;
 Obj1.Y = Obj1.T-Obj1.GapY;
 Obj1.Change = Obj1.TestChange;
 SkinDiv.style.left = Obj1.L*ObjW;
 SkinDiv.style.top = Obj1.T*ObjH;
 SkinDiv.innerHTML = NewBlock[Obj1.k][Obj1.Change].iHtml;
 }
}

检测改变后,方块相对于左边的值。

function CheckChangeBlock(lefts){
for(var y=0;y<NewBlock[Obj1.k][Obj1.TestChange].length;y++){
 for(var x=0;x<NewBlock[Obj1.k][Obj1.TestChange][0].length;x++){
  if(NewBlock[Obj1.k][Obj1.TestChange][y][x]==1){
   try{if(Map[Obj1.TestT+y][lefts+x] != ' ') return Areas}
   catch(e){}
   }
  }
 }
return lefts;
}

//方向控制

function Dir(xx,yy){
var special = false
if(NewBlock[Obj1.k][Obj1.Change].length==1 && NewBlock[Obj1.k][Obj1.Change][0]==1)
 for(var y=Obj1.T+1;y<Rows-1;y++)
  if(Map[y+yy][Obj1.L]==" "){
   special = true
   break;
   }
for(var y=NewBlock[Obj1.k][Obj1.Change].length-1;y>=0;y--){
 for(var x=NewBlock[Obj1.k][Obj1.Change][0].length-1;x>=0;x--){
  if(NewBlock[Obj1.k][Obj1.Change][y][x]==1){
   try{
   if(yy==0 && (Obj1.L+x+xx<0 || Obj1.L+x+xx>=Cells || Map[Obj1.T+y][Obj1.L+x+xx]==1)) return;//横
   if(Obj1.T+y+yy>=Rows || (!special && Map[Obj1.T+y+yy][Obj1.L+x+xx]==1)) return CreateBlockInMap();//竖
   }
   catch(e){}
   }
  }
 }
SkinDiv.style.left = (Obj1.L=(Obj1.X+=xx)-Obj1.GapX)*ObjW;
SkinDiv.style.top = (Obj1.T=(Obj1.Y+=yy)+Obj1.GapY)*ObjH;
}

//开始创造地图啦。
function CreateBlockInMap(){
for(var y=0;y<NewBlock[Obj1.k][Obj1.Change].length;y++){
 for(var x=0;x<NewBlock[Obj1.k][Obj1.Change][0].length;x++){
  try{
  if(NewBlock[Obj1.k][Obj1.Change][y][x]==1){
   Map[Obj1.T+y][Obj1.L+x] = NewBlock[Obj1.k][Obj1.Change][y][x];
   BaseDiv.childNodes[Areas-(Obj1.T+y)*Cells+Obj1.L+x].style.background = Block[Obj1.k].color;
   BaseDiv.childNodes[Areas-(Obj1.T+y)*Cells+Obj1.L+x].style.visibility = 'visible';
   }
  }
  catch(e){return GameOver()}
  }
 }
CheckBlockAppear();
ReadyForDown(Obj2,ReadyBlockDiv);
}

function CheckBlockAppear(){
clearInterval(GoTime2);
GoTime2=0
var NewMap = [];
var iHtml = '';
var k = Rows-1;
var kk = -1;
for(var y=Rows-1;y>=0;y--){
 if(Map[y].join('') != FullString){NewMap[k--] = Map[y]}
 else{
  kk++;
  for(var x=0;x<Cells;x++){
   BaseDiv.childNodes[Areas-(y+kk)*Cells].removeNode(true);
   iHtml += "<span style='width:"+ObjW+";height:"+ObjH+";border:"+BlockBW+" "+BlockBS+" "+BlockBC+";overflow:hidden;visibility:hidden;'></span>";
   }
  }
 }
for(;k>=0;k--){
 NewMap[k] = [];
 for(var x=0;x<Cells;x++){
  NewMap[k][x] = ' ';
  }
 }
if(kk!=-1) ScoreDiv.innerHTML = (Scores+=Marks[kk]);//Cal the Scores
for(var i=0;i<Rows;i++){Map[i]=NewMap[i]}
BaseDiv.innerHTML += iHtml;
for(i in Obj2){Obj1[i] = Obj2[i]}//Obj2 => Obj1
SkinDiv.innerHTML = NewBlock[Obj1.k][Obj1.Change].iHtml;
SkinDiv.style.left = (Obj1.L = Obj1.X-Obj1.GapX)*ObjW;
SkinDiv.style.top = (Obj1.T = Obj1.GapY)*ObjH;
}

function GameOver(){
if(confirm('Game Over , ReStart ?')) window.location.reload();
else window.close();
}

//初始化方块的变形数组

function Change0(k){
NewBlock[k] = [];
NewBlock[k][0] = [];
NewBlock[k][0].iHtml = '';
for(var y=0;y<Block[k].length;y++){
 NewBlock[k][0][y] = [];
 for(var x=0;x<Block[k][0].length;x++){
  NewBlock[k][0].iHtml += ((NewBlock[k][0][y][x]=Block[k][y].charAt(x)) == 1)?BlockHtml(x,y,k):"";
  }
 }
CheckBlockLong(k,0);
}

function Change1(k){
NewBlock[k][1] = [];
NewBlock[k][1].iHtml = '';
for(var y=0;y<Block[k][0].length;y++){
 NewBlock[k][1][y] = [];
 for(var x=0;x<Block[k].length;x++){
  NewBlock[k][1].iHtml += ((NewBlock[k][1][y][x]=Block[k][Block[k].length-x-1].charAt(y)) == 1)?BlockHtml(x,y,k):"";
  }
 }
CheckBlockLong(k,1);
}

function Change2(k){
NewBlock[k][2] = [];
NewBlock[k][3] = [];
NewBlock[k][2].iHtml = '';
NewBlock[k][3].iHtml = '';
for(var y=0;y<Block[k].length;y++){
 NewBlock[k][2][y] = [];
 for(var x=0;x<Block[k][0].length;x++){
  NewBlock[k][2].iHtml += ((NewBlock[k][2][y][x]=Block[k][Block[k].length-y-1].charAt(Block[k][0].length-x-1)) == 1)?BlockHtml(x,y,k):"";
  }
 }
for(var y=0;y<Block[k][0].length;y++){
 NewBlock[k][3][y] = [];
 for(var x=0;x<Block[k].length;x++){
  NewBlock[k][3].iHtml += ((NewBlock[k][3][y][x]=Block[k][x].charAt(Block[k][0].length-y-1)) == 1)?BlockHtml(x,y,k):"";
  }
 }
CheckBlockLong(k,2);
CheckBlockLong(k,3);
}

function BlockHtml(x,y,k){
return "<span style='position:absolute;left:"+x*ObjW+";top:"+y*ObjH+";width:"+ObjW+";height:"+ObjH+";background:"+Block[k].color+";border:"+BlockBW+" "+BlockBS+" "+BlockBC+";overflow:hidden;'></span>"
}

function CheckBlockLong(k,i){
for(var y=0;y<NewBlock[k][i].length;y++){
 NewBlock[k][i][y].lg = (NewBlock[k][i][y].toString().match(/\d+/)==null)?0:NewBlock[k][i][y].join('').match(/\d+/).toString().length;
 }
NewBlock[k][i].lg = 1;
for(var y=0;y<NewBlock[k][i].length;y++){
 NewBlock[k][i].lg = Math.max(NewBlock[k][i][y].lg,NewBlock[k][i].lg);
 }
}

function document.onkeydown(){
switch(event.keyCode){
 case 34:clearInterval(GoTime);oSpeed+=10;if(GoTime>0){Dir(0,1);GoTime=setInterval('Dir(0,1)',oSpeed)};break;//page up
 case 33:if(oSpeed-10>0){clearInterval(GoTime);oSpeed-=5};if(GoTime>0){Dir(0,1);GoTime=setInterval('Dir(0,1)',oSpeed);};break;//page down
 case 38:if(GoTime>0)GoTime2=setInterval("Dir(0,1)",1);break;//up
 case 37:CheckKeyDown(-1,0,150,20);break;//left
 case 39:CheckKeyDown(1,0,150,20);break;//right
 case 40:CheckKeyDown(0,1,150,20);break;//down
 case 96:if(GoTime>0)ChangeBlock();break;//0
 case 83:CheckStart();break;
 }
}

function document.onkeyup(){
DoKeyDown=false
}

function CheckKeyDown(x,y,t1,t2){
if(GoTime>0 && !DoKeyDown){
 Dir(x,y)
 DoKeyDown=true
 setTimeout("if(DoKeyDown)KeyDownAgain("+x+","+y+","+t2+");",t1)
 }
}

function KeyDownAgain(x,y,t2){
if(GoTime>0 && DoKeyDown){
 Dir(x,y)
 setTimeout("KeyDownAgain("+x+","+y+","+t2+")",t2)
 }
}

function CheckStart(){
if(GoTime == -1){
 CheckBlockAppear();
 GoTime = 0;
 ReadyForDown(Obj2,ReadyBlockDiv);
 }
if(!GoTime){
 Dir(0,1);
 GoTime = setInterval('Dir(0,1)',oSpeed);
 }
else{
 clearInterval(GoTime);
 GoTime = 0;
 }
}

var Map = [];
var NewBlock = [];
var Areas = 0;
var GoTime = -1, GoTime2;
var FullString = '';
var Obj1 = new Object();
var Obj2 = new Object();
var DoKeyDown=false

window.focus();
var iHtml = '';
var BaseWidth = Cells*ObjW;
var BaseHeight = Rows*ObjH;
var MainMapWidth = 2*BaseBW+Cells*ObjW;
var MainMapHeight = 2*BaseBW+Rows*ObjH;
document.body.innerHTML += "<font color=red>press \"s\" button to Star or Stop<br>press \"0\" button to Change Quadrel into Another Shape<br>press \"Page Up\" to Speed up<br>press \"Page Down\" to Speed down</font><span style='position:absolute;left:"+(document.body.clientWidth-MainMapWidth)/2+";top:"+(document.body.clientHeight-MainMapHeight)/2+";width:"+MainMapWidth+";height:"+MainMapHeight+";overflow:visible;border:"+BaseBW+" inset #0000CC;'><span style='position:absolute;left:0;top:0;width:"+BaseWidth+";height:"+BaseHeight+";filter:glow(color="+GlowColor+",strength="+GlowStrength+");'><span id='BaseDiv' style='position:absolute;left:0;top:0;width:"+BaseWidth+";height:"+BaseHeight+";filter:flipv;'></span></span><span id=SkinDiv style='position:absolute;'></span><span id='ReadyBlockDiv' style='position:absolute;left:"+MainMapWidth+";top:0;'></span><span id=ScoreDiv style='position:absolute;left:"+(MainMapWidth+50)+";top:"+(MainMapHeight-20)+";'>"+Scores+"</span></span>";
for(var i=0,k=Cells*Rows;i<k;i++){iHtml += "<span style='width:"+ObjW+";height:"+ObjH+";border:"+BlockBW+" "+BlockBS+" "+BlockBC+";overflow:hidden;visibility:hidden;'></span>"}
for(var i=0;i<Block.length;i++) NewBlock[i]=[]
FullString = new Array(Cells+1).join("1")
for(var y=0;y<Rows;y++){
 Map[y] = [];
 for(var x=0;x<Cells;x++) Map[y][x]=' ';
 }
Areas = Cells*(Rows-1);
BaseDiv.innerHTML = iHtml;
ReadyForDown(Obj2,ReadyBlockDiv);

</script>

 

时间: 2024-12-11 07:44:04

JavaScript 游戏 : 俄罗斯方块的相关文章

javascript实现俄罗斯方块游戏的思路和方法

  javascript实现俄罗斯方块游戏的思路和方法         至于俄罗斯方块的话,有很多的难点,如果有JS去写的话,要考虑到碰撞啊,边界啊,下落等问题,本文这些问题大部分都有考虑到,这里给大家提供一部分思路,抛砖引玉,有需要的小伙伴可以参考下. 观摩一下<编程之美>:"程序虽然很难写,却很美妙.要想把程序写好,需要写好一定的基础知识,包括编程语言.数据结构与算法.程序写得好,需要缜密的逻辑思维能力和良好的梳理基础,而且熟悉编程环境和编程工具." 学了几年的计算机,

整理 25个超好的 HTML5+JavaScript 游戏引擎库

对于一个游戏开发者,寻找一个可以与 JavaScript 和 HTML5 无缝工作的游戏引擎是一个不错的解决方案.市面上有很多免费和付费的游戏引擎,让专业的游戏开发者满意的游戏引擎肯定需要包含独特的东西.游戏开发者对完美游戏引擎的追求永远不会停止. 下面我们整理出地球上使用最好的html5和javascript游戏引擎列表,每个游戏引擎有每个人想要的特性.每个游戏引擎有他自己的优缺点,这样你可以根据你自己的需求做选择,我确定这个列表中有你在寻找的游戏引擎 1) Canvas Engine Can

javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来_javascript技巧

首先来说,让一个游戏赋有可玩性必须要动静结合.(哈哈,大家以为我要讲作文了...但其实我今天要讲的是Javascript)静态的东西谁不会做呢?因为东西一生下来就是静态的(除非你是用的gif动画),所以不需要任何处理就能完成静态.那么我将要在下面告诉大家如何运用Javascript将静态图片变为动态图片. 一.图片准备     fight01.pngfight02.pngfight03.pngfight04.png03.png02.png01.png首先,我找了一些出自经典游戏<三国志曹操传>

JavaScript游戏中使用OOP和设计模式让代码变得更智能

学习如何在 http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 中使用基于经典继承的库从 OOP 中获得更多的好处.本文还将介绍架构式设计模式,来展示了如何使用游戏循环.状态机和事件冒泡 (event bubbling) 示例来编写更整洁的代码. 在本文中,您将了解 JavaScript 中的 OOP,来探索原型继承模型和经典继承模型.举例说明游戏中能够从 OOP 设计的结构和可维护性中获得极大利益的模式.我们的最终

javascript实现俄罗斯方块游戏的思路和方法_javascript技巧

观摩一下<编程之美>:"程序虽然很难写,却很美妙.要想把程序写好,需要写好一定的基础知识,包括编程语言.数据结构与算法.程序写得好,需要缜密的逻辑思维能力和良好的梳理基础,而且熟悉编程环境和编程工具." 学了几年的计算机,你有没有爱上编程.话说,没有尝试自己写过一个游戏,算不上热爱编程. 俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾.相信大多数同学,曾经为它痴迷得茶不思饭不想. 游戏规则 1.一个用于摆放小型正方形的平

JavaScript实现俄罗斯方块游戏过程分析及源码分享_javascript技巧

观摩一下<编程之美>:"程序虽然很难写,却很美妙.要想把程序写好,需要写好一定的基础知识,包括编程语言.数据结构与算法.程序写得好,需要缜密的逻辑思维能力和良好的梳理基础,而且熟悉编程环境和编程工具." 学了几年的计算机,你有没有爱上编程.话说,没有尝试自己写过一个游戏,算不上热爱编程. 俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾.相信大多数同学,曾经为它痴迷得茶不思饭不想. 游戏规则 1.一个用于摆放小型正方形的平

原生JavaScript编写俄罗斯方块_javascript技巧

首先这里感谢@jdkleo  提出的宝贵建议! 说实在的吧,我这个俄罗斯方块大家玩起来别骂我就万岁了,还没完全完成的,只完成了50%,而且还有很多BUG. 可以实现的功能: 1.掉方块 2.随机生成新方块 3.方块移动. 目前BUG还很多,由于是第一次写这么"大"的游戏,有1000多行代码,所以还请高人指点,BUG太多了. 按START开始游戏. 大家提提建议,我第一次写JS游戏. 参考了一下网上其他人的代码,但是不是照抄. 代码可以直接运行,不用引用JQUERY. 希望大神们能给点建

Javascript编写俄罗斯方块思路及实例_javascript技巧

俄罗斯方块这个游戏也做了移动端的兼容, 这个游戏难点是怎么翻转方块, 自己实现的方式是把方块放到一个二维数组, 然后逆时针旋转二维数组. 也有别的方法,比如直接用一个全局变量代表一个方向, 翻转的时候根据这个变量转动方块, 但是代码要写更多. 在文库搜索到了一篇关于算法的文章, ....看着好心塞: 游戏截图PC端: 游戏截图移动端: 模板引擎用了HandlebarsJS,  为了更好的模块化,也用了requireJS....没用好: 运行下面代码 var cfg = { width:14, h

精心打造的全球唯一一款javascript游戏引擎

当前市面上的网页游戏基本都是采用国外成熟的flash游戏引擎开发出大同小异的网页游戏或者自己开发的flash游戏,通过一些吸引人的.刺眼的"老婆不在家"式的甚至病毒式的广告宣传,让网页浏览者不可忍受.去又拿他们没办法,人家有的是钱,烧的就是钱,损伤的用户的眼睛,损害小孩子的心灵,浪费咱的时间. 目前由睿德网络花费巨资,历时3年之久自主研发成功了一款(JavaScript HTML5)网络图形互动游戏产品,全球首创最大的WEB3.0网页虚拟社区--<奇幻世界>,采用图形虚拟社