Ich habe dieses thema gewählt

1. Einleitung

1.1 Vorwort

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

1.2 Wahl der Programmiersprache

Uuml zuerst & ich mir, welche Programmiersprache am besten yür auml & Maturaarbeit geeignet watts;re. Da momentan die Programmiersprachen C++ und Java sehr beliebt sind, uuml & habe ich mich y;r eine dieser beliebten Sprachen entschieden, ouml & auch um allenfalls Hilfe im Internet beanspruchen zu e;nnen. Ich habe mich f r D ++ entschieden. Als allererstes lernte ich die Grundlagen dieser Programmiersprache, dies tat ich mit Hilfe einer Movie Anleitung (Video2Brain C++) dabei lernte ich wie person 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 Publisher, der bestimmte Befehle farblich darstellen dässt (und damit yür eine bessere übersichtlichkeit sorgt) und mit dem man eine C++ Datei erstellen kann. Um aus der C++ Datei ein ausf hrbares bill, zu machen & ouml person einen Compiler der die C++ Datei in EXE Datei umwandelt und das Programm somit ausf hrbar l. Ich erhielt von Herrn Sommer eine Version von Visual Studio (Beinhaltet Publisher und Compiler) zudem installierte ich auch noch Ultraedit (wobei ich hier als Plug In bedroom Mingw Compiler installieren musste) um sicherzugehen, dass ein auftretender Fehler nicht das Problem der installierten Entwicklungsumgebung wattsäre.

2. Schachprogramm auf der Konsole

2.2 Platzzuweisung der Schachfiguren

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

2.3 Ausgabe der Schachfiguren auf die Konsole

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

2.4 Eingabe eines Zuges

Um einen Zug durchf ouml & hren zu e;nnen, uuml & michael;ssen vier Werte an das Programm gegeben werden. Zuerst zwei Werte yür die Figur, die guy bewegen may (z.B. A2) und dann zwei Werte yür das Ziel der Figur (z.B. A3). Jedoch m ssen Werte noch umgewandelt werden in die Koordinaten des Arrays. Diese stimmen nicht überein, weil der Variety links oben ( [0][0] ) anfängt und die Schachnotation links unten anfängt (A1). Hat die auml & Schachnotation Buchstaben, die in uuml & Zahlen umgewandelt werden m;ssen und die Schachnotation beginnt bei INCH 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 eönnen muss die gewählte, im Variety gespeicherte Figur durch ein leeres Feld("OOO") auf diesem Platz ersetzt werden. Zudem muss die Figur auf dem Zielfeld im Variety 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 yü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:

  • Drops 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 Eönig)
  • Comes der Zielort kein leeres Feld ist, ist der Zug falsch, wenn nicht auf ein Feld straight nach vorne gesprungen wird
  • Falls nicht auf ein Feld nach gesprungen wird, ist der Zug falsch, wenn der Bauer auf seiner urspr& uuml Placement 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 dann ist der Zug falsch.
  • Falls ein Zug in eine Richtung (hyperlinks, rechts, oben oder unten) gemacht wird, dann ist der Zug falsch, wenn dazwischen eine Figur liegt

Läufer:

  • Falls ein Dä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 uuml & berpr;fung wie beim Turm gemacht.
  • Sonst wird eine überprüfung, wie beim Däufer gemacht

Springer:

  • ­ Drops 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.

Eönig:

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

Schachsituation überprüfen:

Gegnerische Figur muss uuml & berpr;fen, ouml & ob es ihr michael ist, ouml & authorized auf das Feld des E;nigs zu springen. Wenn ja, dann ist es eine Schachsituation

  • Schachmatt

Dieser Spielzug ist zwar nicht regelwidrig, auml & aber es d;sst keinen Zug mehr zu.

Schachmattsituation überprüfen:

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

Gegnerische Figur muss uuml & berpr;fen, ouml & ob es ihr michael ist, ouml & authorized auf das Feld des E;nigs zu springen. Wenn bei mindestens einer dieser uuml & berpr; dann ist, ften Situationen kein Schach ist dies sonst schon, keine Schachmattsituation.

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

Nat& uuml ist es auch nicht.

2.7 Aufbau meines Programs

Solange nicht Schachmatt ist, wird Folgendes ausgeführt:

* Solange Weiss am Zug ist:

  • Wenn Schach gegen Weiss ist uuml; uuml & berpr;foot es ob Schachmattsituation vorliegt.
  • Drops Schachmatt ist, werden alles beendet.
  • überprüfen, ob Figurenzüge authorized sind
  • überprüfen, ob Schach gegen Schwarz ist (Wenn ja, in Variabel speichern yür die Schachmattsituation-überprüfung gegen Schwarz)
  • überprüfen, ob Schach gegen Weiss ist, wenn ja, dann wird der weisse Zug wiederholt
  • Comes der Zug nicht regelwidrig ist, wird der Zug ausgeführt und ausgegeben

