Objektorientierte Programmierung

Lange Jahre habe ich (fast) ausschließlich prozedural und strukturiert programmiert (naja, mal abgesehen von meinen Anfängen; da war sogar das GOTO noch ein Mittel...:-) )

Mittlerweile bin ich eine großer Anhänger der OOP. Ich betrachte sie nicht als Selbstzweck, sondern als ein geeignetes Mittel, um Programme klarer zu strukturieren und übersichtlicher sowie nachvollziehbarer zu gestalten. Die Denkweise ist sicherlich eine andere, aber es lohnt sich nach meiner Meinung, am Anfang mehr "Gehirnschmalz" in das Design zu stecken. Bei größeren Projekten bleiben diejenigen, die oo sind, so übersichtlicher.

Daher will ich einige meiner Ansätze hier mal veröffentlichen. Meine Programme sind in C++ oder Visual Basic (mittlerweile .NET) mit dem Microsoft Visual StudioExterner Linkerstellt und für das Betriebssystem Windows gedacht. Eine sicherlich ganz tolle und kostenfrei verfügbare Entwicklungsumgebung

Die Klassendiagramme sind alle mit StarUMLExterner Link erstellt. StarUML ist ein tolles Open Source Programm, das eine Menge von Stuktur und Verhaltensdiagrammen der UML kennt und sogar per Reverse Engineering Quellcode liest und Klassendiagramme erstellt. Leider wird es anscheinend nicht mehr weiter entwickelt! Schade :-(

Ich selbst betrachte mich als dauernd Lernenden, wobei ich selbst immer wieder durch Fragen meiner Schüler mit neuen Aspekten konfrontiert werde, die dann beim Nachforschen meinen eigenen Horizont erweitern. Hierfür sei allen Fragenden auch Dank gesagt!

Die Entwicklung von GUI-Applikationen unter C++ war in der Vergangenheit noch ziemlich komplex. Unter Visual Basic konnte man relativ einfach GUI-Anwendungen programmieren. Diese Art wurde nun mit dem neuen Visual Studio 2005 auch für C++ möglich: Die Windows Forms Projekte! Da die Programmierung von GUI-Applikationen sicherlich reizvoller (aber auch anspruchsvoller) ist, habe ich ein Dokument geschrieben, in dem die Grundlagen erläutert werden. Wer mag, soll es sich herunter laden. Zusätzlich gibt es eine Demoprojekt zu diesem Dokument.

Nachfolgend möcht ich Programme, die ich meist entwickelt habe, um Schülern die eine oder andere Anregung zu geben hier ablegen. Wer möchte soll sich die Archive herunterladen und in ein eigenes Projekt überführen. Oder sich einfach den Quellcode zu Gemüte führen...

Über ein Feedback per Mail freue ich mich natürlich
Uwe Homm
EMail: uhomm{at}gmx{punkt}de


Laufzeitumgebungen für Microsoft Visual Studio

Will man lediglich ein EXE ausführen, sind die Laufzeitumgebungen erforderlich. In der Laufzeitumgebung befinden sich der Maschinencode für die Bibliotheksfunktionen, die man in seinem C/C++-Programm verwendet hat. Wurde Visual Studio installiert, sind die natürlich auch installiert. Ansonsten kann man die bei Microsoft separat herunterladen. Typischerweise sind die bei Programmen mit einer Setup-Routine dabei und werden dann im Rahmen des Setups installiert.

Visual Studio 2005

Laufzeitumgebung für 32 Bit (X86) Laufzeitumgebung für 64 Bit (X64)

Visual Studio 2005 mit SP1

Laufzeitumgebung für 32 Bit (X86) Laufzeitumgebung für 64 Bit (X64)

Visual Studio 2008

Laufzeitumgebung für 32 Bit (X86) Laufzeitumgebung für 64 Bit (X64)

Visual Studio 2008 mit SP1

Laufzeitumgebung für 32 Bit (X86) Laufzeitumgebung für 64 Bit (X64)

Visual Studio 2010

Laufzeitumgebung für 32 Bit (X86) Laufzeitumgebung für 64 Bit (X64)


Klasse Liste

Im hessichen Landesabitur für das Berufliche Gymnasium mit dem Schwerpunkt Datenverarbeitungstechnik bzw. Datenverarbeitungs- und Elektrotechnik wird in der OOP als Container eine eigentlich nicht existierende List-Klase mit einigen grundlegenden Methoden verwendet. Da mich schon immer gestört hat, dass diese Klasse nicht zur Verfügung steht (je nach Schule wurde z.B. bei Java mit der ArrayList etc. gearbeitet), habe ich diese Klasse mit Hilfe von Templates in C++ umgesetzt. Ich hoffe, es ist mir gelungen. Fehler konnte ich keine feststellen.

Hier die Klasse und ein kleines Testprogramm:
Liste.h
liste_test.cpp


Kartenstapel

Zwei Klassen, die eine enthält das Modell einer Karte und die andere das Modell eines Kartenstapels. Eine Karte hat eine Farbe und einen Wert; ein Kartenstapel enthält 32 Spielkarten und verfügt über verschiedene Methoden, wie z.B. Mischen oder Ziehen. Ein Testprogramm testet die Funktionalität des Kartenstapels.

Karte.h
Karte.cpp
Kartenstapel.h
Kartenstapel.cpp
Testprogramm kartenspiel.cpp
Kartenstapel.zip
Klassendiagramm



Berlinuhr

Manch einer kennt noch die BerlinuhrExterner Link mit dem etwas "besonderen" Ziffernblatt!
Ich habe daher mal die Zeitdarstellung in einer Klasse gekapselt und ein Konsolenprogramm sowie ein GUI-Programm erstellt. Die Visual Studio 2005 Solution kann man sich laden oder einfach nur die Klasse betrachten. Aussehen der Programme und das Klassendiagramm sind nachfolgend dargestellt.
Mir ging es auch hier wieder vor allem um die Erstellung einer einfach wiederverwendbaren Klasse.

Berlinuhr.h
Berlinuhr.cpp
Berlinuhr.zip
Klassendiagramm Berlinuhr
GUI der Berlinuhr Konsolenvariante der Berlinuhr



Pong

Ein Klassiker unter den Videospielen ist PongExterner Link. Hiermit wollte ich nun endlich mal das Konzept eines Model-View-Controllers umsetzen. Ob es mir gelungen ist, weiß ich nicht. Ich habe damit noch keine praktische Erfahrungen gemacht. Über Feedback und Hinweise würde ich mich sehr freuen!
Für die GUI habe ich nun auch noch ein Pong geschrieben; allerdings ist das noch nicht 100%ig.
Wer will sich das ansehen...

Heraus gekommen ist insgesamt folgendes:
PongController.h
PongController.cpp
PongView.h
PongView.cpp
Ball.h
Ball.cpp
Racket.h
Racket.cpp
pong_game.cpp
Pong.zip
Klassendiagramm Pong
Konsolenvariante von Pong GUI-Variante von Pong
In der main() in pong_game.cpp wird lediglich ein PongController-Objekt erzeugt und das Spiel gestartet. Im PongController wird nun eine PongView zur Darstellung der Objekte Ball und zwei Schläger erzeugt. Weiterhin werden im PongController der Ball und die beiden Schläger erzeugt. Der Ball wird in einem eigenen Thread animiert. Die Schlägersteuerung erfolgt im PongController. Der Ball meldet der PongView, dass er neu gezeichnet werden muss. Der PongController meldet dies der PongView für die beiden Schläger.

Wer mag, soll sich die ZIP-Datei saugen und das Projekt kompilieren.

Zu dem Thema "Threads" habe ich mal ein PDF erstellt, das man hier findet.




Vier Gewinnt

Auch dieses Spiel habe ich in Art einer MVC Anwendung erstellt und die Modell-Klasse (VierGewinntModel.h) unverändert in der Konsolen- als auch in der GUI-Anwendung eingesetzt. Bei der Konsolen-Anwendung gibt es neben der Modell-Klasse noch eine Klasse, die die View kapselt (VierGewinntView.h) und den Controller (VierGewinntController.h). Letzterer nimmt die Benutzereingaben entgegen und reicht diese an das Modell weiter. Der Controller veranlasst dann auch die View sich neu darzustellen anhand der Daten des Modells.

Nachfolgend sind die Dateien der Konsolenvariante einsehbar. Für die GUI-Variante ist in der Klasse Spieler der Datentyp String^ anstatt string aus der STL verwendet, da sonst noch mittels Funktionen eine Konvertierung anfällt. Die Form-Datei der GUI ist im ZIP-Archiv enthalten.

Wer mag, soll sich das herunterladen und kompilieren.

Dateien der Konsolenvariante

VierGewinntController.h
VierGewinntController.cpp
VierGewinntModel.h
VierGewinntModel.cpp
VierGewinntView.h
VierGewinntView.cpp
Spieler.h
Spieler.cpp
vier_gewinnt.cpp

VS 2008 Solution

viergewinnt.zip
Klassendiagramm des Vier Gewinnt Spieles
GUI des Vier Gewinnt Spieles Konsolenvariante des Vier Gewinnt Spieles



Tic Tac Toe

Ebenfalls ein Klassiker, wer kennt es nicht aus War Games ;-) ? Diese Variante des Tic Tac Toe sollte einen Mitspieler haben, der entweder über die serielle Schnittstelle EIA 232 oder über eine Socket- Verbindung angeschlossen ist. Mein Ansatz war wiederum ein objektorientiertes Programm, dem das MVC Konzept zugrunde liegen sollte. Daher habe ich einen Controller (Klasse TTTController), ein Datenmodell (TTTModell) und eine View (TTTVieConsole) entwickelt. Die Kommunikation ist durch die Klasse TTTSerialCommunication bzw. TTTSocketCommunication gekapselt und greift dann auf die Klassen Serial bzw. Socket und ServerSocket zu. Durch eine #define-Anweisung (in TTTController) für den Präprozessor werden die jeweilig erforderlichen Code-Abschnitte eingefügt und kompiliert.

