欢迎来到留学生英语论文网

当前位置:首页 > 论文范文 > German

Ich habe dieses thema gewählt

发布时间:2017-03-09
该论文是我们的学员投稿,并非我们专家级的写作水平!如果你有论文作业写作指导需求请联系我们的客服人员

1. Einleitung

1.1 Vorwort

Ich habe dieses Thema gewählt, da mir die Einführung in die Programmiersprache Matlab (Informatikunterricht im 2. Semester M4a) sehr gefiel, deshalb wollte ich etwas für meine Maturaarbeit programmieren. Da ich selber gerne Schach spiele, habe ich mich entschieden ein Schachprogramm zu schreiben.

1.2 Wahl der Programmiersprache

Zuerst überlegte ich mir, welche Programmiersprache am besten für meine Maturaarbeit geeignet wäre. Da momentan die Programmiersprachen C++ und Java sehr beliebt sind, habe ich mich für eine dieser beliebten Sprachen entschieden, auch um allenfalls Hilfe im Internet beanspruchen zu können. Ich habe mich für C ++ entschieden. Als allererstes lernte ich die Grundlagen dieser Programmiersprache, dies tat ich mit Hilfe einer Video Anleitung (Video2Brain C++) dabei lernte ich wie man in C++ Variablen, Schleifen, Bedingungen, Funktionen, Textausgaben (auf die Konsole) und Arrays (mehrere Werte in eine Variable zusammenfassen) erstellen kann.

1.3 Installation einer Arbeitsumgebung und eines Compilers

Um mit C++ ein Programm zu entwickeln, braucht man einen Editor, der bestimmte Befehle farblich darstellen lässt (und damit für eine bessere übersichtlichkeit sorgt) und mit dem man eine C++ Datei erstellen kann. Um aus der C++ Datei ein ausführbares Programm zu machen, benötigt man einen Compiler der die C++ Datei in eine EXE Datei umwandelt und das Programm somit ausführbar machen lässt. Ich erhielt von Herrn Sommer eine Version von Visual Studio (Beinhaltet Editor und Compiler) zudem installierte ich auch noch Ultraedit (wobei ich hier als Plug-In den Mingw Compiler installieren musste) um sicherzugehen, dass ein auftretender Fehler nicht das Problem der installierten Entwicklungsumgebung wäre.

2. Schachprogramm auf der Konsole

2.2 Platzzuweisung der Schachfiguren

Dabei erstellte ich einen Array (Feld) mit dem ich den Schachfiguren einen Platz zuweisen konnte. OOO steht für ein leeres Feld, die anderen Figuren werden benannt nach dem ersten Buchstaben ihres Namens, ihrer Farbe und ihrer Nummer (zum Bsp. SW2 steht für den zweiten schwarzen Springer).

2.3 Ausgabe der Schachfiguren auf die Konsole

Nun müssen die Figuren ausgegeben werden. Dazu wird die erste Figur( [0][0] ) ausgegeben, einen Abstand gemacht und die nächste Figur ausgegeben. Dies wird solange gemacht bis acht Figuren ausgegeben worden sind, danach wird eine neue Zeile erstellt.

2.4 Eingabe eines Zuges

Um einen Zug durchführen zu können, müssen vier Werte an das Programm gegeben werden. Zuerst zwei Werte für die Figur, die man bewegen will (z.B. A2) und dann zwei Werte für das Ziel der Figur (z.B. A3). Jedoch müssen diese Werte noch umgewandelt werden in die Koordinaten des Arrays. Diese stimmen nicht überein, weil der Array links oben ( [0][0] ) anfängt und die Schachnotation links unten anfängt (A1). Zudem hat die Schachnotation Buchstaben, die in Zahlen umgewandelt werden müssen und die Schachnotation beginnt bei 1 und nicht bei 0 an zu zählen. Die umgewandelten Werte werden in vier neuen Variablen gespeichert(EingabeUrsprung111, EingabeUrsprung222, EingabeZiel111 und EingabeZiel222)

2.5 Ausführen eines Zuges

Um einen eingegebenen Zug ausführen zu können muss die gewählte, im Array gespeicherte Figur durch ein leeres Feld("OOO") auf diesem Platz ersetzt werden. Zudem muss die Figur auf dem Zielfeld im Array gespeichert werden:

