So gebaut
Die Schlange ist ein reines Kiste-Programm. Es nutzt nur die eingebauten Module
gui, klang, liste, zufall,
wert, datei und text. Hier sind die
interessantesten Stellen.
1 · Die Schlange sind zwei Listen
Kein Objekt, kein Raster — die Schlange ist einfach eine Folge von Feldern. Glied
Nummer i steht in schlange_x[i] / schlange_y[i], der
Kopf ganz hinten. Zwei Zahlen dx/dy merken sich die Richtung.
// Die Schlange lebt in zwei parallelen Listen — Glied i hat
// seine Position in schlange_x[i] / schlange_y[i]. Der Kopf steht hinten.
nimm schlange_x = [10, 11, 12]
nimm schlange_y = [15, 15, 15]
nimm dx = 1 // Richtung: nach rechts
nimm dy = 0 2 · Wachsen und Kriechen in vier Zeilen
Der ganze Trick der Bewegung: In jedem Takt wächst vorne ein neuer Kopf an. Frisst er Futter, bleibt der Schwanz — die Schlange wird länger. Sonst fällt hinten ein Glied weg — sie kriecht weiter. Anhängen vorn, entfernen hinten, fertig.
// Jeder Takt: den Kopf um (dx, dy) versetzen …
nimm kopf_x = glied_x(n - 1) + dx
nimm kopf_y = glied_y(n - 1) + dy
liste.hänge_an(schlange_x, kopf_x) // Kopf waechst voran …
liste.hänge_an(schlange_y, kopf_y)
wenn kopf_x == futter_x und kopf_y == futter_y {
punkte = punkte + 1 // … gefressen: die Schlange bleibt laenger
neues_futter()
} sonst {
liste.entferne(schlange_x, 0) // … sonst rueckt der Schwanz nach
liste.entferne(schlange_y, 0)
} 3 · Futter auf ein freies Feld
Neues Futter darf nicht auf der Schlange landen. Also würfeln wir eine Position und würfeln neu, solange sie besetzt ist — simpel und völlig ausreichend.
// Futter auf eine freie Zelle wuerfeln — nie auf die Schlange.
funktion neues_futter() {
futter_x = zufall.ganz(0, 39)
futter_y = zufall.ganz(0, 29)
solange auf_schlange(futter_x, futter_y) == 1 {
futter_x = zufall.ganz(0, 39)
futter_y = zufall.ganz(0, 29)
}
} 4 · Die verbotene Wende
Ein klassischer Snake-Fehler: Die Schlange fährt in sich selbst zurück. Eine kleine Bedingung verbietet die 180-Grad-Wende — nach rechts geht nur, wenn man nicht gerade nach links unterwegs ist.
// Die 180-Grad-Wende ist verboten — die Schlange kann nicht
// in sich selbst zurueckfahren.
wenn taste == "links" und dx != 1 { dx = -1
dy = 0 }
wenn taste == "rechts" und dx != -1 { dx = 1
dy = 0 } 5 · Bestenliste ohne Sortier-Funktion
Zwei parallele Listen halten Punkte und Namen. Statt zu sortieren, fügen wir jedes neue Ergebnis gleich an der richtigen Stelle ein — so bleibt die Liste immer geordnet. Sie wird als Textdatei gespeichert und überlebt den Neustart.
// Ergebnis an der richtigen Stelle EINFUEGEN — die Liste bleibt
// dadurch immer sortiert, ganz ohne Sortier-Funktion.
funktion sortiert_einfügen(p, name) {
nimm pos = 0
für i = 0 bis liste.länge(rang_punkte) - 1 {
wenn rang(i) < p { pos = i + 1 }
}
liste.füge_ein(rang_punkte, pos, p)
liste.füge_ein(rang_namen, pos, name)
} 6 · Der Name — nach dem Spiel getippt
Wie an alten Arcade-Automaten tippt der Spieler seinen Namen nach der Partie direkt auf den Game-Over-Schirm. Kein Eingabefeld, das während des Spiels die Steuerung stört — der Tasten-Handler liest die Buchstaben selbst.
// Der Name wird NACH dem Spiel getippt — direkt auf den
// Game-Over-Schirm, kein Eingabefeld, das im Spiel die Tasten wegfrisst.
sonstwenn taste == "BackSpace" {
eingabe_name = text.erste_n(eingabe_name, länge(eingabe_name) - 1)
} sonstwenn länge(taste) == 1 {
wenn länge(eingabe_name) < 14 { eingabe_name = "{eingabe_name}{taste}" }
} Das ist alles: zwei Listen, ein Zeitgeber, ein bisschen Zufall. Der komplette Quelltext liegt dem Download oben bei — mach das Feld größer, die Schlange schneller, oder bau daraus dein eigenes Spiel.