Dateien der Konsolenvariante

TTTController.h
TTTController.cpp
TTTModel.h
TTTModel.cpp
TTTViewConsole.h
TTTViewConsole.cpp
TTTPlayer.h
TTTPlayer.cpp
TTTSerialCommunication.h
TTTSerialCommunication.cpp
Serial.h
Serial.cpp
TTTSocketCommunication.h
TTTSocketCommunication.cpp
Socket.h
Socket.cpp
ServerSocket.h
ServerSocket.cpp
ttt.cpp

Die Klassen Serial, ServerSocket und Socket sind vom Kollegen Michael Zimmer von der Hochtaunusschule in Oberursel entwickelt worden und werden im Rahmen des Hessischen Landesabiturs für die Abiturprüfungen in Technikwissenschaft Schwerpunkt Datenverarbeitungstechnik bzw. in der Schwerpunktkombination Datenverarbeitungstechnik/Elektrotechnik vorgegeben und "as is" angewendet.
Die Klassendiagramme sehen wie folgt aus:
(Anklicken zeigt sie in eigenem Fenster)

Klassendiagramm TTT mit Serial

Klassendiagramm TTT mit Socket
Und wer mag kann sich das Visual Studio 2010 Projekt mit allen Dateien herunter laden und ausführbar machen.

