Fonte do artigo: csdn Autor: Chen Wanfei
Sobre o autor
Chen Wanfei, homem, é bacharel em matemática e software pela Central South University. Ele foi programador sênior e analista de sistemas na Beijing Great Wall Software. Ele tem vasta experiência em desenvolvimento j2se e j2ee. Atualmente trabalhando na pesquisa j2me. Ele pode ser contatado em [email protected]
resumo
Este artigo fornece um plano de design para um jogo Tetris baseado em MIDP1.0 e fornece o código-fonte completo da implementação. A maior característica do jogo é a adaptabilidade da tela, independentemente do tamanho da tela de vários telefones celulares e PDAs, o jogo sempre consegue obter o melhor efeito de exibição. O jogo foi testado em quatro emuladores do kit de ferramentas sem fio J2me 2.1.
Isenção de responsabilidade: este código do jogo veio originalmente de um projeto japonês de código aberto (veja a referência 1) e foi significativamente modificado pelo autor.
Aqui estão algumas capturas de tela do jogo:
projeto
1. Processo de operação
O processo de funcionamento deste jogo é muito simples Após o usuário iniciar o MIDlet, ele entra na tela principal do jogo e a tela passa a exibir a tela de boas-vindas. Depois que o usuário pressiona o botão [Iniciar], ele pode começar a jogar. Quando o usuário deseja pausar, ele pressiona o botão [Iniciar] novamente e o jogo é pausado se o usuário pressionar o botão [Iniciar] novamente. pausado, o jogo continua a correr. Sempre que o botão [Exit] for pressionado, o MIDlet do jogo será encerrado.
O fluxograma da tela do jogo é o seguinte:
2. Algoritmo
O design do jogo MIDP usa essencialmente um thread ou temporizador para gerar eventos de redesenho e usa threads e entradas do usuário para alterar o estado do jogo. Este jogo não é exceção. Após iniciar o MIDlet, um thread de redesenho é gerado imediatamente, desenhando a tela a cada 50 ms. Claro, existem algumas medidas de otimização ao redesenhar. Nem todos os pixels da tela precisam ser redesenhados, mas existem seleções, como aqueles objetos em queda que foram fixados na tela do jogo (existem 7 tipos de objetos em queda no total). , composto por 4 pequenos tijolos, cada objeto que cai tem uma cor fixa e pode ser girado para cima, para baixo, para a esquerda e para a direita, não havendo necessidade de redesenhá-lo. A tela do jogo é um CommandListener que pode aceitar comandos do teclado do usuário e controlar as ações esquerda, direita, para baixo e rotação do objeto em queda. O controle de fluxo de todo o jogo é refletido no método paint() do objeto de tela do jogo. paint() desenha a tela atual do jogo com base no estado atual do jogo. A tela de boas-vindas e a tela Game Over são bastante simples de desenhar. Desenhar a tela de pausa do jogo também é bastante fácil, basta definir um sinalizador para que, quando paint() for executado, não haja necessidade de realizar uma ação de redesenho. Para desenhar a tela durante o jogo, o objeto em queda precisa ser desenhado na posição atual do objeto em queda. Antes de desenhar o objeto em queda, determine se o objeto em queda ainda pode cair. Se puder cair, deixe-o cair um espaço e, em seguida, desenhe-o. Se o objeto em queda não puder mais cair, determine se o jogo está no estado Game Over. está no estado Game Over. Se o jogo estiver no estado Over, defina o estado do jogo para o estado Game over, para que a tela desenhe a tela Game Over na próxima vez que for redesenhada. Se o jogo não estiver no estado Game over. , No estado Over, o objeto em queda é fixo e, ao mesmo tempo, todas as linhas abaixo da linha atual do objeto em queda são verificadas na tela do jogo para ver se a exclusão da linha é necessária. Se a exclusão da linha for necessária, os dados de. a linha excluída no mapa do jogo é limpa e as linhas excluídas são desenhadas com a cor de fundo. Em seguida, inicialize um novo objeto em queda e desenhe esse novo objeto em queda. O fluxograma do método de pintura é o seguinte:
3. Estrutura de dados
Este jogo envolve as seguintes estruturas de dados.
área de jogo
A área de jogo faz parte da tela do celular ou do PDA. A área é um quadrado e o comprimento lateral deve ser divisível por 16 (porque a área de jogo russa é exatamente um quadrado com 16 tijolos pequenos e 16 tijolos pequenos). largo). Esta área deve estar centralizada na tela, tanto horizontal quanto verticalmente. A área de jogo é dividida em 2 partes horizontalmente, uma parte tem 12 tijolos pequenos de largura para exibir o contêiner do jogo e a outra parte tem 4 tijolos pequenos de largura para exibir o próximo objeto que cai e a pontuação.
tijolos pequenos
Tijolos pequenos fazem parte do contêiner de drop e jogo. Aparece como um quadrado, com o comprimento lateral sendo 1/16 do comprimento lateral da área de jogo. Quando cada tijolo pequeno for desenhado, 1 pixel será deixado nos quatro lados e desenhado em branco ou cinza para que haja um espaço entre os tijolos. Cada tijolo pequeno também possui um ID, que varia de 1 a 8. Podemos usar um array de cores (chamado BRICK_COLORS no programa) para armazenar essas 8 cores. Se o id de um determinado tijolo pequeno for 3, então a cor do tijolo pequeno será BRICK_COLORS[3-1].
objeto caindo
A queda é essencialmente um quadrado feito de 16 pequenos tijolos. Há um total de 7 tipos de objetos em queda, como aqueles em formato de “campo”, em formato de “L”, etc. Existem 4 variações de rotação para cada objeto em queda. Cada objeto em queda possui um ID, que varia de 1 a 7. Porque para um objeto em queda, sua cor é fixa. Também podemos usar o valor subscrito dessa cor no array BRICK_COLORS mais 1 como o id do objeto em queda.
Por exemplo, o objeto em queda em forma de “L” tem um ID 3 e sua variação é:
Então, qual estrutura de dados é usada para armazenar um objeto em queda. Vamos pegar um objeto em queda em forma de "L" como exemplo para ilustrar:
Como cada objeto em queda tem quatro estados, podemos considerar o uso de uma matriz de comprimento 4 para armazenar os quatro estados de um objeto em queda. Cada elemento na matriz representa um estado do objeto em queda. Então, o que deve ser usado para representar um determinado estado de um objeto em queda. Como pode ser visto na figura acima, é mais apropriado usar uma matriz bidimensional 4X4 para armazenar o estado de um objeto em queda. Onde aparecem tijolos coloridos o valor é 1, e onde só há cor de fundo e não há necessidade de desenhar o valor é 0. Portanto, os quatro estados de todo o objeto em queda em forma de "L" podem ser representados por uma matriz tridimensional:
protegido int blockpattern3[][][] = {
{{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 0}},
{{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}}
};
mapa do jogo
O mapa do jogo é usado para armazenar peças fixas no contêiner do jogo. O contêiner do jogo tem 12 unidades de tijolos pequenos de largura e 16 unidades de tijolos pequenos de altura, incluindo as duas paredes esquerda e direita e o fundo do contêiner abaixo. Portanto, uma matriz bidimensional 16X12 (chamada mapdata no programa) é usada para armazenar tijolos fixos. Se mapdata[i][j]=k(k!=0). Então significa que há um pequeno tijolo fixo na linha i e na coluna j do contêiner do jogo, e o valor da cor do pequeno tijolo é BRICK_COLORS[k -1]. Se k = 0, significa que não há tijolos na linha i e na coluna j.
Portanto, para o seguinte tempo de execução do jogo, o valor de mapdata é {{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0 , 0,0,0,0,0,0,8}{8,0,0,0,0,0 ,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0 ,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}
{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8} {}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0, 8}
{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,0,0,0,1,1,8} {8,0,0,0,0,0,7,7,5,1,1,8}{8,0,5,0,0,7,2,5,5,1,1,8}
{8,8,8,8,8,8,8,8,8,8,8,8}}
Código fonte e código executável
Existem 3 arquivos no total: src.rar, ketrisgame.jad, ketrisgame.jar Nota: src.rar contém todos os códigos-fonte. Também existem arquivos de recursos necessários para o programa ser executado em ketrisgame.jar. Após instalar wtk2.1, coloque ketrisgame.jad e ketrisgame.jar no mesmo diretório (observe que o caminho do diretório não pode conter caracteres chineses e espaços), clique duas vezes no. Arquivo ketrisgame.jad, você pode executar o jogo no emulador.
Referências
http://www.javadrive.jp/j2me/game/3/index.html
<j2me em poucas palavras>
<Introdução à programação Java para telefones celulares/PDA>