Schachbrett[EingabeZiel111][EingabeZiel222]=Schachbrett[EingabeUrsprung111][EingabeUrsprung222];

Schachbrett[EingabeUrsprung111][EingabeUrsprung222]= "OOO";

Nach der änderung muss nur nochmals eine Ausgabe gemacht werden (Siehe: Ausgabe der Schachfiguren auf die Konsole).

2.6 Bedingungen für legale Züge

Es gibt drei Möglichkeiten wie ein Zug regelwidrig ist:

  • Figuren falsch bewegt

Allgemein: Der Zug ist falsch, wenn auf eine Figur der gleichen Farbe gesprungen wird, oder auf den gegnerischen König

Bauer:

  • Falls ein Bauer nach links oder nach rechts bewegt wird ist der Zug falsch, wenn mehr als ein Feld nach links oder rechts bewegt wurde oder wenn dort keine gegnerische Figur steht (ausser der König)
  • Falls der Zielort kein leeres Feld ist, ist der Zug falsch, wenn nicht auf ein Feld diagonal nach vorne gesprungen wird
  • Falls nicht auf ein Feld nach vorne gesprungen wird, ist der Zug falsch, wenn der Bauer nicht auf seiner ursprünglichen Position ist, nicht zwei nach vorne gesprungen ist oder kein leeres Feld beim Ziel ist.

Turm:

  • Falls ein Turm nach links oder rechts und gleichzeitig nach unten oder oben bewegt wird, dann ist der Zug falsch.
  • Falls ein Zug in eine Richtung (links, rechts, oben oder unten) gemacht wird, dann ist der Zug falsch, wenn dazwischen eine Figur liegt

Läufer:

  • Falls ein Läufer nicht gleich viele Felder nach rechts (oder links) und nach oben (oder unten) geht, dann ist der Zug falsch
  • Falls ein Zug in eine Richtung gemacht wird, dann ist der Zug falsch, wenn dazwischen eine Figur liegt

Dame:

  • Falls die Dame am Ziel in der gleichen Reihe oder Spalte ist, dann wird die gleiche überprüfung wie beim Turm gemacht.
  • Sonst wird eine überprüfung, wie beim Läufer gemacht

Springer:

  • ­ Falls ein Springer nicht auf ein Feld nach links (oder rechts) und zwei Felder nach oben (oder unten) springt. Oder nicht zwei Felder nach links (oder rechts) und ein Feld nach oben (oder unten) springt, dann ist der Zug falsch.

König:

  • Falls der König nicht auf ein Feld springt(nach oben, unten, links, rechts, diagonal), dann ist der Zug falsch.
  • Schach ignorieren oder selbst in eine Schachsituation geraten (beim eigenen Zug)

Schachsituation überprüfen:

Jede gegnerische Figur muss überprüfen, ob es ihr möglich ist, legal auf das Feld des Königs zu springen. Wenn ja, dann ist es eine Schachsituation

  • Schachmatt

Dieser Spielzug ist zwar nicht regelwidrig, aber es lässt keinen Zug mehr zu.

Schachmattsituation überprüfen:

Es müssen alle legalen Züge einmal durchgeführt werden(beim Spieler, der unter Schach gesetzt wurde). Danach muss man für jede einzelne Situation überprüfen, ob es immer noch Schach ist:

Jede gegnerische Figur muss überprüfen, ob es ihr möglich ist, legal auf das Feld des Königs zu springen. Wenn bei mindestens einer dieser überprüften Situationen kein Schach ist, dann ist dies keine Schachmattsituation, sonst schon.

Zudem wird der Zug regelwidrig, wenn man falsche Positionen angibt (z.B.H9) oder wenn man zweimal die gleiche Position angibt(z.B.A2A2).

Natürlich ist es auch nicht erlaubt, wenn man versucht mit den gegnerischen Figuren zu ziehen oder wenn man versucht mit einem leeren Feld auf ein anderes Feld zu gehen.

2.7 Aufbau meines Programmes

Solange nicht Schachmatt ist, wird Folgendes ausgeführt:

