Domanda

Sto scrivendo un gioco del serpente in TI-Basic, e ogni volta che ho bisogno di andare a vedere se la testa del serpente ha colpito un punto qualsiasi della coda. La coda è memorizzato come una coda di lista a base circolare, e posso aggiungere all'inizio e alla fine in un tempo costante.

L'unica parte difficile è che devo fare qualcosa di simile a questo ad ogni iterazione: (S = dimensione della lista)

For(I,1,S)
    If X=LX(I) and Y=LY(I)
    Then
        Disp "GAME OVER"
        Return
    End
End

E 'un abbastanza breve ciclo, ma ci vuole sempre anche su una lista di 10 elementi. Ho cercato il modo sequenza:

If sum(seq(X=LX(I) and Y=LY(I),I,1,S))
...

L'unico altro ottimizzazione mi viene in mente è di non controllare i valori di N a N + 2 (perché la prima parte della tua coda che è possibile colpire è a N + 3), ma che appena mette fuori il problema dopo 4 punti, e avendo il gioco ingiocabile con 14 punti non è migliore che essere ingiocabile dopo 10 punti.

Utilizzando il montaggio non è un'opzione, perché non ho un cavo di collegamento (o il desiderio di scrivere di montaggio).

È stato utile?

Soluzione

Mai usato TI-Basic ...

ma come circa la memorizzazione anche una matrice 2D del tabellone. Ogni elemento di tale array indica se il serpente è presente. Quando si sposta in avanti, impostare il valore della matrice nel punto di testa, e cancellare il valore al vecchio punto coda. Poi al test per la collisione, si può solo fare una ricerca nella matrice 2D.

Altri suggerimenti

L'intero blocco:

For(I,1,S)
    If X=LX(I) and Y=LY(I)
    Then
        Disp "GAME OVER"
        Return
    End
End

può essere sostituito con:

If sum(X=LX and Y=LY)
Then
    Disp "Game Over"
    Return
End

X=LX applica il tratti di prova per ogni elemento di LX, e lo stesso vale per Y=LY. I controlli sum() se c'è un 1 nell'intersezione delle due liste.

Quello che ho fatto, quando stavo programmando Serpente, era quello di verificare se il pixel di fronte al serpente era su. Se fosse, vorrei verificare se questo pixel è il pixel "cibo", in caso contrario, il gioco si fermava.

Esempio, con I e J essendo posizioni della testa e di coda, (F, G) essendo la direzione del serpente, e (M, N) essendo il cibo.

if Pxl-Test(I+F, J+G) #pixel in front of snake
then
if I+F=M and J+G=N
stop
end

Molto più memoria-conservant di un array 2D.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top