VS 2010 Projekt

TicTacToe-Console.rar


Eigentlich wollte ich das Ganze noch auf die GUI umsetzen. Aber dieses Mal war es ziemlich mühsam und letztendlich habe ich es dann gelassen. Die Mischung aus unmanaged Code mit managed Code ist einfach extrem lästig zu programmieren. Ich hätte mich von Anfang an für ein solches CLI-Projekt entscheiden sollen und auch die Konsolenvariante dafür zu entwickeln. Das hätte vieles vereinfacht. Aber so bin ich permanent darüber gestolpert, dass ich gerade für den Controller eine managed Class benötigte, um die View, die ja nun auch managed sein muss (wegen der Form), umzustellen. Und die ganzen anderen Klassen hätten teilweise auch auf managed umgestellt werden müssen....irgendwann hatte ich keine Lust mehr ;-) Also besser von Anfang an für CLI entscheiden!


Schiffe versenken

Dieses Spiel lässt sich nur in der Console spielen. Es gibt entweder einen Computer-Gegner, der aber einfach nur irgendwohin schießt und daher ziemlich doof ist ;)
Oder man kann per serieller Schnittstelle RS 232 bzw. per TCP/IP-Netzwerk gegen einen Remotecomputer (an dem dann auch ein Mensch sitzt) spielen.

Beim Spiel gegen den Computer kann man mit der ESCAPE-Taste auch cheaten ;)

Bedienung: Platzieren der Schiffe mit Pfeiltasten und ENTER, mit ESCAPE Schiffe drehen.
Schiffe versenken mit Cheat
Das Klassendiagramme sieht wie folgt aus:
(Anklicken zeigt es in eigenem Fenster)

Klassendiagramm Schiffe versenken

Zum Testen nur die ausführbare Datei Schiffe versenken.exe

Und hier das komplette Visual Studio 2010 Projekt
Um lediglich das Exe auszuführen, wird noch die Laufzeitumgebung benötigt. Für VS 2010 findet man die Laufzeitumgebungen zum freien Download bei Microsoft hier: Laufzeitumgebung für 32 Bit (X86) Laufzeitumgebung für 64 Bit (X64)