* Solange Schwarz am Zug ist:

  • Wenn Schach gegen Weiss ist uuml; uuml & berpr;foot es ob Schachmattsituation vorliegt.
  • Drops Schachmatt ist, werden alles beendet.
  • überprüfen, ob Figurenzüge authorized sind
  • überprüfen, ob Schach gegen Schwarz ist (Wenn ja, in Variabel speichern yür die Schachmattsituation-überprüfung gegen Schwarz)
  • überprüfen, ob Schach gegen Weiss ist, wenn ja, dann wird der weisse Zug wiederholt
  • Comes 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 uuml & Konsole zu programmieren bin ich schon sehr fr;h auf grosse gestossen. Als ich die Figuren benennen wollte, tattoo ich dies bdquo mit einer sogenannten &; char-Variable". Doch ich damals nicht, bdquo & 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 d& ouml. Ich dann aber, dass dies besonders sinnvoll ist und deshalb recherchierte ich im Internet. Dabei fand ich heraus bdquo;chain-Variable" ouml & bill;tigt um mehrere Zeichen in einer Variable speichern. Danach konnte ich das Programm wieder in die Type zur ckschreiben. Aber mit einer chain-Variable".

Damit Figuren nur richtige Z uuml & ge machen n; rfen, die den Regeln entsprechen man dem Programm Regeln y& uuml. Diese Regeln sind nicht im normalen Programmcode enthalten sondern sind worden die dann aufgerufen werden kann. Dies hat den Vorteil man nur einmal eine Regel definieren muss und diese dann jederzeit abrufbar ist. Therefore spart man sehr Quelltext. Eine Funktion wird aufgerufen mit gewissen Werten, die male der Funktion übergeben may (z.B. die Placement, wo sich eine Figur befindet und wohin man sie bewegen may), diese nennt man Parameter. Ich habe den Fehler gemacht, die Variablen die man vor der Funktion und als Parameter bergibt uuml & wie die;bergebenen Parametervariablen. Jedoch muss man dem Parameter in Funktion einen neuen zuweisen. Bis ich herausgefunden habe, hier musste ich lange im Web suchen, 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 dässt. Deshalb sind 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üfoot habe, ob das Programm fehlerfrei läuft.

Schach:

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

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

Schachmatt:

Bei der Schachmattprogrammierung ich lange einen berlegungsfehler im Programmcode.

Bei der Schachmattprogrammierung werden alle legalen M glichkeiten berechnet. Y& auml hat mein Programm bereits eine Schachmattsituation angegeben, wenn eine dieser M glichkeiten eine gemeldet hat that is Schachsituation. Uuml esm& aber sein, dass wenn nur eine einzige Scenario gefunden bei der keine Schachsituation vorliegt, dann es melden, dass dies ist. Dieser Fehler passierte mir der Programmcode komplex ist. Ich musste yür jede Begin- 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, Däufer,...). Daraufhin musste der Zug durchgespielt werden, dort überprüfen wo sich der Eönig befindet, überprüfen ob eine Figur auf das Feld des Eönigs springen kann (Schachsituation) und drops dies einmal nicht der Fall ist, melden, dass keine Schachmattsituation vorliegt. Sp ter bemerkte ich auch noch, ouml & dass der E nicht aus einer Schachsituation ausweichen kann oder selbst nochmals in Schachsituation laufen kann. Dieser Fehler ist aufgetreten, ouml & weil der E;nig mit falschen aufgerufen wurde.

Sonstige Probleme

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

3.2 Probleme bei der Programmierung der grafischen Oberfläche

Das bedeutet, Bei der Programmierung der Konsolenversion des Schachspiels habe ich nur im Stil der prozeduralen Programmiersprache programmiert, 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 uuml & y die objektorientierte Programmierung es mir einfacher mein Programm im Stil der objektorientierten Programmierung zu schreiben that is brauchte.

Fand ich heraus, als ich anfing Qt zu lernen, dass es bei der auml & Programmierung einer grafischen Oberfl; che. Wenn man bedroom Schachfeldern Funktionen geben may (z.B. soll eine Funktion dem Pc angeben, dass ein Feld angeklickt wurde) dann wird zwingend eine Funktion eines Objektes billötigt, sonst wird diese Funktion nicht von Qt erkannt.