* Solange Weiss am Zug ist:

  • Wenn Schach gegen Weiss ist, dann überprüft es ob eine Schachmattsituation vorliegt.
  • Falls Schachmatt ist, werden alles Schlaufen beendet.
  • überprüfen, ob Figurenzüge legal sind
  • überprüfen, ob Schach gegen Schwarz ist (Wenn ja, in Variabel speichern für die Schachmattsituation-überprüfung gegen Schwarz)
  • überprüfen, ob Schach gegen Weiss ist, wenn ja, dann wird der weisse Zug wiederholt
  • Falls der Zug nicht regelwidrig ist, wird der Zug ausgeführt und ausgegeben

* Solange Schwarz am Zug ist:

  • Wenn Schach gegen Weiss ist, dann überprüft es ob eine Schachmattsituation vorliegt.
  • Falls Schachmatt ist, werden alles Schlaufen beendet.
  • überprüfen, ob Figurenzüge legal sind
  • überprüfen, ob Schach gegen Schwarz ist (Wenn ja, in Variabel speichern für die Schachmattsituation-überprüfung gegen Schwarz)
  • überprüfen, ob Schach gegen Weiss ist, wenn ja, dann wird der weisse Zug wiederholt
  • Falls der Zug nicht regelwidrig ist, wird der Zug ausgeführt und ausgegeben

3. Aufgetretene Probleme bei der Programmierung

3.1 Probleme bei der Programmierung der Konsolenversion

Als ich angefangen habe mein Programm für die Konsole zu programmieren bin ich schon sehr früh auf grosse Probleme gestossen. Als ich die Figuren benennen wollte, tat ich dies mit einer sogenannten „char-Variable". Doch ich wusste damals nicht, dass man bei einer „char-Variable" nur ein Zeichen speichern kann. Deshalb bekam ich sehr viele Fehlermeldungen, weil die Bezeichnung einer Figur ungültig was (z.B. TS1). Ich versuchte dies zu lösen indem ich meine Figuren als Zahlen speicherte und sie dann bei der Ausgabe umwandelte in die normale Bezeichnung und diese dann ausgab. Ich erkannte dann aber, dass dies nicht besonders sinnvoll ist und deshalb recherchierte ich im Internet. Dabei fand ich heraus, dass man eine sogenannte „string-Variable" benötigt um mehrere Zeichen in einer Variable zu speichern. Danach konnte ich das Programm wieder in die alte Form zurückschreiben. Diesmal aber mit einer „string-Variable".

Damit Figuren nur richtige Züge machen dürfen, die den Regeln entsprechen, muss man dem Programm Regeln für die Figuren beibringen. Diese Regeln sind nicht im normalen Programmcode enthalten sondern sind ausgelagert worden in eine Funktion, die dann aufgerufen werden kann. Dies hat den Vorteil, dass man nur einmal eine Regel definieren muss und diese dann jederzeit abrufbar ist. So spart man sehr viel Quelltext. Eine Funktion wird aufgerufen mit gewissen Werten, die man der Funktion übergeben will (z.B. die Position, wo sich eine Figur befindet und wohin man sie bewegen will), diese nennt man Parameter. Ich habe den Fehler gemacht, die Variablen die man vor der Funktion definiert und als Parameter übergibt, gleich zu benennen, wie die übergebenen Parametervariablen. Jedoch muss man dem Parameter in der Funktion einen neuen Variablennamen zuweisen. Auch hier musste ich lange im Internet suchen, bis ich herausgefunden habe, dass ich hier einen Fehler gemacht habe.

Diese zwei Fehler sind mir passiert, weil ich C++ zwar mit einer sehr leicht verständlichen Anleitung (in der Form einer Videoanleitung) gelernt habe, die aber ein paar Sachen undiskutiert lässt. Deshalb sind diese zwei Fehler bei mir im Programm vorgekommen. Zudem sind weitere, kleinere Fehler aufgetreten, weil ich zu viel auf einmal programmiert habe und erst dann überprüft habe, ob das Programm fehlerfrei läuft.

Schach:

Bei der Programmierung für das Anzeigen einer Schachsituation hatte ich vor allem programmiertechnische Probleme, weil sehr viele Vorgänge vorhanden waren. Ich habe zweimal die Klammern falsch angesetzt, was dazu führte, dass ich diesen Abschnitt ein paar Mal überarbeiten musste. Erschwerend kam dazu, dass ich überprüfen musste, ob eine Figur auf das Feld des Königs springen konnte. Doch da dies verboten ist, funktionierte die Erkennung einer Schachsituation nicht. Erst als ich diesen Fehler erkannte, gelang mir die korrekte Umsetzung.

Da ich es nun erlauben lassen musste auf das Feld des Königs zu ziehen, konnte man dies jetzt auch bei einem normalen Zug machen. Um dies zu verhindern wird nun gerade nach der Eingabe überprüft, ob die Figur auf die Position des Königs springt, wenn dies der Fall ist, wird der Zug als falsch erkannt.

Schachmatt:

Bei der Schachmattprogrammierung hatte ich lange einen überlegungsfehler im Programmcode.

Bei der Schachmattprogrammierung werden zuerst alle legalen Möglichkeiten berechnet. Fälschlicherweise hat mein Programm bereits eine Schachmattsituation angegeben, wenn nur eine dieser Möglichkeiten eine Schachsituation gemeldet hat. Es müsste aber so sein, dass wenn nur eine einzige Situation gefunden wird, bei der keine Schachsituation vorliegt, dann sollte es melden, dass dies keine Schachmattsituation ist. Dieser Fehler passierte mir, weil der Programmcode ziemlich komplex ist. Ich musste für jede Start- und Zielposition eines Feldes auf der eine Figur steht überprüfen ob eine Figur mit der richtigen Farbe dasteht und die Art der Figur (Bauer, Läufer,...). Daraufhin musste der Zug durchgespielt werden, dort überprüfen wo sich der König befindet, überprüfen ob eine Figur auf das Feld des Königs springen kann (Schachsituation) und falls dies einmal nicht der Fall ist, melden, dass keine Schachmattsituation vorliegt. Später bemerkte ich auch noch, dass der König nicht aus einer Schachsituation ausweichen kann oder selbst nochmals in eine Schachsituation laufen kann. Dieser Fehler ist aufgetreten, weil der König mit falschen Positionsaufgaben aufgerufen wurde.

Sonstige Probleme

Ich hatte zudem noch ein paar andere Probleme, die aber alle einfach zu beheben waren. Zum Beispiel konnte man ein leeres Feld auf ein anderes leeres Feld springen lassen, man konnte zweimal das gleiche Feld auswählen und beim zweifachen Auswählens des Königs (Figur mit der man zieht und Zielort der Figur) verschwand der König von der Spielfläche.

3.2 Probleme bei der Programmierung der grafischen Oberfläche

Bei der Programmierung der Konsolenversion des Schachspiels habe ich nur im Stil der prozeduralen Programmiersprache programmiert, das bedeutet, dass das Programm aus einer Folge von Anweisungen und der darin aufgerufenen Funktionen besteht.

Der Theorie-Teil der objektorientierten Programmierung (bedeutet die Verkapselung von Daten und Funktionen in einem Objekt) habe ich aber nur teilweise in der Videoanleitung angeschaut. Da ich für das Programmieren eines Schachspiels nicht zwingend die objektorientierte Programmierung brauchte, schien es mir einfacher mein Programm nicht im Stil der objektorientierten Programmierung zu schreiben.

Doch als ich anfing Qt zu lernen, fand ich heraus, dass es bei der Programmierung einer grafischen Oberfläche zwingend notwendig ist objektorientiert zu schreiben. Wenn man den Schachfeldern Funktionen geben will (z.B. soll eine Funktion dem Computer angeben, dass ein Feld angeklickt wurde) dann wird zwingend eine Funktion eines Objektes benötigt, sonst wird diese Funktion nicht von Qt erkannt.

Das bedeutete, dass ich das gesamte Programm von der Struktur her umschreiben musste. Dies war sehr schwierig, weil ich nur mässige Kenntnisse von der objektorientierten Schreibweise hatte. Zudem machte mir das Qt-Lernen Mühe, da ich (wie ich vorher geschrieben habe) auf der objektorientierten Programmierung noch zu wenig Kenntnisse hatte.

