Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03107.jsonl.gz/536

Idee
Die Thematik künstliche Intelligenz war für mich schon nur als Sci-Fi-Fan interessant, zusätzlich angetrieben durch meine Leidenschaft für Computerspiele wollte ich selbst eine KI für ein Spiel erschaffen und mein Wissen rund um künstliche Intelligenz vertiefen.
Konzept
Das richtige Spiel zu finden, war gar nicht so einfach. Die Anforderungen dafür aber klar: Es durfte nicht komplex sein. Denn ansonsten würde das Projekt zu lange dauern. Ich entschied mich für Tic Tac Toe. Ein sehr simples Spiel, welches mir auch durchaus bekannt war. So fiel es mir leicht, das Spielprinzip zu analysieren und im Ansatz zu verstehen, wie eine KI darin funktionieren muss. Die KI würde zuerst nach Mustern im Spiel suchen, welche das Spiel gewinnen würden. Dies wäre zum Beispiel der Fall, wenn das mittlere Feld und das mittlere obere Feld in der Farbe des Computers eingefärbt sind. Dann gewinnt der Computer wenn er das mittlere untere Feld einfärbt.
Ist kein solches Muster vorhanden, sucht die KI nach einem Muster, durch welches die KI verlieren könnte. Im vorherigen Beispiel wären die Felder mit der Farbe des Gegners eingefärbt. Diese Überlegungen sind natürlich der Beobachtungen eines richtigen Spielers angelehnt. Nun kommt der interessante Teil, denn mit den bisherigen Mustererkennungen, wird der Spielanfang noch nicht berücksichtigt. Dort findet die eigentliche Strategie statt.
Hier machte ich mir zwei Überlegungen. Ich konnte die KI unfehlbar machen und verhindern, dass sie von Trickzügen besiegt wird. Um das Spiel dennoch interessant zu gestalten, entschied ich mich lediglich die Felder zu priorisieren. So wird zuerst das Feld in der Mitte besetzt, danach die Eckfelder und zum Schluss die restlichen Felder. Dies lässt nun Raum für Fehler der KI. Ich verzichtete auf Spielereien wie gewichtete Randomisierung, wodurch sich die KI nicht jedes Mal gleich verhalten würde. Dies ist in Tic Tac Toe kaum von Relevanz und der Spieler ist bereits ein genug grosser Zufallsfaktor.
Medienwahl
Dass ich Webtechnologie verwenden würde, war mir von Anfang an klar. Dabei hatte ich zwei Möglichkeiten der Programmierung. Entweder PHP oder Javascript. Da ich beide Sprachen beherrschte und mir der Aufwand, eine neue Sprache zu lernen, zu gross war, entschied ich mich schlussendlich für Javascript. Es ergab für mich keinen Sinn den kleinen Rechenaufwand extra auf dem Server zu betreiben. Daneben wollte ich meine Kenntnisse in Javascript vertiefen. Für die Darstellung wählte ich natürlich HTML und CSS aus. Um mir den Darstellungsaufwand zu erleichtern, nutzte ich ebenfalls das Framework Bootstrap.
Produktionsweise
Ich konzentrierte mich hauptsächlich auf die Javascript-Programmierung. Die Darstellung war sekundär. Als Programmierumgebung nutzte ich Aptana, da diese eine sehr gute Fehlererkennung bei JavaScript hat. Zuerst musste ich das Spielsystem erstellen, welches die Regeln des Spiels vorgibt und die Zugabfolge erstellt. Beim Start der Webseite wird das Spiel initiiert. Der wichtigste Ausgangspunkt des Programms sind die Felder des Spiels. Beim Klick auf ein Feld wird der Javascriptcode ausgeführt. Falls das Feld nicht bereits besetzt war, wird es nun mit der Farbe des Spielers eingefärbt.
Danach implementierte ich die Überprüfung ob der Spieler bereits gewonnen hat. Im nächsten Schritt wurde die KI, wie bereits oben beschrieben, programmiert. Dies erforderte eine Häufung von Überprüfungen mit "if else" um die Muster abzuarbeiten. Danach wird vom Spielsystem nochmals überprüft, ob der Computer gewonnen hat. Ist dies nicht der Fall, kann der Spieler wieder ein Spielfeld anklicken und der Vorgang wird wiederholt. Erst wenn alle Felder besetzt sind oder jemand gewonnen hat, wird dies per Nachrichtenbox ausgegeben. Dann können die Felder nicht mehr angeklickt werden und es erscheint ein Button, mit welchem das Spiel neu gestartet werden kann.
Die Darstellung ist sehr simpel gehalten. Deshalb wurde sie auch für den Desktopcomputer konzipiert.
Workflow
Der Ablauf war ziemlich klar vorgegeben. Zuerst natürlich die Informationsphase und die Planung, in welcher in einem ersten Schritt das Spiel und das Medium gewählt wurden. Weiter musste dann natürlich das ganze Konzept erstellt werden. Dies hielt ich in einem simplen Programmablaufplan fest, in welchem ich nicht bis auf die Tiefe der einzelnen Mustererkennung einging. Danach erstellte ich relativ schnell das Spielfeld und begann mit der Programmierung, wie bereits bei der Produktionsweise beschrieben. Nach der Programmierung testete ich mein Programm für die ersten Fehlerkorrekturen nur im Firefox. Später wurde die Webapplikation auch noch in Chrome, Safari und dem Internet Explorer getestet. In einem letzten Schritt prüfte ich die Funktionalität der Applikationen auch noch auf meinem eigenen Webspace mit verschiedenen Browsern.
Herausforderungen
Herausforderungen gab es viele, so entschied ich mich beispielsweise, nicht extra Variablen für die Spielfelder zu erstellen, sondern gleich die Spielfeldcontainer als Datenträger zu nutzen. Dies schränkte mich im späteren Projekterlauf etwas ein. Denn ich wählte die Hintergrundfarbe zusätzlich zum Bestimmen, ob ein Feld besetzt ist oder nicht. Dies funktioniert leider nicht mit HexCodes und so griff ich auf Farbnamen zurück. Doch auch dies funktionierte mit Farbnamen wie "Tomato" o.ä. nicht in allen Browsern. Da zerbrach ich mir nun den Kopf über logische Fehler im Code und durchsuchte diesen mehrmals danach.
Später versuchte ich dann simplere Farbnamen wie "Red" und "Yellow". Diese funktionierten nun in allen Browsern und ich konnte auslesen, mit welcher Farbe ein Feld besetzt war.
Hätte ich diese Informationen aber von Anfang an in Variablen gespeichert, wäre dieses Problem gar nie aufgetaucht.
Weitere Schwierigkeiten ergaben sich beim Testen, denn um sicherzugehen, dass wirklich alles funktioniert, musste ich natürlich fast jede Kombination von Spiellagen testen. Dafür hätte ich einen Testplan erstellen sollen, nun geschah diese Testphase eher Handgelenk mal Pi, dennoch konnte ich einige Fehler ausmerzen, wie zum Beispiel ein Copy&Paste Fehler, welcher bei der Programmierung der Mustererkennung entstanden war.
Fazit
Der Aufwand für das Projekt war nicht zu klein. Doch konnte ich meine Javascript Kenntnisse vertiefen und einen Einblick in die Art und Form von künstlicher Intelligenz werfen. Dabei lernte ich, wie es sich mit Mustererkennung verhält und kann mir nun vorstellen, wie dies bei Schachcomputern oder anderen KI's programmiert wird. Trotzdem ist dieses Thema für mich noch nicht abgeschlossen, da es mich brennend interessiert, wie man eine KI programmiert, welche über mehrere Züge hinweg denkt, ohne ein riesiges Konstrukt von Vergleich zu programmieren.