Refiz essa porra... ta aqui:
/*
1. O JOGO
Nosso jogo consiste num quadro onde cabem dez blocos na horizontal por vinte blocos na vertical. Do alto do quadro, caem peças formadas por quatro blocos, com diferentes combinações, que devem ser encaixadas de modo a completar linhas horizontais.
Quando uma linha horizontal é completada, ela é apagada da tela, e todos os blocos acima dela descem uma linha. O objetivo é formar o máximo de linhas possíveis. Se as linhas não forem completadas, as peças vão se empilhando. O jogo acaba quando a pilha de peças tocar a linha mais alta do quadro. Cada vez que uma linha é formada, somamos um ponto no escore.
O jogo é iniciado ao pressionarmos a barra de espaços. As peças são movimentadas no quadro para a direita ou para a esquerda, usando-se as respectivas teclas de seta. Cabe à seta para cima a tarefa de girar a peça, e à seta para baixo, a de acelerar a queda da peça.
São sete os desenhos das peças que caem, e elas serão desenhadas dinamicamente, pelos métodos de desenho do ActionScript, já associadas a um objeto do tipo movie clip, também criado dinamicamente. Para controlar o preenchimento do quadro, usaremos um array bidimensional, composto de 20 ocorrências, cada uma delas contendo outras 10 ocorrências, representando um espaço ocupado ou não por um bloco de peça. O desenho da peça é escolhido aleatoriamente entre os sete tipos e traçado com a informação de quais blocos devem ser preenchidos. Cada bloco tem o tamanho de 20 pixels.
2. A BASE
Crie um novo documento no Flash. Como são 10 por 20 blocos de 20 pixels, teríamos um documento de 200 por 400 pixels. Mas como vamos deixar um espaço na parte inferior da tela para exibir o número de linhas completadas e outras mensagens, acione o menu Modify > Document e redimensione o arquivo para 200 por 430 pixels a uma taxa de 12 frames por segundo. Clique OK.
3. O FUNDO
Selecione a ferramenta retângulo e desenhe um sobre e do tamanho do documento. No painel de cores, clique em Fill Color, escolha um verde clarinho para o preenchimento. Selecione a linha de contorno e clique em Stroke Color. Escolha um verde um pouco mais escuro e aplique ao contorno. Salve o documento como jogodeblocos.fla.
4. OS BLOCOS
Altere o nome da camada para Script e, no primeiro frame,
acione a janela de ActionsScript (tecle F9 com o frame selecionado) para digitar o código. Vamos começar definindo a variável que armazena o tamanho do bloco em pixels
*/
var tamanhoBloco = 20;
//e mais duas contendo os valores de máximo número de blocos possíveis na vertical e horizontal
var maxBlocosVert = 20;
var maxBlocosHorz = 10;
//Em seguida, incluímos mais uma série de boleanas, iniciadas com falso, e revertidas para verdadeiro conforme o desenho da peça.
var formato_T = formato_L = formato_L_inv = formato_S = formato_Z = formato_linha = formato_quadrado = false;
/* 5. OS CONTADORES
Agora, criamos um contador, que será usado para a criação de instâncias de movie clips e duas variáveis que serão usadas para controlar a velocidade com que a peça cai.
*/
var contador = 0;
var velocidade = 10;
var nivelDeVelocidade = 8;
//Para auxiliar no processamento, criamos mais três contadores: um de frames, um de linhas completadas e um de giro da peça.
var contaFrame = 0;
var contaLinhas = 0;
var contaGiro = 0;
//Criamos uma chave para saber se o jogo está correndo ou se está parado e um recipiente para guardarmos os movie clips usados numa partida, apenas para podermos limpá-los no reinício.
var ligado = false;
movieClipList = new Array();
/*6. AS POSIÇÕES
Vamos definir os dois arrays que conterão as posições dos quatro blocos que formam a peça. Ela terá os valores relativos à disposição de blocos dentro de uma grade de 4 por 4 blocos. Os valores iniciados aqui são equivalentes aos do formato linha:
*/
xx = new Array("1", "2", "3", "4");
yy = new Array("1", "1", "1", "1");
//Em seguida, definimos a tabela bidimensional, que é o mapa de como os blocos vão se dispor na tela, à medida que caem. Definimos também, dinamicamente, os campos de mensagem fora da área de jogo, atribuindo a ele um conteúdo inicial:
mapaDeBlocos = new Array();
for (var i = 0; i < maxBlocosHorz; i++) {
mapaDeBlocos[i] = new Array();
mapaDeBlocos[i][maxBlocosVert + 1] = 1;
}
createTextField("texto", 1000000, 0, 400, 200, 32);
createTextField("texto2", 1000001, 0, 413, 200, 32);
texto.text = contaLinhas + " linhas";
texto2.text = "Pressione a barra de espaços para jogar";
//Com esses procedimentos, criamos os alicerces sobre os quais o programa será construído.
/*7. AS INTERAÇÕES
O próximo passo é interceptar as interações do jogador, via teclado, e fazer com que o programa reaja de acordo com o solicitado. Para isso, criamos um objeto que vai “ouvir” o evento de tecla pressionada, e a ele associamos uma função.
*/
keyListener = new Object();
keyListener.onKeyDown = function() {
var k = Key.getCode();
//A variável boleana “ligado” recebe verdadeiro nos procedimentos de iniciação do jogo, e falso nos de finalização. Quando o jogo esta "desligado", qualquer tecla pressionada que não seja a barra de espaço é ignorada.
if ((!ligado) && (k != 32)) {
return
}
//Criamos então uma estrutura switch/case para agir conforme a tecla pressionada.
switch(k) {
// Se pressionada a barra de espaço,
case 32:
/* varre a tabela bidimensional com o mapa do quadro, limpando todas as 200 ocorrências de bloco possíveis. */
for (var i = 0; i <= maxBlocosVert; i++) {
for (var j = 0; j <= maxBlocosHorz; j++) {
mapaDeBlocos[j][i] = undefined;
}
}
for (var i = 0; i < movieClipList.length; i++) {
removeMovieClip(movieClipList[i]);
}
//Chamamos função para iniciar o jogo e saímos da estrutura switch/case. Se pressionada seta para cima, mudamos as coordenadas dos quatro blocos que cada peça, de modo a girá-la na tela.
iniciaJogo();
break;
case 38:
if (formato_linha) {
if (contaGiro == 0) {
if (mapaDeBlocos[xx[0] + 2][yy[0] - 1] == undefined && mapaDeBlocos[xx[1] + 1][yy[1]] == undefined && mapaDeBlocos[xx[2]][yy[2] + 1] == undefined && mapaDeBlocos[xx[3] - 1][yy[3] + 2] == undefined) {
//Caso exista espaço para a rotação da peça, as novas coordenadas são confirmadas, e o o contador de giros vai indicar a nova posição da peça.
xx[0] = xx[0] + 2;
yy[0] = yy[0] - 1;
xx[1] = xx[1] + 1;
yy[2] = yy[2] + 1;
xx[3] = xx[3] - 1;
yy[3] = yy[3] + 2;
contaGiro++;
}
} else {
//Todo o procedimento de teste e reposicionamento é feito para a nova posição desejada, o estado 1, deitado.
if (mapaDeBlocos[xx[0] - 2][yy[0] + 1] == undefined && mapaDeBlocos[xx[1] - 1][yy[1]] == undefined && mapaDeBlocos[xx[2]][yy[2] - 1] == undefined && mapaDeBlocos[xx[3] + 1][yy[3] - 2] == undefined && blocos1._x != 0 && blocos1._x != 20 && blocos1._x != 180) {
xx[0] = xx[0] - 2;
yy[0] = yy[0] + 1;
xx[1] = xx[1] - 1;
yy[2] = yy[2] - 1;
xx[3] = xx[3] + 1;
yy[3] = yy[3] - 2;
//O contador volta à posição original, como se a peça não houvesse sido girada.
contaGiro = 0;
}
}
//A seguir, invocamos a função de usuário para reposicionar os quatro blocos que formam a peça conforme a nova posição.
reposiciona();
/*Esse mesmo procedimento é repetido para todos os formatos, com exceção do formato quadrado, que se fosse girado teria a mesma forma.
O contador de giros é sempre usado para controlar o estado atual de rotação da peça, lembrando que as peças de formato linha, S e Z, têm apenas dois estados de rotação, de pé e deitado, enquanto que as outras têm quatro, exceto as de formato quadrado, que só tem um.
*/
} else if(formato_L) {
if (contaGiro == 0) {
if (mapaDeBlocos[xx[0] + 1][yy[0] - 1] == undefined && mapaDeBlocos[xx[2] - 1][yy[2] + 1] == undefined && mapaDeBlocos[xx[3]][yy[3] - 2] == undefined) {
xx[0] = xx[0] + 1;
yy[0] = yy[0] - 1;
xx[2] = xx[2] - 1;
yy[2] = yy[2] + 1;
yy[3] = yy[3] - 2;
contaGiro++;
}
} else if (contaGiro == 1) {
if (mapaDeBlocos[xx[0] - 1][yy[0] + 1] == undefined && mapaDeBlocos[xx[2] - 1][yy[2] - 2] == undefined && mapaDeBlocos[xx[3]][yy[3] + 1] == undefined && blocos1._x != 0) {
xx[0] = xx[0] - 1;
yy[0] = yy[0] + 1;
xx[2] = xx[2] - 1;
yy[2] = yy[2] - 2;
yy[3] = yy[3] + 1;
contaGiro++;
}
} else if (contaGiro == 2) {
if (mapaDeBlocos[xx[0]][yy[0] + 1] == undefined && mapaDeBlocos[xx[2] + 1][yy[2]] == undefined && mapaDeBlocos[xx[3] - 1][yy[3] + 1] == undefined) {
yy[0] = yy[0] + 1;
xx[2] = xx[2] + 1;
xx[3] = xx[3] - 1;
yy[3] = yy[3] + 1;
contaGiro++;
}
} else {
if (mapaDeBlocos[xx[0]][yy[0] - 1] == undefined && mapaDeBlocos[xx[2] + 1][yy[2] + 1] == undefined && mapaDeBlocos[xx[3] + 1][yy[3]] == undefined && xx[0] !=
{
yy[0] = yy[0] - 1;
xx[2] = xx[2] + 1;
yy[2] = yy[2] + 1;
xx[3] = xx[3] + 1;
contaGiro = 0;
}
}
reposiciona();
}
else if (formato_L_inv) {
if (contaGiro == 0) {
if (mapaDeBlocos[xx[0] + 1][yy[0] - 1] == undefined && mapaDeBlocos[xx[2] + 1][yy[2]] == undefined && mapaDeBlocos[xx[3]][yy[3] + 1] == undefined) {
xx[0] = xx[0] + 1;
yy[0] = yy[0] - 1;
xx[2] = xx[2] + 1;
yy[3] = yy[3] + 1;
contaGiro++;
}
} else if (contaGiro == 1) {
if (mapaDeBlocos[xx[0] - 1][yy[0] + 1] == undefined && mapaDeBlocos[xx[2] + 1][yy[2] - 1] == undefined && mapaDeBlocos[xx[3]][yy[3] - 2] == undefined && blocos1._x != 0) {
xx[0] = xx[0] - 1;
yy[0] = yy[0] + 1;
xx[2] = xx[2] + 1;
yy[2] = yy[2] - 1;
yy[3] = yy[3] - 2;
contaGiro++;
}
} else if (contaGiro == 2) {
if (mapaDeBlocos[xx[0]][yy[0] - 1] == undefined && mapaDeBlocos[xx[2] - 1][yy[2] + 1] == undefined && mapaDeBlocos[xx[3] - 1][yy[3]] == undefined) {
yy[0] = yy[0] - 1;
xx[2] = xx[2] - 1;
yy[2] = yy[2] + 1;
xx[3] = xx[3] - 1;
contaGiro++;
}
} else {
if (mapaDeBlocos[xx[0]][yy[0] + 1] == undefined && mapaDeBlocos[xx[2] - 1][yy[2]] == undefined && mapaDeBlocos[xx[3] + 1][yy[3] + 1] == undefined && xx[0] !=
{
yy[0] = yy[0] + 1;
xx[2] = xx[2] - 1;
xx[3] = xx[3] + 1;
yy[3] = yy[3] + 1;
contaGiro = 0;
}
}
reposiciona();
} else if (formato_S) {
if (contaGiro == 0) {
if (mapaDeBlocos[xx[0] + 1][yy[0] - 2] == undefined && mapaDeBlocos[xx[1] + 1][yy[1]] == undefined) {
xx[0] = xx[0] + 1;
yy[0] = yy[0] - 2;
xx[1] = xx[1] + 1;
contaGiro++;
}
} else {
if (mapaDeBlocos[xx[0] - 1][yy[0] + 2] == undefined && mapaDeBlocos[xx[1] - 1][yy[1]] == undefined && blocos1._x != 0) {
xx[0] = xx[0] - 1;
yy[0] = yy[0] + 2;
xx[1] = xx[1] - 1;
contaGiro = 0;
}
}
reposiciona();
} else if (formato_Z) {
if (contaGiro == 0) {
if (mapaDeBlocos[xx[0] + 1][yy[0]] == undefined && mapaDeBlocos[xx[1] + 1][yy[1]] == undefined && mapaDeBlocos[xx[3]][yy[3] - 2] == undefined) {
xx[0] = xx[0] + 1;
xx[1] = xx[1] + 1;
yy[3] = yy[3] - 2;
contaGiro++;
}
} else {
if (mapaDeBlocos[xx[0] - 1][yy[0]] == undefined && mapaDeBlocos[xx[1] - 1][yy[1]] == undefined && mapaDeBlocos[xx[3]][yy[3] + 2] == undefined && blocos1._x != 0) {
xx[0] = xx[0] - 1;
xx[1] = xx[1] - 1;
yy[3] = yy[3] + 2;
contaGiro = 0;
}
}
reposiciona();
} else if (formato_T) {
if (contaGiro == 0) {
if (mapaDeBlocos[xx[0] + 1][yy[0] - 1] == undefined) {
xx[0] = xx[0] + 1;
yy[0] = yy[0] - 1;
contaGiro++;
}
} else if (contaGiro == 1) {
if (mapaDeBlocos[xx[0] - 1][yy[0] + 1] == undefined && mapaDeBlocos[xx[2]][yy[2] - 2] == undefined && blocos1._x != 0) {
xx[0] = xx[0] - 1;
yy[0] = yy[0] + 1;
yy[2] = yy[2] - 2;
contaGiro++;
}
} else if (contaGiro == 2) {
if (mapaDeBlocos[xx[3] - 1][yy[3] + 1] == undefined) {
xx[3] = xx[3] - 1;
yy[3] = yy[3] + 1;
contaGiro++;
}
} else {
if (mapaDeBlocos[xx[2]][yy[2] + 2] == undefined && mapaDeBlocos[xx[3] + 1][yy[3] - 1] == undefined && blocos1._x != 160) {
yy[2] = yy[2] + 2;
xx[3] = xx[3] + 1;
yy[3] = yy[3] - 1;
contaGiro = 0;
}
}
reposiciona();
}
break;
/* caso tenha sido pressionada a tecla seta para a direita */
case 39:
/* checa a disponibilidade de todas as coordenadas dos quatro blocos uma posição a direita no mapa de blocos */
if (blocos4._x != 180 && mapaDeBlocos[xx[0] - 1][yy[0]] == undefined && mapaDeBlocos[xx[1] - 1][yy[1]] == undefined && mapaDeBlocos[xx[2] - 1][yy[2]] == undefined && mapaDeBlocos[xx[3] - 1][yy[3]] == undefined && mapaDeBlocos[xx[0] + 1][yy[0]] == undefined && mapaDeBlocos[xx[1] + 1][yy[1]] == undefined && mapaDeBlocos[xx[2] + 1][yy[2]] == undefined && mapaDeBlocos[xx[3] + 1][yy[3]] == undefined) {
/* e, em caso afirmativo, recalcula as coordenadas x de cada bloco uma posição à direita. */
for (var i = 0; i < 4; i++) {
xx[i]++;
}
reposiciona();
}
break;
/* fazemos teste e procedimentos semelhantes ao da seta para a direita quando a tecla pressionada for a seta para a esquerda */
case 37:
if (blocos1._x != 0 && mapaDeBlocos[xx[0] - 1][yy[0]] == undefined && mapaDeBlocos[xx[1] - 1][yy[1]] == undefined && mapaDeBlocos[xx[2] - 1][yy[2]] == undefined && mapaDeBlocos[xx[3] - 1][yy[3]] == undefined && mapaDeBlocos[xx[0] + 1][yy[0]] == undefined && mapaDeBlocos[xx[1] + 1][yy[1]] == undefined && mapaDeBlocos[xx[2] + 1][yy[2]] == undefined && mapaDeBlocos[xx[3] + 1][yy[3]] == undefined) {
for (var i = 0; i < 4; i++) {
xx[i]--;
}
reposiciona();
}
break
}
};
//Concluímos o tratamento da tecla pressionada assinalando o objeto Keylistener, criado acima, à classe Key por meio do método addListener. Esse procedimento amarra a função que acabamos de definir ao teclado do computador e faz o Flash Player “ouvir” a tecla pressionada:
Key.addListener(keyListener);
/*8. OS DETALHES
Acertado o fluxo lógico do programa, partimos para a definição das funções de usuário que controlarão os detalhes do jogo. Começamos com a função que inicia o jogo, chamada quando a barra de espaços é pressionada:
*/
iniciaJogo = function ()
{
// ligamos chave que indica ao programa que a barra de espaços foi pressionada e o jogo está ativo
ligado = true;
// iniciamos o contadores
contaLinhas = 0;
velocidade = 10;
nivelDeVelocidade = 8;
contador = 0;
// e invocamos o método que criará um novo movieclip, a próxima peça a cair no jogo
criaNovoObjeto();
// e mostramos o placar de linhas zerado na tela
texto.text = contaLinhas + " linhas";
texto2.text = "";
};