Aus diesen Gründen habe ich einige Fehler gemacht, die ich nicht selber lösen konnte und deshalb habe ich mich an ein Forum1 gewandt, das auf Qt spezialisiert ist. Mit dieser Hilfe schaffte ich es einen funktionierenden Grundstein zu erstellen, auf dem ich dann wieder selbstständig arbeiten konnte. Dieser Grundstein bestand aus 32 schwarzen und 32 weissen Feldern, die aber noch nicht auf Mausklicks reagierten und auch noch keine Figuren besassen.

Grosse Probleme hatte ich auch bei der Einführung der Regeln aus dem Konsolenprogramm. Da die Ausgabe auf die Konsole und die grafische Ausgabe sich stark unterscheiden, lief das Programm zuerst nicht wunschgemäss. Anders war vor allem, dass bei der Konsolenversion die eine Seite, die am Zug war, ständig wieder aufgerufen wurde (in einer Schleife), bis ein korrekter Zug gemacht worden ist. Bei der grafischen Oberfläche hingegen musste nur mitgeteilt werden, ob der Zug richtig oder falsch ausgeführt wurde. In einer Funktion des Objektes wird der Zug dann durchgeführt und dort werden auch wieder die Regeln von der Konsolenversion aufgerufen.

4. Portierung des Schachprogrammes von der Konsole auf eine grafische Oberfläche

4.1 Auswahl einer Plattform für die Programmierungeiner grafischen Benutzeroberfläche

Mit den C++ Bibliotheken ist es sehr schwierig eine grafische Oberfläche zu erstellen, da die Programmierung mit WinAPI oder MFC sehr schwierig ist. Deshalb benutzt man normalerweise externe Bibliotheken, die viel einfacher zu erstellen sind und zu denen es auch bessere Anleitungen und Hilfeseiten im Internet gibt.

Zuerst wurde ich auf Allegro aufmerksam, da es angeblich einfach zu erlernen ist und weil Allegro gut geeignet für 2D Spiele ist. Jedoch musste ich feststellen, dass Allegro nicht so bekannt ist und deshalb keine guten Dokumentationen vorliegen.

Deshalb wollte ich auf C++/CLI wechseln, da ich Microsoft Visual Studio benutze und dort C++/CLI bereits integriert ist. Denn C++/CLI ist eine Mischung aus C++ und .net . Ich musste aber feststellen, dass man zwar eine grafische Oberfläche einfach zusammenstellen konnte, aber auch, dass mein gesamter Quellcode stark umgeschrieben werden müsste. Zudem hätte ich .net lernen müssen.

Darum wechselte ich auf SDL. SDL ist (ähnlich wie Allegro) besonders für Spiele geeignet. Jedoch ist SDL um einiges bekannter und darum gibt es auch mehr Anleitungen und Foren im Internet, wo ich Hilfe holen könnte. Leider war SDL auch um einiges komplizierter und deshalb entschied ich mich für das einfachere SFML. Dies wiederum ist ziemlich unbekannt und hatte nur eine Anleitung auf der Seite von SFML.

Schlussendlich entschied ich mich für Qt. Qt ist einsteigerfreundlich, hat eine gute Dokumentation, es gibt Bücher über die Programmierung mit Qt, es ist neben GTK+ eine der beliebtesten Programmbibliotheken und es gibt viele Foren, die mir helfen könnten.

Von Qt gibt es zwei Versionen. Es gibt eine Version, für die man zahlen muss, wenn man sein Programm später kommerziell vertreiben will. Allen anderen können Qt gratis benützen. Ich habe natürlich die Gratisversion verwendet für meine Maturaarbeit.

Um Qt zu lernen besorgte ich mir das Buch „Qt 4 - GUI-Entwicklung mit C++". Mit Hilfe dieses Buches, der Onlinedokumentation von Qt und der Hilfe des Forums " www.qtforum.de/" habe ich es geschafft eine grafische Oberfläche zu kreieren.

4.3 Funktionen für Buttons

Jetzt sind zwar alle Buttons erstellt und alle Buttons sind am richtigen Ort, doch das Klicken auf die Buttons bewirkt noch nichts. Darum muss man ein Signal senden lassen, wenn man einen Button anklickt und als Folge einen sogenannten SLOT aufrufen:

connect(pField[0][0], SIGNAL(clicked()), this, SLOT(geklickt00() ));

Dieser Codeteil bewirkt, dass wenn der Button pField[0][0] angeklickt wird, dann wird die Funktionsklasse geklickt00() aufgerufen. Diese Funktionsklasse ruft die Hauptfunktion von dieser grafischen Oberfläche auf, wobei es die Koordinaten als Parameter weitergibt:

4.4 Hauptfunktion meiner grafischen Oberfläche

Wenn weiss am Zug ist:

  • Die weisse Zugfunktion aus der Konsolenversion wird aufgerufen, aber nur wenn schon beide Buttons angeklickt worden sind (Die Figur, die man bewegen will und der Zielort der Figur)
  • Falls die Zugfunktion einen legalen Zug erkannt hat, dann wird das ursprüngliche Feld zu einem leeren Feld und der Zielort wird mit einer neuen Figur überschrieben

Wenn schwarz am Zug ist:

  • Die schwarze Zugfunktion aus der Konsolenversion wird aufgerufen, aber nur wenn schon beide Buttons angeklickt worden sind (Die Figur, die man bewegen will und der Zielort der Figur)
  • Falls die Zugfunktion einen legalen Zug erkannt hat, dann wird das ursprüngliche Feld zu einem leeren Feld und der Zielort wird mit einer neuen Figur überschrieben

Allgemein

  • Wenn erst der erste Button angeklickt wurde, dann muss dies gespeichert werden und die Hintergrundfarbe muss orange werden, damit man merkt, dass ein Button angeklickt wurde. Man darf dies nur tun, wenn eine richtige Figur gewählt wurde, sonst muss der Hintergrund rot werden, damit der Spieler merkt, dass er an einen falschen Ort geklickt hatte und zudem darf dann der Zug nicht gespeichert werden. Damit man schon im nächsten und nicht im übernächsten Zug mit einem legalen Zug fortfahren kann.
  • Schach und Schachmattsituationen müssen am Ende eines Zuges ausgegeben werden.

5. Schlusswort

Ich musste feststellen, dass das Ziel eines Schachcomputers mit einem Gegner viel zu hoch gesteckt war. Zu schaffen gaben mir die vielen Fehler, bei denen ich manchmal bis zu einem Monat brauchte um sie zu finden. Einerseits kamen, die Fehler aus Mangel an Wissen, weil die Videoanleitungen zu wenig ausführlich waren. Anderseits machte ich aber auch viele inhaltliche Fehler, bei denen ich überlegungsfehler hatte. Diese Fehler waren oftmals sehr schwierig zu finden, da man eine Idee hat, wie etwas funktionieren soll. Doch der Computer versteht aber nur genau das, was man eingibt und dies entspricht oft nicht der eigenen Vorstellung, wie etwas funktionieren soll. So musste ich bei vielen fehlerhaften Programmteilen das Programm an verschiedenen Stellen ändern und per Ausschlussverfahren herausfinden, wo das Problem lag und worin der Fehler bestand. Am meisten aber hatte mich die grafische Oberfläche aufgehalten, da ich sehr lange brauchte um mich auf eine Bibliothek für eine grafische Oberfläche festzulegen und die Erlernung und Anwendung harzig verliefen.

Rückblickend gesehen hatte ich in diesem Jahr sehr viel über die Programmierung erfahren. Ich musste jedoch feststellen, dass man sehr viel mehr Zeit braucht um gewisse Sachen zu Programmieren. Doch diese intensive Beschäftigung mit den Fehlern ist für mich die beste Methode etwas zu lernen, nämlich durch „Learning by Doing"

6. Anhang

6.1 Literaturverzeichnis

-„Qt 4 - GUI-Entwicklung mit C++"

6.2 Video Anleitungen

  • Video2Brain C++
  • Video2Brain Visual C++

6.3 Internetseiten

  • www.qt-forum.de ( http://www.qtforum.de/forum/viewtopic.php?t=9915&highlight= )

上一篇:German Essays - Enlightenment and Religious Tolerance 下一篇:Das ist das verlangen der sterblichen