Fórum Correção no código do Quebra-cabeça para Windows #236947
09/06/2004
0
Olá amigos programadores!
Recentemente eu disponibilizei um jogo que fiz, Quebra-cabeça para Windows, no site do ClubeDelphi. Ele ficou alguns dias na página inicial do site e agora está apenas na seção Aplicativos. Depois de ter enviado o software e seu código-fonte para o Clube, eu verifiquei a existência de um bug não percebido antes. Na verdade não se trata realmente de um bug em si, mas sim de um erro na lógica de um procedimento do programa. Eis o problema:
Quando o usuário especifica o formato do tabuleiro, estipulando o número de linhas e colunas, o aplicativo deveria dividir a imagem em retângulos de tamanhos que somados se igualariam ao tamanho total da imagem. Por exemplo, o tamamho das imagens deve ser de 640X480 pixels. Ao dividí-la em digamos por 6 linhas e 4 colunas, a soma da largura de todos as peças de uma linha é igual a 640 e da altura de cada uma, 480. Porém, quando essas somas não se igualam aos valores máximos da imagem, o aplicativo desenha todas as peças em uma mesma linha, o que não deveria ocorrer.
Como o tamanho de uma imagem em pixels não pode ser um número racional, apenas inteiro, não é qualquer valor de linhas e colunas que fará com que as peças do tabuleiro sejam corretamente desenhadas. Eu não constatei este ´erro´ antes porque coincidentemente os valores que eu atribuí aos campos Linhas X Colunas durante a fase de testes eram todos múltiplos de 640 e 480. Portanto o tabuleiro era desenhado sem problemas.
Para corrigir este erro eu desenvolvi um novo algoritmo que vai adaptar os valores informados pelo usuário para os mais próximos do correto. Quando for solicitado que o programa desenhe um tabuleiro no formato 10x3, por exemplo, este algoritmo corrigirá este formato para 10x2. Vamos ao que interessa então! :-)
No procedimento IniciarJogo da classe TfrmMain, existe uma declaração case of que faz o controle da quantidade de peças do jogo. Esta declaração gerencia quatro opções possíveis, sendo a quarta que manipula os dados informados pelo usuário. O código original está assim:
E ele corrigido:
Devem ser declaradas na seção var desta procedure as variáveis Linhas e Colunas, do tipo Integer.
Esta modificação ´dará conta´ deste problema. Senti a necessidade de publicar este tópico porque achei este erro um tanto quanto grosseiro. Se eu vier a descobrir outros assim, postarei novas correções! ;-)
Abraços a todos!
Recentemente eu disponibilizei um jogo que fiz, Quebra-cabeça para Windows, no site do ClubeDelphi. Ele ficou alguns dias na página inicial do site e agora está apenas na seção Aplicativos. Depois de ter enviado o software e seu código-fonte para o Clube, eu verifiquei a existência de um bug não percebido antes. Na verdade não se trata realmente de um bug em si, mas sim de um erro na lógica de um procedimento do programa. Eis o problema:
Quando o usuário especifica o formato do tabuleiro, estipulando o número de linhas e colunas, o aplicativo deveria dividir a imagem em retângulos de tamanhos que somados se igualariam ao tamanho total da imagem. Por exemplo, o tamamho das imagens deve ser de 640X480 pixels. Ao dividí-la em digamos por 6 linhas e 4 colunas, a soma da largura de todos as peças de uma linha é igual a 640 e da altura de cada uma, 480. Porém, quando essas somas não se igualam aos valores máximos da imagem, o aplicativo desenha todas as peças em uma mesma linha, o que não deveria ocorrer.
Como o tamanho de uma imagem em pixels não pode ser um número racional, apenas inteiro, não é qualquer valor de linhas e colunas que fará com que as peças do tabuleiro sejam corretamente desenhadas. Eu não constatei este ´erro´ antes porque coincidentemente os valores que eu atribuí aos campos Linhas X Colunas durante a fase de testes eram todos múltiplos de 640 e 480. Portanto o tabuleiro era desenhado sem problemas.
Para corrigir este erro eu desenvolvi um novo algoritmo que vai adaptar os valores informados pelo usuário para os mais próximos do correto. Quando for solicitado que o programa desenhe um tabuleiro no formato 10x3, por exemplo, este algoritmo corrigirá este formato para 10x2. Vamos ao que interessa então! :-)
No procedimento IniciarJogo da classe TfrmMain, existe uma declaração case of que faz o controle da quantidade de peças do jogo. Esta declaração gerencia quatro opções possíveis, sendo a quarta que manipula os dados informados pelo usuário. O código original está assim:
case TabuleiroSelecionado of ... 4 : begin Largura := LARGURA_MAXIMA_IMAGEM div StrToInt(edtColunas.Text); Altura := ALTURA_MAXIMA_IMAGEM div StrToInt(edtLinhas.Text); DimensoesPecas[1] := Largura; DimensoesPecas[2] := Altura; InfoTabuleiro := ´Tabuleiro personalizado: ¬d peças´; end; end;
E ele corrigido:
case TabuleiroSelecionado of
...
4 :
begin
Colunas := StrToInt(edtColunas.Text);
Linhas := StrToInt(edtLinhas.Text);
{ Assegura que os números de linhas e colunas são múltiplos do
tamanho total da imagem }
while (LARGURA_MAXIMA_IMAGEM mod Colunas) <> 0 do
Dec(Colunas);
while (ALTURA_MAXIMA_IMAGEM mod Linhas) <> 0 do
Dec(Linhas);
{ Calcula a largura e a altura das peças do jogo }
Largura := LARGURA_MAXIMA_IMAGEM div Colunas;
Altura := ALTURA_MAXIMA_IMAGEM div Linhas;
DimensoesPecas[1] := Largura;
DimensoesPecas[2] := Altura;
InfoTabuleiro := ´Tabuleiro personalizado: ¬d peças´;
{ Atualiza o valor das linhas e colunas se este foi modificado }
edtColunas.Text := IntToStr(Colunas);
edtLinhas.Text := IntToStr(Linhas);
end;
end;
Devem ser declaradas na seção var desta procedure as variáveis Linhas e Colunas, do tipo Integer.
Esta modificação ´dará conta´ deste problema. Senti a necessidade de publicar este tópico porque achei este erro um tanto quanto grosseiro. Se eu vier a descobrir outros assim, postarei novas correções! ;-)
Abraços a todos!
Michael
Curtir tópico
+ 0
Responder
Posts
09/06/2004
Nildo
A pedido do Michael, vou deixar este tópico fixo por alguns dias.
Responder
Gostei + 0
09/06/2004
Michael
Obrigado Nildo!
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)