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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top