Wenn ich dies in der nächsten Runde dann auf den Bildschirm poke, müsste doch genau diese Stelle gelöscht werden- obwohl die Schlange erst ein Zeichen lang ist?! Weshalb wird die Schlange aber erst brav 10 Zeichen lang, bis die älteste Position mit einem Leerzeichen überschrieben wird?
Suspekterweise funktioniert es aber einwandfrei... ich bin echt raus.
Der Trick ist, dass immer erst an der Bildschirmposition, die in RP(AP) steht gelöscht wird und dann erst die neue Bildschirmposition nach RP(AP) geschrieben wird. Die Reihenfolge ist wichtig. Erst löschen, dann die Position überschreiben.
Am Anfang ist der Ringpuffer leer, deswegen wird in deinem Programm jetzt 10x die Bildschirmposition 0 gelöscht (also immer die gleiche Position), während die Schlange vorne wächst. Erst wenn der Ringpuffer komplett gefüllt ist, wird tatsächlich damit begonnen, das Ende der Schlange zu löschen.
Deswegen initialisiere ich in meinem Programm den gesamten Puffer zu Beginn mit einer Adresse ausserhalb des Bildschirms (33768). Dadurch wird eine Adresse ausserhalb des Bildschirms gelöscht (was gleichbedeutend ist mit gar nicht löschen), solange der Puffer nicht gefüllt ist. Das kommst spätestens dann zum tragen, wenn die Schlange nicht an Bildschirmposition 0 loslaufen soll und die Bildschirmposition 0 vielleicht Teil einer Spielfeldbegrenzung ist, die man nicht gelöscht haben möchte.
Zum besseren Verständnis kannst du dir einfach mal den gesamten Inhalt des Puffers und die Pufferposition bei jedem Durchlauf aufschreiben. Evtl. dafür den Puffer verkürzen. Dann geht das schneller.