|
|
|
Tetris Game |
|
|
|
This e-mail address is being protected from spam bots, you need JavaScript enabled to view it
| ',
'"#800000">
' + game_name + '
The final challenge
| | ');
var is_NN4 = (document.layers);
var is_IE4 = (document.all);
function Hide_Tag() {
_block.blockxx.style.pixelTop = -game_tag_height;
}
function Show_Level_Tag() {
var next_step = 0;
if ((game_tag_step > 0) && (!game_finished)) {
next_step = Math.ceil(game_tag_step/20);
_block.blockxx.style.pixelTop += next_step;
game_tag_step -= next_step;
setTimeout("Show_Level_Tag()",movement_timer); }
else
Hide_Tag();
}
function Show_Level() {
Clear_Table();
_block.block00.innerHTML = table_intro_dim + table_intro[game_level];
if (game_level > 0) {
_block.blockxx.innerHTML = game_level_tag1 + (game_level+1) + game_level_tag2;
_block.blockxx.style.pixelTop = block_base_y;
game_tag_step = game_tag_offset;
setTimeout("Show_Level_Tag()",movement_timer); }
}
function Check_Position(block_x,block_y) {
return ((!block_position[block_x + block1_x][block_y + block1_y]) &&
(!block_position[block_x + block2_x][block_y + block2_y]) &&
(!block_position[block_x + block3_x][block_y + block3_y]) &&
(!block_position[block_x + block4_x][block_y + block4_y]))
}
function Check_Rotate() {
var block_next_x = block_position_x;
var block_next_dir = (block_direction < 3)?block_direction+1:0;
Set_Offset(block_current,block_next_dir);
if (block_position_y < (block_table_height - block_unit_height)) {
while ((block_next_x + block_unit_width - 1) >= block_table_width) {
block_next_x--; }
if (Check_Position(block_next_x, block_position_y)) {
block_direction = block_next_dir;
return true; }
else {
Set_Offset(block_current,block_direction);
return false; } }
else {
Set_Offset(block_current,block_direction);
return false; }
}
function Check_Direction(x_offset,y_offset) {
var block_next_x = block_position_x + x_offset;
var block_next_y = block_position_y + y_offset;
if ((block_next_x < 0) || (block_next_x > (block_table_width - block_unit_width)) || (block_next_y > (block_table_height - block_unit_height)))
return false
else
return Check_Position(block_next_x, block_next_y);
}
function Set_Offset(block_num, block_dir) {
var block_unit_offset = block_dir * 2;
var block_matrix_offset = block_dir * block_matrix_unit;
block_unit_width = block_unit_dim[block_num][block_unit_offset+0];
block_unit_height = block_unit_dim[block_num][block_unit_offset+1];
block1_x = block_matrix[block_num][block_matrix_offset+0];
block1_y = block_matrix[block_num][block_matrix_offset+1];
block2_x = block_matrix[block_num][block_matrix_offset+2];
block2_y = block_matrix[block_num][block_matrix_offset+3];
block3_x = block_matrix[block_num][block_matrix_offset+4];
block3_y = block_matrix[block_num][block_matrix_offset+5];
block4_x = block_matrix[block_num][block_matrix_offset+6];
block4_y = block_matrix[block_num][block_matrix_offset+7];
}
function Get_Content(block_num) {
return block_content1 + block_images[block_num].src + block_content2;
}
function Drop_Block() {
var drop_step = 1;
block_shown = false;
clearInterval(block_timer_id);
while (Check_Direction(0,drop_step))
drop_step++;
Move_Block(0,drop_step-1);
setTimeout("Check_Block()",1); // setTimeout so that block's final postion can be seen
}
function Move_Block(x_offset,y_offset) {
var block_offset_x = x_offset * block_size;
var block_offset_y = y_offset * block_size;
block_position_x += x_offset;
block_position_y += y_offset;
_block.block1.style.pixelLeft += block_offset_x;
_block.block1.style.pixelTop += block_offset_y;
_block.block2.style.pixelLeft += block_offset_x;
_block.block2.style.pixelTop += block_offset_y;
_block.block3.style.pixelLeft += block_offset_x;
_block.block3.style.pixelTop += block_offset_y;
_block.block4.style.pixelLeft += block_offset_x;
_block.block4.style.pixelTop += block_offset_y;
}
function Show_Block() {
block_position_x = 4;
block_position_y = 0;
block_direction = 0;
block_current = block_next;
block_next = Math.floor(Math.random() * block_type);
Set_Offset(block_current,block_direction);
block_content = Get_Content(block_current);
_block.block1.innerHTML = block_content;
_block.block1.style.pixelLeft = (block1_x + block_position_x) * block_size + block_base_x;
_block.block1.style.pixelTop = block1_y * block_size + block_base_y;
_block.block2.innerHTML = block_content;
_block.block2.style.pixelLeft = (block2_x + block_position_x) * block_size + block_base_x;
_block.block2.style.pixelTop = block2_y * block_size + block_base_y;
_block.block3.innerHTML = block_content;
_block.block3.style.pixelLeft = (block3_x + block_position_x) * block_size + block_base_x;
_block.block3.style.pixelTop = block3_y * block_size + block_base_y;
_block.block4.innerHTML = block_content;
_block.block4.style.pixelLeft = (block4_x + block_position_x) * block_size + block_base_x;
_block.block4.style.pixelTop = block4_y * block_size + block_base_y;
if (block_next != block_current) {
Set_Offset(block_next,block_direction);
block_content = Get_Content(block_next); }
_block.blockp1.innerHTML = block_content;
_block.blockp1.style.pixelLeft = block1_x * block_size + preview_base_x;
_block.blockp1.style.pixelTop = block1_y * block_size + preview_base_y;
_block.blockp2.innerHTML = block_content;
_block.blockp2.style.pixelLeft = block2_x * block_size + preview_base_x;
_block.blockp2.style.pixelTop = block2_y * block_size + preview_base_y;
_block.blockp3.innerHTML = block_content;
_block.blockp3.style.pixelLeft = block3_x * block_size + preview_base_x;
_block.blockp3.style.pixelTop = block3_y * block_size + preview_base_y;
_block.blockp4.innerHTML = block_content;
_block.blockp4.style.pixelLeft = block4_x * block_size + preview_base_x;
_block.blockp4.style.pixelTop = block4_y * block_size + preview_base_y;
if (block_next != block_current) {
Set_Offset(block_current,block_direction);
block_content = Get_Content(block_current); }
block_shown = true;
if (Check_Direction(0,0))
return true
else
return false;
}
function Mark_Block() {
var this_offset_x = 0;
var this_offset_y = 0;
var this_block = null;
block_shown = false;
for (var i = 1; i <= block_component; i++) {
this_offset_x = block_position_x + eval(block_id + i + "_x");
this_offset_y = block_position_y + eval(block_id + i + "_y");
block_position[this_offset_x][this_offset_y] = true;
document.images[this_offset_y*block_table_width+this_offset_x].src = block_images[block_current].src;
this_block = eval(_block_style + block_id + i + "");
this_block.style.pixelTop = -block_size; }
}
function Remove_Line(line_num) {
var this_line = block_position_y + line_num;
var upper_line = this_line - 1;
var no_more_line = false;
while ((upper_line >= 0) && (!no_more_line)) {
no_more_line = true;
for (var i = 0; i < block_table_width; i++) {
if (block_position[i][upper_line]) {
no_more_line = false;
document.images[this_line*block_table_width+i].src = document.images[upper_line*block_table_width+i].src;
block_position[i][this_line] = true;
block_position[i][upper_line] = false; }
else {
document.images[this_line*block_table_width+i].src = table_background.src;
block_position[i][this_line] = false; } }
this_line--;
upper_line--; }
}
function Show_Tag() {
var next_step = 0;
if (game_tag_step > 0) {
next_step = Math.ceil(game_tag_step/10);
_block.blockxx.style.pixelTop += next_step;
game_tag_step -= next_step;
setTimeout("Show_Tag()",movement_timer); }
else
Event_Init();
}
function Clear_Block() {
_block.block1.style.pixelTop = -block_size;
_block.block2.style.pixelTop = -block_size;
_block.block3.style.pixelTop = -block_size;
_block.block4.style.pixelTop = -block_size;
}
function Restart_Game() {
high_score = (high_score < game_score)?game_score:high_score;
game_score = 0;
game_lines = 0;
game_level = 0;
game_finished = false;
Hide_Tag();
Clear_Block();
Clear_Num();
Show_Score();
Show_Lines();
Show_Level();
Start_Block();
}
function Game_Over() {
Event_Release();
clearInterval(block_timer_id);
if (game_winner)
_block.blockxx.innerHTML = game_winner_tag
else
_block.blockxx.innerHTML = game_over_tag;
_block.blockxx.style.pixelTop = block_base_y;
game_winner = false;
game_pause = false;
game_finished = true;
game_tag_step = game_tag_offset;
setTimeout("Show_Tag()",movement_timer);
}
function Clear_Table() {
for (var i = 0; i < block_table_height; i++)
for (var j = 0; j < block_table_width; j++)
if (block_position[j][i]) {
document.images[i*block_table_width+j].src = table_background.src;
block_position[j][i] = false; }
}
function Clear_Num() {
var number_id = null;
clearInterval(number_timer);
for (var i = 0; i <= score_max_index; i++)
if (!score_tag[i]) {
number_id = eval(_block_style + block_id + "x" + i + "");
number_id.style.pixelTop = -block_size;
number_id.style.pixelLeft = 0;
score_tag[i] = true; }
}
function Move_Num() {
var number_id = null;
var score_found = 0;
for (var i = 0; i <= score_max_index; i++)
if (!score_tag[i]) {
number_id = eval(_block_style + block_id + "x" + i + "");
if (number_id.style.pixelTop > block_base_y) {
number_id.style.pixelTop += score_step[number_id.lines-1];
score_found++; }
else {
number_id.style.pixelTop = -block_size;
number_id.style.pixelLeft = 0;
score_tag[i] = true; } }
if (score_found == 0) {
clearInterval(number_timer);
score_shown = false; }
}
function Show_Num(line_num, line_offset) {
var number_id = null;
var this_index = score_index;
var this_offset = ((block1_x + block_position_x) > 0)?-1:0;
var score_content = score_content1 + line_num + score_content2 + score_grip[line_num-1] + score_content3;
while (!score_tag[score_index]) {
score_index++;
if (score_index > score_max_index)
score_index = 0;
if (score_index == this_index) {
score_index++;
if (score_index > score_max_index)
score_index = 0;
break; } }
number_id = eval(_block_style + block_id + "x" + score_index + "");
number_id.lines = line_num;
score_tag[score_index] = false;
number_id.style.pixelLeft = (block1_x + block_position_x + this_offset) * block_size + block_base_x;
number_id.style.pixelTop = (block1_y + block_position_y + line_offset) * block_size + block_base_y;
number_id.innerHTML = score_content;
if (!score_shown) {
score_shown = true;
number_timer = setInterval("Move_Num()",movement_timer); }
}
function Show_Score() {
_block.score.document.forms[0].High_Score.value = high_score;
_block.score.document.forms[0].Game_Score.value = game_score;
}
function Show_Lines() {
if (!game_winner)
_block.score.document.forms[0].Lines_Remain.value = game_level_lines[game_level] - game_lines
else
_block.score.document.forms[0].Lines_Remain.value = game_lines;
}
function Check_Line() {
var line_done = false;
var line_found = 0;
var line_offset = 0;
for (var i = 0; i < block_unit_height; i++) {
line_done = true;
for (var j = 0; j < block_table_width; j++)
if (!block_position[j][block_position_y+i]) {
line_done = false;
break; }
if (line_done) {
if (line_found == 0)
line_offset = i;
line_found++;
Remove_Line(i); } }
if (line_found > 0) {
Show_Num(line_found,line_offset);
game_score += score_grip[line_found-1];
Show_Score();
game_lines += line_found;
if ((game_lines >= game_level_lines[game_level]) && (!game_winner)) {
game_lines -= game_level_lines[game_level];
if (game_level < game_max_level) {
game_level++;
Show_Level(); }
else
game_winner = true; }
Show_Lines(); }
}
function Check_Block() {
Mark_Block();
Check_Line();
Start_Block();
}
function Mov_Block() {
if (Check_Direction(0,1)) {
block_position_y++;
_block.block1.style.pixelTop += block_size;
_block.block2.style.pixelTop += block_size;
_block.block3.style.pixelTop += block_size;
_block.block4.style.pixelTop += block_size; }
else
Check_Block();
}
function Resume_Game() {
game_pause = false;
block_timer_id = setInterval("Mov_Block()",block_timer[game_level]);
number_timer = setInterval("Move_Num()",movement_timer);
}
function Pause_Game() {
game_pause = true;
clearInterval(block_timer_id);
clearInterval(number_timer);
}
function Key_Down() {
var key_code = event.keyCode;
if (game_finished)
Restart_Game()
else {
if (game_pause)
Resume_Game();
if((key_code == key_pause) || (key_code == key_PAUSE)) {
if (block_shown)
Pause_Game(); }
if((key_code == key_down) || (key_code == key_DOWN)) {
if (block_shown)
Drop_Block(); }
if ((key_code == key_up) || (key_code == key_UP)) {
if (block_shown)
if (Check_Rotate())
Rotate_Block(); }
if ((key_code == key_left) || (key_code == key_LEFT)) {
if (block_shown)
if (Check_Direction(-1,0))
Move_Block(-1,0); }
if ((key_code == key_right) || (key_code == key_RIGHT)) {
if (block_shown)
if (Check_Direction(1,0))
Move_Block(1,0); } }
return false;
}
function Rotate_Block() {
while ((block_position_x + block_unit_width - 1) >= block_table_width) {
block_position_x--; }
_block.block1.style.pixelLeft = (block1_x + block_position_x) * block_size + block_base_x;
_block.block1.style.pixelTop = (block1_y + block_position_y) * block_size + block_base_y;
_block.block2.style.pixelLeft = (block2_x + block_position_x) * block_size + block_base_x;
_block.block2.style.pixelTop = (block2_y + block_position_y) * block_size + block_base_y;
_block.block3.style.pixelLeft = (block3_x + block_position_x) * block_size + block_base_x;
_block.block3.style.pixelTop = (block3_y + block_position_y) * block_size + block_base_y;
_block.block4.style.pixelLeft = (block4_x + block_position_x) * block_size + block_base_x;
_block.block4.style.pixelTop = (block4_y + block_position_y) * block_size + block_base_y;
}
function Start_Block() {
if (Show_Block()) {
clearInterval(block_timer_id);
block_timer_id = setInterval("Mov_Block()",block_timer[game_level]); }
else
Game_Over();
}
function Table_Init() {
var layer_content = "";
layer_content = '';
_block.blockb0.innerHTML = layer_content;
layer_content = '';
_block.blockb1.innerHTML = layer_content;
layer_content = '';
for (var i = 0; i < block_table_height; i++) {
layer_content += '';
for (var j = 0; j < block_table_width; j++)
layer_content += ' | ';
layer_content += ' '; }
layer_content += ' ';
_block.block01.innerHTML = layer_content;
layer_content = '';
_block.previewx.innerHTML = layer_content;
layer_content = '';
_block.preview.innerHTML = layer_content;
layer_content = '';
_block.score.innerHTML = layer_content;
}
function Define_Layer(Layer_ID, Layer_Left, Layer_Top, Layer_Width, Layer_Height) {
var this_block = null;
this_block = eval(_block_style + Layer_ID);
this_block.style.pixelLeft = Layer_Left;
this_block.style.pixelTop = Layer_Top;
this_block.style.width = Layer_Width;
this_block.style.height = Layer_Height;
this_block.style.visibility = "visible";
}
function Layer_Init() {
var this_block_id = "";
// layers for falling blocks
for (i = 1; i <= block_component; i++) {
this_block_id = block_id + i + "";
Define_Layer(this_block_id,0,-block_size,block_size,block_size); }
// layers for preview blocks
for (i = 1; i <= block_component; i++) {
this_block_id = block_id + "p" + i + "";
Define_Layer(this_block_id,0,-block_size,block_size,block_size); }
// layers for score points
for (i = 0; i <= score_max_index; i++) {
this_block_id = block_id + "x" + i + "";
Define_Layer(this_block_id,0,-block_size,block_size,block_size); }
// layer for game tags
Define_Layer("blockxx",tag_layer_offset,-game_tag_height,game_tag_width,game_tag_height);
// layer for table outer background
Define_Layer("blockb0",(block_base_x - block_preview_gap),(block_base_y - block_preview_gap),(block_table_width * block_size + block_preview_gap * 2),(block_table_height * block_size + block_preview_gap * 2));
// layer for table inner background
Define_Layer("blockb1",block_base_x,block_base_y,(block_table_width * block_size),(block_table_height * block_size));
// layer for table intro
Define_Layer("block00",block_base_x,block_base_y,(block_table_width * block_size),(block_table_height * block_size));
// layer for table
Define_Layer("block01",block_base_x,block_base_y,(block_table_width * block_size),(block_table_height * block_size));
// layer for preview box background
Define_Layer("previewx",(preview_base_x - block_preview_gap),(preview_base_y - block_preview_gap),(block_preview_x * block_size + block_preview_gap * 2),(block_preview_y * block_size + block_preview_gap * 2));
// layer for preview box
Define_Layer("preview",preview_base_x,preview_base_y,(block_preview_x * block_size),(block_preview_y * block_size));
// layer for score board
Define_Layer("score",(preview_base_x - block_preview_gap),(preview_base_y + block_preview_y * block_size + block_preview_gap + block_table_gap),1,1);
}
function Para_Init() {
var block_window_width = document.body.clientWidth;
var block_window_height = document.body.clientHeight;
var block_scale = 1;
var block_table_x_size = 0;
var block_table_y_size = 0;
block_size = 16;
if ((block_window_width > block_base_width) || (block_window_height > block_base_height)) {
block_scale = Math.min(block_window_width/block_base_width, block_window_height/block_base_height);
block_scale = Math.max(block_scale, 1); }
block_size = Math.floor(block_size * block_scale);
block_table_x_size = block_preview_gap + block_table_width * block_size + block_preview_gap + block_table_gap + block_preview_gap + block_preview_x * block_size + block_preview_gap;
block_table_y_size = block_preview_gap + block_table_height * block_size + block_preview_gap;
block_window_width = Math.max(block_window_width, block_table_x_size);
block_window_height = Math.max(block_window_height, block_table_y_size);
block_base_x = Math.floor((block_window_width - block_table_x_size)/2) + block_preview_gap;
block_base_y = Math.floor((block_window_height - block_table_y_size)/2) + block_preview_gap;
preview_base_x = block_base_x + block_table_width * block_size + block_table_gap + block_preview_gap;
preview_base_y = block_base_y + block_preview_gap;
game_tag_offset = (block_table_height * block_size - game_tag_height)/2;
tag_layer_offset = block_base_x + (block_table_width * block_size - game_tag_width)/2;
block_content1 = '';
table_intro_dim = '
|