2009-06-06 10 views
11

Heute ist der 25. Geburtstag von Tetris. Ich glaube, Tetris-Klon zu schreiben ist eine der besten Möglichkeiten, sich mit einer neuen Sprache oder einer Plattform vertraut zu machen. Es ist nicht ganz trivial und eignet sich gut zum Erlernen sprachspezifischer Konstrukte wie Iteratoren und Closures.Wie schreibt man Tetris in Scala? (Code Review)

Ich habe von Scala gehört und entschied mich schließlich, ein paar Dokumente zu lesen und einen Tetris-Klon zu schreiben. Also, das ist mein erster Scala-Code. Ich habe versucht, funktionale Konstrukte zu verwenden, aber ich bin sicher, dass es viele Dinge gibt, die ich verbessern kann, um es mehr Scala zu machen. Bitte geben Sie mir Vorschläge mit Kommentar. Auch andere Einreichungen von Tetris-Klonen in Scala sind willkommen.

Ich bin mir bewusst, dass die eigentliche Frage selbst ist etwas subjektiv, aber ich denke, das ist von gewissem Wert, da andere dies als Beispiel (oder Anti-Beispiel) Code verwenden können.

Edit: Lassen Sie mich die Frage umformulieren. Was kann ich tun, um den Code Scala-ish zu machen?

+1

Was ist Ihre Frage? SO ist keine Code Review Seite. –

+4

Ich denke, das gehört auf refactormycode.com – finnw

+0

Einen guten Tetris-Klon schreiben, die Einhaltung der Tetris-Standards ist nicht sehr einfach. Zum Beispiel rotieren einige Blöcke im Standardschema um Gitterschnittpunkte und einige rotieren um die Zellenzentren - um nur eine Sache zu nennen. – ziggystar

Antwort

19

Edit4:

Verschoben das Original (2009) Code, den ich zu einem gist hier hatte.

Vor kurzem (August 2012) schrieb ich eine Reihe von Blog-Posts über das Schreiben von Tetrix in Scala. Ich hoffe, es beantwortet einige der Fragen, die ich vor drei Jahren gestellt habe.

bearbeiten: den Code aktualisiert wird verwenden Scala Swing API wie @thatismatt vorgeschlagen. Außerdem habe ich herausgefunden, dass der Weg, Scala-Stil zu lernen, darin besteht, das Buch von Martin Odersky zu lesen: Programming in Scala. Im Wesentlichen wird die Scala Art und Weise verschiebt sich allmählich von Imperativ Stil zu funktionalen Stil durch unveränderliche Datenstruktur, Funktionen, ohne Nebenwirkungen, Pattern-Matching, Züge etc.

EDIT2: der Code aktualisiert unveränderliche Datenstruktur zu verwenden, usw. Zum Beispiel gibt Block#rotate jetzt ein neues Block-Objekt zurück, anstatt sich selbst zu ändern.

Edit3: Der Code wurde aktualisiert, um auf Scala 2.8 RC3 zu funktionieren.

+1

+1 diese Antworten fast alle meine Fragen zu scala, danke – stacker

+0

Kompiliert nicht in Scala 2.8 RC2. Schade, es wäre so ein schönes Beispiel. –

+1

@ Łukasz Lew, versuchen Sie es jetzt. Es sollte mit RC3 funktionieren. –

3

Ein kleiner Kommentar, den ich machen würde ist, dass Sie java.swing anstelle von scala.swing verwenden. Moving-Over könnte Ihnen helfen, eine funktionellere Erfahrung zu bekommen, aber es ist nicht perfekt, da es nur ein Wrapper um die Java-Bibliotheken ist. Und die Lernkurve wäre natürlich steiler, wenn Sie aus einem Java-Hintergrund kommen ... obwohl vielleicht das ist, wonach Sie suchen!

+0

Die Verwendung von javax.swing könnte die Kompilierung erleichtern. – AlBlue