Verifique todos os valores em uma lista no TI-Basic
-
26-09-2019 - |
Pergunta
Estou escrevendo um jogo de cobra no TI-Basic, e toda vez que me movo preciso ver se a cabeça da cobra bateu em algum ponto da cauda.A cauda é armazenada como uma fila circular baseada em lista e posso adicionar o início e o fim em tempo constante.
A única parte difícil é que tenho que fazer algo semelhante a isto em cada iteração:(S = Tamanho da lista)
For(I,1,S)
If X=LX(I) and Y=LY(I)
Then
Disp "GAME OVER"
Return
End
End
É um ciclo bastante curto, mas leva uma eternidade, mesmo em uma lista de 10 itens.Eu tentei o caminho da sequência:
If sum(seq(X=LX(I) and Y=LY(I),I,1,S))
...
A única outra otimização que consigo pensar é não verificar os valores de N para N+2 (porque a primeira parte da sua cauda que é possível acertar está em N+3), mas isso apenas adia o problema após 4 pontos, e ter o jogo injogável com 14 pontos não é melhor do que ser injogável após 10 pontos.
Usar assembly não é uma opção porque não tenho um cabo de link (ou desejo de escrever assembly).
Solução
Nunca usei Ti-Basic ...
Mas que tal também armazenar uma matriz 2D do quadro de jogos. Cada elemento nessa matriz indica se a cobra está presente. Quando você avançar, defina o valor da matriz na cabeça da cabeça e limpe o valor no antigo ponto final da cauda. Em seguida, para testar a colisão, basta fazer uma pesquisa na matriz 2D.
Outras dicas
O bloco inteiro:
For(I,1,S)
If X=LX(I) and Y=LY(I)
Then
Disp "GAME OVER"
Return
End
End
pode ser substituído por:
If sum(X=LX and Y=LY)
Then
Disp "Game Over"
Return
End
X=LX
aplica o teste a todos os elementos de LX
, e o mesmo vale para Y=LY
. o sum()
verifica se existe um 1
Na interseção das duas listas.
O que eu fiz, quando estava programando o Snake, foi verificar se o pixel na frente da cobra estava ligado.Se fosse, eu verificaria se esse pixel é o pixel da "comida", caso contrário o jogo pararia.
Exemplo, com I e J sendo as posições da cabeça e da cauda, (F, G) sendo a direção da cobra e (M, N) sendo a comida.
if Pxl-Test(I+F, J+G) #pixel in front of snake
then
if I+F=M and J+G=N
stop
end
Muito mais conservador de memória do que um array 2D.