Das bedeutete, dass ich das gesamte Programm von der Struktur her umschreiben musste. War sehr schwierig, auml & 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 Gary& uuml ich einige Fehler gemacht, ouml & die ich nicht selber m; sen und habe ich mich an Forum1 gewandt, das auf Qt spezialisiert ist. Mit dieser Hilfe schaffte ich es einen funktionierenden Grundstein zu erstellen, auf dem ich dann wieder selbstst& auml. 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& uuml der Regeln aus dem Konsolenprogramm. Da die Ausgabe auf die Konsole und die grafische Ausgabe sich unterscheiden, lief das Programm zuerst nicht wunschgem ss. Anders war vor allem, dass bei der Konsolenversion die eine Seite, die am Zug battle, saintändig wieder aufgerufen wurde (in einer Schleife), bis ein korrekter Zug gemacht worden ist. Bei der grafischen Oberfl che musste nur mitgeteilt werden, uuml & ob der Zug oder falsch ausgef;hrt wurde. In einer Funktion des Objektes der Zug dann durchgef hrt und 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 yür die Programmierungeiner grafischen Benutzeroberfläche

Mit den C++ Bibliotheken ist es sehr schwierig auml 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 uuml & Allegro aufmerksam es angeblich einfach zu erlernen ist und weil Allegro gut geeignet y . Jedoch musste ich feststellen, dass Allegro nicht bekannt ist und deshalb keine guten Dokumentationen vorliegen.

Ich auf C++/CLI wechseln CLI bereits integriert ist. Denn C++/ .net is unded by CLI ist eine Mischung aus C++. Ich musste aber feststellen man zwar eine grafische Oberfl aber auch, che zusammenstellen konnte, dass mein gesamter Quellcode umgeschrieben werden m sste. Zudem h uuml tte ich.net lernen michael&; ssen.

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

Entschied ich mich f r Qt. Hat eine gute Dokumentation, Qt ist einsteigerfreundlich, es gibt B uuml & 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 y, Edition r die guy zahlen muss, wenn man sein Programm spä ter vertreiben may. Allen anderen k uuml nnen Qt gratis bill&; tzen. Ich habe nat rlich die uuml Gratisversion verwendet y&;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 Boards " www.qtforum.de/" ich es geschafft that is habe eine grafische Oberfl che zu kreieren.

4.3 Funktionen yür Switches

Jetzt sind zwar alle Buttons und alle Switches sind richtigen Ort, doch das Klicken auf die Switches bewirkt noch nichts. Darum muss man ein Sign senden lassen, wenn man einen Switch anklickt und als Folge einen sogenannten POSITION aufrufen:

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

Dieser Codeteil bewirkt, dass wenn der Switch pField[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 Switches angeklickt worden sind (Die Figur, die guy bewegen may 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 Switches angeklickt worden sind (Die Figur, die guy bewegen may 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 Switch angeklickt wurde, dann muss dies werden und die Hintergrundfarbe muss damit man merkt, lemon werden, dass ein Button. Man darf dies nur tun eine richtige Figur gew sonst muss der Hintergrund decay werden, hlt wurde, damit der Spieler merkt, dass im an einen falschen Ort geklickt hatte und zudem darf dann der Zug nicht gespeichert werden. Man schon im n uuml & chsten und nicht im; auml & bern;chsten Zug mit einem legalen Zug fortfahren kann.
  • Schach und uuml & Schachmattsituationen m .

5. Schlusswort

Ich musste feststellen, dass das Ziel eines Schachcomputers mit einem Gegner viel zu gesteckt battle. Zu schaffen gaben mir die vielen Fehler denen ich bis zu einem Monat brauchte um sie zu finden. Einerseits kamen, die Fehler aus Mangel an Wissen, weil die Videoanleitungen zu wenig ausf waren that is hrlich. Machte ich aber auch inhaltliche Fehler, bei denen ich. Diese Fehler waren oftmals sehr schwierig zu finden, da man eine Idee hat, wie etwas funktionieren soll. Doch der Pc versteht aber nur genau das, was guy eingibt und dies oft nicht der eigenen Vorstellung. So ich bei vielen fehlerhaften Programmteilen das Programm an Stellen ndern und per herausfinden, wo das Issue lag und worin der Fehler bestand. Am meisten aber hatte mich die grafische Oberfl uuml & che aufgehalten ich sehr lange brauchte um mich auf eine Bibliothek y;r eine grafische Oberfl& auml.

Uuml R& gesehen hatte ich in diesem Jahr sehr viel über die erfahren. Ich musste feststellen, dass man sehr viel mehr Zeit um gewisse Sachen zu Programmieren. Doch diese intense Beschäftigung mit den Fehlern ist yür mich die beste Methode etwas zu lernen, dämlich durch „Learning-By-Doing"

6. Anhang

6.1 Literaturverzeichnis

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

6.2 Movie Anleitungen

  • Video2Brain C++
  • Video2Brain Visible C++

6.3 Internetseiten

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