Frage

Ich schreibe eine Schlange Spiel in TI-Basic, und jedesmal, wenn ich mich bewege ich brauche, um zu sehen, wenn der Kopf der Schlange jeden Punkt im Heck getroffen. Der Schwanz als Kreislistenbasierten Warteschlange gespeichert ist, und ich kann den Anfang und das Ende in konstanter Zeit hinzuzufügen.

Der einzige schwierige Teil ist, dass ich so etwas wie dies bei jeder Iteration zu tun haben: (S = Größe der Liste)

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

Es ist eine ziemlich kurze Schleife, aber es dauert immer noch auf einer Liste von 10 Stück. Ich habe versucht, die Reihenfolge so:

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

Die einzige andere Optimierung ich denken kann, ist nicht Werte überprüfen N auf N + 2 (da der erste Teil des Schwanzes, der Hit möglich ist, ist bei N + 3), aber das nur ablegt das Problem nach 4 Punkte, und das Spiel unspielbar mit 14 Punkten, die nicht besser als nach 10 Punkten unspielbar ist.

Montage zu verwenden ist keine Option, da habe ich keinen Link-Kabel (oder den Wunsch zu schreiben, Montage).

War es hilfreich?

Lösung

Nie verwendet TI-Basic ...

aber wie wäre es auch ein 2D-Array des Spielbretts zu speichern. Jedes Element in dem Array anzeigt, ob die Schlange vorhanden ist. Wenn Sie vorwärts zu bewegen, setzen Sie den Wert des Feldes am Kopfpunkt und den Wert an dem alten Schwanz Endpunkt löschen. Dann Test für Kollision, können Sie einfach tun ein Lookup in den 2D-Array.

Andere Tipps

Der gesamte Block:

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

ersetzt werden kann:

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

X=LX gilt der Test stückweise auf jedes Element von LX, und das gleiche gilt für Y=LY. Die sum() prüft, ob es eine 1 im Schnittpunkt der beiden Listen.

Was ich tat, als ich Snake wurde Programmierung, war, ob das Pixel vor der Schlange zu überprüfen war. Wenn ja, würde ich prüfen, ob dieser Pixel die „Nahrung“ Pixel ist, sonst wäre das Spiel beenden.

Beispiel, mit I und J sind Kopf- und Schwanz Positionen (F, G), um die Richtung der Schlange ist, und (M, N), die die Nahrung.

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

Viel mehr Speicher-conservant als ein 2D-Array.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top