Javascript
You know what you're supposed to see?
No time to write notes ... :(
This is almost beautiful! You can change the shape of the cube as long as you add or modify it to the 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;
Square Data
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 ';
Box ready to fall
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);
Case 2:CHANGE0 (OBJ1.K); Change1 (OBJ1.K);
Case 4:CHANGE0 (OBJ1.K); Change1 (OBJ1.K); Change2 (OBJ1.K);
}
}
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;
}
Change the shape of a square
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;
}
}
After detecting the change, the value of the square relative to the left.
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;
}
Direction control
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;//Cross
if (obj1.t+y+yy>=rows | | (!special && map[obj1.t+y+yy][obj1.l+x+xx]==1)) return Createblockinmap ()//Vertical
}
catch (e) {}
}
}
SkinDiv.style.left = (obj1.l= (obj1.x+=xx)-obj1.gapx) *OBJW;
SkinDiv.style.top = (obj1.t= (obj1.y+=yy) +obj1.gapy) *objh;
}
Start creating maps.
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 ();
}
Initialize an array of variants of a square
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 ();
}
}
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>