Kiste
EN

Schlange

Der Klassiker: iss das Futter, wachse, stoß nirgends an. Mit Titelbild, Pause, Sound, Hintergrundmusik und einer Bestenliste mit Namen — komplett in Kiste, erstaunlich wenige Zeilen.

Schlange — Titelbild mit Bestenliste

Kostenlos selber bauen

Die Schlange ist quelloffen. Lade den Quelltext, öffne ihn in der Kiste-IDE (oder bau ihn auf der Kommandozeile mit kiste build schlange.ki) — es ist derselbe Code, aus dem das fertige Spiel entsteht. Fress-Ton und Musik liegen bei.

Wie das Spiel Schritt für Schritt entsteht — vom Spielkern bis zur Bestenliste — steht im Kiste-Lernbuch, Kapitel 34.

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.