JavaScript Games: Tetris

Source: Internet
Author: User
Tags abs filter array object join tostring visibility window
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>



Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.