Max Smily: Ein Bug in meinem Tetrisspiel

Hallo Javascript-Experten,

Vor einiger Zeit hab ich einfach aus Sport begonnen, ein Tetris-Spiel in Javascript zu programmieren. Ich hatte in der Badewanne plötzlich die Idee für die Umsetzung der Steinbewegung in einem Spielgitter. So kam eins zum anderen und fertig war ein Tetris. Das Programmieren von Tetris ist eigentlich nicht schwer, denn das Spiel läßt sich sehr schön in Einzelaufgaben aufteilen. Einzig die Kollisionsabfrage war vielleicht etwas schwieriger.

Zum Problem: Es hat sich ein Bug gezeigt, den ich einfach nicht lokalisieren kann.

Nach längerem Spielen beginnen die Tetrissteine beim "aufsetzen" auf dem Boden bzw. auf den bereits liegenden Steinen zusätzliche Segmente zu bekommen. Ein quadratischer Stein z.B. hat ja 2 x 2 Segmente. Diese Segmente werden beim "aufsetzen" in ein Array geschrieben, in dem alle liegenden Steine vermerkt werden. Der Bug bewirkt, dass aber mehr als 4 Segmente eingetragen werden, z. B. 6 Segmente. Dieser Fehler tritt aber nicht sofort auf. Zu Beginn funktioniert das Spiel tadellos. Erst nach einer Weile (oft so nach ca. 8000-10000 Punkten bzw. ca. 2 Minuten) beginnt dieser Effekt. Es kann sich eigentlich nicht um einen Logikfehler handeln, denn der würde ja bereits zu Beginn des Spiels auftreten. Andererseits tritt der Fehler in allen getesteten Browsern auf (Mozilla, IE, Opera) unter WIN2000.

Der kritische Punkt im Programm ist der Zeitpunkt, wo die Koordinaten des aktuellen Steins (var piece) beim "aufsetzen" (m==1) in das Array v eingetragen werden, welches alle liegenden Steine speichert. Dies passiert in der Funktion fillValue(). Der Fehler der dann auftritt ist für mich aber nicht zu entdecken. Die entsprechenden Funktionen sehen sauber aus.

Bitte testet das Spiel ein paar Mal, vielleicht findet ihr etwas raus. Dazu müsstet ihr allerdings den Programm-Code analysieren. Wer sich für das Thema interessiert, nimmt die Mühe ja vielleicht auf sich. Ich hab versucht den Code einigermaßen gut zu kommentieren.

Mein Tetris

Viele Grüße
Max Smily

  1. echo $begrüßung;

    Zum Problem: Es hat sich ein Bug gezeigt, den ich einfach nicht lokalisieren kann.

    Welche Maßnahmen hast du bereits ergriffen? Stimmen die Werte der betroffenen Variablen mit den von dir zum jeweiligen Zeitpunkt erwarteten überein? Sicherlich nicht. Hier gilt es zunächst die Differenz zu Wunsch und Wirklichkeit herauszufinden. Weitere Maßnahmen ergeben sich dann daraus.

    Es kann sich eigentlich nicht um einen Logikfehler handeln, denn der würde ja bereits zu Beginn des Spiels auftreten. Andererseits tritt der Fehler in allen getesteten Browsern auf (Mozilla, IE, Opera) unter WIN2000.

    Was ist Logik und was nicht? Fehlerhaft initialisierte Variablen, Inhalte die man nicht erwartet hat, ... zählt sowas nicht zur Logik?

    Der kritische Punkt im Programm ist der Zeitpunkt, wo die Koordinaten des aktuellen Steins (var piece) beim "aufsetzen" (m==1) in das Array v eingetragen werden,

    Der kritische Punkt, der mir das Debugging vermiest sind für mich eher deine Variablenbezeichner und die zu wenigen Quelltext-Kommentare. Verwende sprechende Bezeichner. Einzelne Buchstaben, auch wenn du deren Bedeutung einmal kommentiert hast, sparen zwar ein wenig Tipparbeit, verringern die Verständlichkeit unnötig. Auch newArr usw. sind keine sprechenden Variablennamen. Die verwendete Technik (hier ein Array) ergibt sich aus dem Programmablauf (z.B. bei der Initialisierung der Variablen). Den Sinn dieser Variablen aus dem Programm heraus verstehen zu müssen ist schwieriger.

    Funktionalitäten in Funktionen zu packen ist schon sehr sinnvoll. Noch besser zum Verständnis der Funktion wäre eine Beschreibung ihrer Aufgabe (die etwas ausführlicher als deine Kurzkommentare sein darf), ihrer Parameter die sie erwartet und das Rückgabeergebnis. Ebenso gehört in die Beschreibung, welche globalen Variablen sie verwendet/verändert (wenn sich sowas nicht generell vermeiden lässt).

    echo "$verabschiedung $name";

    P.S: Ich habe bei vielen Tetris-Spielen, die mir so über den Weg liefen, und auch bei diesem, den Eindruck, dass die langen Steine (4x1) viel zu selten auftauchen.

    P.P.S: Wenn du den Fehler nicht findest, verkauf es als Feature... (-: