4Gewinnt - Mittels ModelViewController
Verfasst: Mittwoch 19. März 2014, 21:42
Hi @ all,
Tjoar, ich habe ein kleines Konsolen-4Gewinnt-Spiel programmiert. Das Besondere: Ich habe versucht, mich dabei an das ModelViewController-Muster zu halten, gefühlt überhaupt das erste Mal, dass ich sowas mache^^. Das Programm läuft vollständig in der Konsole; ich habe es erfolgreich in Python 2.7 und 3.3 unter Windows und Linux ohne Fehler getestet.
Da ich mit MVC allgemein noch garnichts am Hut hatte, wollte ich das Progrämmchen einfach mal vorstellen und eure Meinung bzgl. des Quellcodes hören . Es gibt ein paar Stellen, die nicht wirklich "schön" sind (je eine Methode in zwei Klassen, die man sofort erkennt^^), aber sonst bin ich einigermaßen zufrieden mit dem Ergebnis^^.
Für alle, die nicht wissen, was das MVC-Muster ist: Grob gesagt beschreibt es, dass die einzelnen Programmteile (Steuerung, Programmlogik, Ausgabe) unabhängig voneinander existieren. Zwischen diesen Schichten wird über "Events" kommuniziert. Ein Programmteil sollte auf einen anderen nur maximal lesend zugreifen dürfen (z.B. der Ausgabe-Programmteil, damit er ggf. ergänzende Angaben von den Modellen erhält). Nunja, so hab ich das Spiel auch aufgebaut...
Tjoar... Hier das Programm :
Direktdownload als ZIP, ca. 6 KB
Link bei gist.github.com mit allen Quellcodes
Das Programm läuft, grob beschrieben, so ab: Ein EventManager sorgt dafür, dass jederzeit eine "notify"-Methode samt Parameter (Events, die sich ebenfalls in derselben Quellcode-Datei befinden wie der Event-Manager) an jene Objekte losgeschickt werden können, die sich bei ihm registrieren. Und das tun alle auch: controller, viewer usw... In jeder Klasse wird in der "notify"-Methode dann die entsprechenden Events ausgewertet und entsprechend reagiert. Das ist eigentlich auch schon alles^^.
Ich vermute, dass man da noch einiges besser machen kann (u.a. gibt es wahrscheinlich elegantere Lösungen, als immer wieder "isinstance" zu verwenden^^)
Würde mich über Kritik und Verbesserungsvorschläge freuen (Und ich hab Lust, noch je einen weiteren Controller und Viewer für Pygame zu benutzen^^...)
Kurzer Hintergrund meinerseits (ich hab grade das Bedürfnis, als immer-noch-OOP-Anfänger darüber zu reden. Vorsicht, enthält Geschwafel, muss nicht unbedingt gelesen werden ): Ich programmiere schon ziemlich lange (vor ca. 13 Jahren mit QBasic angefangen), allerdings fast ausschließlich hobbymäßig. Seit ich mit OOP in Berührung gekommen bin, hab ich mich schon die ganze Zeit gefragt, wo denn eigentlich dieses "Killer-Feature" in OOP steckt. Ich meine: Ich habe schon relativ viele und auch größere Programme geschrieben und mir einen Stil angeeignet, der - das maße ich mir einfach mal an - auch bei ebenjenen großen Programmen "trotz" prozeduraler Programmiersprache leicht lesbar und verständlich ist. OOP war für mich bisher sowas wie ein Objekt-Speicher mit Attributen, das die Zusammenarbeit mit anderen Funktionen jedoch unnötig beeinträchtigt (wie gesagt: war ). Im Internet findet man auch nur dutzende Auto-Reifen-Türen-Beispiele, aber nie einen Hinweis darauf, wo denn nun der "eigentliche" Vorteil in OOP liegt - gerade bei Programmierern, die keinerlei Probleme mit dem prozeduralen Programmier-Paradigma haben.
Und dann traf ich zufällig auf dieses Projekt: Ein einfaches Pong-Spiel, aber mit einem Quellcode, der mich wach werden lies. Die Programmteile (Viewer, Controller etc.) sind völlig unabhängig voneinander und können problemlos entfernt, ersetzt oder erweitert werden, ohne dass die anderen Quelltexte auch groß bearbeitet werden müssten - zwei Zeilen (import, Registrierung) reichen völlig! Kurz: Ich war beeindruckt vom Quellcode, v.a. von dessen Verständlichkeit und Modularität. Und da hab ich mir in einem Anflug von Motivation gedacht: Machste mal ein kleines Projekt genauso wie der Macher des Pong-Spiels... Ich denke, ich hab nun einen Teil vom "Killer-Feature" für OOP endlich gefunden . Und ich verstehe nicht, weshalb kaum ein OOP-Tutorial, gleich welcher Programmiersprache, das MVC-Muster erwähnt. Es wird zwar maximal erwähnt, dass es mit OOP leichter möglich ist, verschiedene Quelltexte auszutauschen, aber wie man sowas genau macht, kann man ohne Hilfe eigentlich nur erraten :K .
Tjoar, ich habe ein kleines Konsolen-4Gewinnt-Spiel programmiert. Das Besondere: Ich habe versucht, mich dabei an das ModelViewController-Muster zu halten, gefühlt überhaupt das erste Mal, dass ich sowas mache^^. Das Programm läuft vollständig in der Konsole; ich habe es erfolgreich in Python 2.7 und 3.3 unter Windows und Linux ohne Fehler getestet.
Da ich mit MVC allgemein noch garnichts am Hut hatte, wollte ich das Progrämmchen einfach mal vorstellen und eure Meinung bzgl. des Quellcodes hören . Es gibt ein paar Stellen, die nicht wirklich "schön" sind (je eine Methode in zwei Klassen, die man sofort erkennt^^), aber sonst bin ich einigermaßen zufrieden mit dem Ergebnis^^.
Für alle, die nicht wissen, was das MVC-Muster ist: Grob gesagt beschreibt es, dass die einzelnen Programmteile (Steuerung, Programmlogik, Ausgabe) unabhängig voneinander existieren. Zwischen diesen Schichten wird über "Events" kommuniziert. Ein Programmteil sollte auf einen anderen nur maximal lesend zugreifen dürfen (z.B. der Ausgabe-Programmteil, damit er ggf. ergänzende Angaben von den Modellen erhält). Nunja, so hab ich das Spiel auch aufgebaut...
Tjoar... Hier das Programm :
Direktdownload als ZIP, ca. 6 KB
Link bei gist.github.com mit allen Quellcodes
Das Programm läuft, grob beschrieben, so ab: Ein EventManager sorgt dafür, dass jederzeit eine "notify"-Methode samt Parameter (Events, die sich ebenfalls in derselben Quellcode-Datei befinden wie der Event-Manager) an jene Objekte losgeschickt werden können, die sich bei ihm registrieren. Und das tun alle auch: controller, viewer usw... In jeder Klasse wird in der "notify"-Methode dann die entsprechenden Events ausgewertet und entsprechend reagiert. Das ist eigentlich auch schon alles^^.
Ich vermute, dass man da noch einiges besser machen kann (u.a. gibt es wahrscheinlich elegantere Lösungen, als immer wieder "isinstance" zu verwenden^^)
Würde mich über Kritik und Verbesserungsvorschläge freuen (Und ich hab Lust, noch je einen weiteren Controller und Viewer für Pygame zu benutzen^^...)
Kurzer Hintergrund meinerseits (ich hab grade das Bedürfnis, als immer-noch-OOP-Anfänger darüber zu reden. Vorsicht, enthält Geschwafel, muss nicht unbedingt gelesen werden ): Ich programmiere schon ziemlich lange (vor ca. 13 Jahren mit QBasic angefangen), allerdings fast ausschließlich hobbymäßig. Seit ich mit OOP in Berührung gekommen bin, hab ich mich schon die ganze Zeit gefragt, wo denn eigentlich dieses "Killer-Feature" in OOP steckt. Ich meine: Ich habe schon relativ viele und auch größere Programme geschrieben und mir einen Stil angeeignet, der - das maße ich mir einfach mal an - auch bei ebenjenen großen Programmen "trotz" prozeduraler Programmiersprache leicht lesbar und verständlich ist. OOP war für mich bisher sowas wie ein Objekt-Speicher mit Attributen, das die Zusammenarbeit mit anderen Funktionen jedoch unnötig beeinträchtigt (wie gesagt: war ). Im Internet findet man auch nur dutzende Auto-Reifen-Türen-Beispiele, aber nie einen Hinweis darauf, wo denn nun der "eigentliche" Vorteil in OOP liegt - gerade bei Programmierern, die keinerlei Probleme mit dem prozeduralen Programmier-Paradigma haben.
Und dann traf ich zufällig auf dieses Projekt: Ein einfaches Pong-Spiel, aber mit einem Quellcode, der mich wach werden lies. Die Programmteile (Viewer, Controller etc.) sind völlig unabhängig voneinander und können problemlos entfernt, ersetzt oder erweitert werden, ohne dass die anderen Quelltexte auch groß bearbeitet werden müssten - zwei Zeilen (import, Registrierung) reichen völlig! Kurz: Ich war beeindruckt vom Quellcode, v.a. von dessen Verständlichkeit und Modularität. Und da hab ich mir in einem Anflug von Motivation gedacht: Machste mal ein kleines Projekt genauso wie der Macher des Pong-Spiels... Ich denke, ich hab nun einen Teil vom "Killer-Feature" für OOP endlich gefunden . Und ich verstehe nicht, weshalb kaum ein OOP-Tutorial, gleich welcher Programmiersprache, das MVC-Muster erwähnt. Es wird zwar maximal erwähnt, dass es mit OOP leichter möglich ist, verschiedene Quelltexte auszutauschen, aber wie man sowas genau macht, kann man ohne Hilfe eigentlich nur erraten :K .