JavaScript Tic Tac Toe AI Programmierung?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

ich möchte gerne ein Tic-Tac-Toe Game mit einem AI (BOT) programmieren.

Was soll man denn bei Tic-Tac-Toe groß für eine AI machen?

aber noch keine wirkliche richtige Lösung für den AI gefunden.

Das, was du wahrscheinlich vor hast, ist keine AI, sondern nur die automatische Reaktion auf bestimmte Spielsituationen.

Vielleicht kann mir ja jemand weiterhelfen, wie ich weitermachen soll... Sitze zur Zeit etwas fest.

Kannst du den Code bitte zusammen mit dem HTML bei https://jsfiddle.net/ einfügen (auf save klicken und den Link schicken), damit man einfacher Änderungen vornehmen kann?


GGHyperX 
Beitragsersteller
 11.10.2017, 21:43

Das mit den Antworten ist mir bisher noch gar nicht aufgefallen. 😉 Habe immer gedacht, dass sie nach der Reihenfolge gehen also wer wann was geschrieben hat... und mit der KI hast du natürlich Recht, dass man dies nicht KI nennen kann/darf. Ist halt trotz im Internet bei diversen Tic Tac Toe Tutorials bzw. Webseite so genannt worden 😁

0
GGHyperX 
Beitragsersteller
 12.10.2017, 07:48
@GGHyperX

Wie sagt man via If-Statement, wenn zwei in einer Reihe sind, setzte auf das dritte Feld in der Reihe?

0
GGHyperX 
Beitragsersteller
 12.10.2017, 07:53
@GGHyperX

Wenn man immer sagen würde z.B.:

if btn1.value == "O" || btn2.value == "O"...

Das Problem hier wäre ja, dass man sämtlich If-Statements schreiben müsste...

0
tavkomann  12.10.2017, 19:06
@GGHyperX

Das Problem hier wäre ja, dass man sämtlich If-Statements schreiben müsste...

Mach es mit Schleifen. Ich habe hier einmal obigen Algorithmus implementiert:

https://jsfiddle.net/w78L5f05/11/

Verändert habe ich die Funktion bot. Hinzugekommen sind die Funktionen checkTwoInRow, botChooseBtn, isEmpty und getBtn.

1
GGHyperX 
Beitragsersteller
 12.10.2017, 20:30
@tavkomann

wow... vielen vielen Dank^^ :)

Könntest du mir eventuell noch ein paar Worte über deine Vorgehensweise bzw. der Funktionsweise deiner geschrieben Zeilen erwähnen? - wäre wirklich sehr wichtung und cool von Dir :)

Verstehe bisher noch einiges von deinem Code leider nicht wirklich..

function getBtn (x, y) {

return document.getElementById(3 * y + x + 1);
}

Das hier verstehe ich zum Beispiel nicht richtig. Man liefert den IDs einen Rückgabewert, aber wofür und warum verwendet man das geschriebene in den Klammern bzw?

for (var i = 0; i < 3; i++) {

if (getBtn(0, i).value == sym &&
getBtn(0, i).value == getBtn(1, i).value) {
if(isEmpty(getBtn(2, i))) return getBtn(2, i);
}

Auch hier verstehe ich nicht ganz, warum man einfach isEmpty verwenden kann... - ist das bereits in integrieter JavaScript Aufruf, da du ja schließlich dies nirgendswo deklarierst oder? und wo deklarierst du die Variable "sym"?

0
tavkomann  12.10.2017, 23:12
@GGHyperX

Das hier verstehe ich zum Beispiel nicht richtig. Man liefert den IDs einen Rückgabewert, aber wofür und warum verwendet man das geschriebene in den Klammern bzw?

Die Funktion getBtn habe ich geschrieben, damit die Schleifen in den anderen Funktionen übersichtlicher aussehen. Sie gibt dabei den jeweiligen Button zurück. Dieser wird durch eine x- und eine y-Koordinate bestimmt:

0|0  1|0  2|0

0|1  1|1  2|1

0|2  1|2  2|2

Die IDs sehen allerdings so aus:

1    2    3

4    5    6

7    8    9

Nun ist das Ziel, anhand der x- und y-Koordinate die ID herauszufinden. Dazu muss die y-Koordinate mit 3 multipliziert werden. Die x-Koordinate wird dazu addiert. Außerdem muss noch 1 hinzuaddiert werden, weil du nicht bei 0 anfängst. Also im Grunde nur Mathematik.

Der Button mit der gefundenen ID wird letztendlich zurückgegeben. Dies halte ich für die bessere Variante als ein zweidimensionales Array.


Auch hier verstehe ich nicht ganz, warum man einfach isEmpty verwenden kann... - ist das bereits in integrieter JavaScript Aufruf, da du ja schließlich dies nirgendswo deklarierst oder?

isEmpty habe ich weiter unten deklariert, siehe:

function isEmpty(btn) {
   return (btn.value != "X" && btn.value != "O");
}

Sie dient ebenfalls der Übersichtlichkeit und liefert true zurück, falls das Feld leer ist, sonst false.


Ansonsten ist die Funktion checkTwoInRow wichtig. Diese überprüft, ob sich in einer Reihe (horizontal, vertikal oder diagonal) schon zwei Symbole befinden und ob das dritte Feld frei ist. Ist dies der Fall, liefert sie den jeweiligen Button zurück, ansonsten null.

und wo deklarierst du die Variable "sym"?

Das wird der Funktion übergeben.


Sollte noch etwas unklar sein, frage gerne nach.

1
GGHyperX 
Beitragsersteller
 13.10.2017, 07:56
@tavkomann
0|0  1|0  2|0

0|1 1|1 2|1

0|2 1|2 2|2




Ist der Aufbau nicht sehr ähnlich mit einem 2D-Array?

let array = [  
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]];

var btn0 = array[0][0] = document.getElementById("1")
var btn1 = array[0][1] = document.getElementById("2")
var btn2 = array[0][2] = document.getElementById("3")
var btn3 = array[1][0] = document.getElementById("4")
var btn4 = array[1][1] = document.getElementById("5")
var btn5 = array[1][2] = document.getElementById("6")
var btn6 = array[2][0] = document.getElementById("7")
var btn7 = array[2][1] = document.getElementById("8")
var btn8 = array[2][2] = document.getElementById("9")



Ich bräuchte trotz allem nochmal eine Erklärung bzgl. des mathematischen Algorithmus. Warum muss man die Koordinate mit 3 multiplizieren und dann noch x addieren und + 1?


Das wird der Funktion übergeben.

"sym" dann ein Parameter, der Funktion checkTwoInRow. Ich hatte immer gedacht, dass man Parameter vorher irgendwie deklarieren muss. Anscheinend kann man also irgendein Buchstabensalat in die Parameterliste eintragen und dies wird der Funktion übergeben? Was wird der Funktion denn von "sym" übergeben? Man prüft ja, ob die Value von getBtn, der Value von "sym" entspricht.




0
GGHyperX 
Beitragsersteller
 13.10.2017, 13:05
@GGHyperX
0|0 1|0 2|0

0|1 1|1 2|1

0|2 1|2 2|2

&

for (var i = 0; i < 3; i++) {     if (getBtn(0, i).value == sym &&     getBtn(0, i).value == getBtn(1, i).value) {     if(isEmpty(getBtn(2, i))) return getBtn(2, i);     }

Die Schleife läuft solange wie i < 3 ist. Der getBtn(0,i)

Also die 0 steht jetzt für die erste Reihe welche von oben nach unten geht  wie im oberen Codebeispiel zu sehen ist oder?

x|y

0|0 & 0|1 & 0|2

wobei das y, dann für i stehen würde, richtig?

Da bräuchte ich auch noch eine Erklärung. Auch bzgl. der ganzen If-Statements. An sich muss ich ja nur ein Statement verstehen, da sich dies ja immer wiederholt nur für einen anderen Block...

0
tavkomann  13.10.2017, 14:17
@GGHyperX

Ist der Aufbau nicht sehr ähnlich mit einem 2D-Array?

Ja, er ist ähnlich. Allerdings bevorzuge ich in diesem Fall eine mathematische Formel. Stell dir vor, du hast ein 100x100 Feld oder ein 1000x1000 Feld. Warum ein großes Array mühselig schreiben, anstatt eine kleine Formel zu benutzen?

Ich bräuchte trotz allem nochmal eine Erklärung bzgl. des mathematischen Algorithmus. Warum muss man die Koordinate mit 3 multiplizieren und dann noch x addieren und + 1?

Man kann so vorgehen: Du hast eine Funktion, in die du x und y reingibst. Nun ist dein Ziel, diesen beiden Werten die ID zuzuordnen. Dazu musst du schauen, wie sich diese in Abhängigkeit von beiden Werten verändert.

Abhängigkeit von y:

Wir schauen uns nur die erste Spalte an, da x = 0 sein soll.

 y  |  ID
----------
 0  |  1
|
1 | 4
|
2 | 7

Nun brauchen wir eine Formel, die dies beschreibt. Es handelt sich um lineares Wachstum, die Steigung ist drei, der Startwert ist eins. Somit gilt:

ID = 3y + 1
Abhängigkeit von x:

Jetzt müssen wird schauen, wie sich diese Werte verändern, wenn wir x erhöhen. Dazu schauen wir uns die erste Zeile an, da y = 0 sein soll.

 x | 0  1  2
---|---------
ID | 1  2  3

Es handelt sich ebenfalls um lineares Wachstum, die Steigung ist eins, der Startwert ist eins. Somit gilt:

ID = 1x + 1
Abhängigkeit von x und y:
Der Startwert ist immer derselbe, deshalb die "+ 1" am Ende. Der x-Wert verändert die ID um 1, deshalb "+ x". Der y-Wert verändert die ID um 3, deshalb "3y". Es ergibt sich:
ID = 3y + x + 1


Ich hatte immer gedacht, dass man Parameter vorher irgendwie deklarieren muss. Anscheinend kann man also irgendein Buchstabensalat in die Parameterliste eintragen und dies wird der Funktion übergeben?

Funktionen sehen so aus:

function name (parameter1, parameter2, ...) {

}

Sie können beliebig viele Parameter enthalten. Diese können jeden beliebigen Namen erhalten. Beispiel:

function add (a, b) {
  return a + b;
}

Diese Funktion addiert zwei Werte, z.B.:

result = add(3, 5); // ergibt 8

Zuvor muss keine Variable deklariert werden.

Was wird der Funktion denn von "sym" übergeben?

Das ist einfach das Symbol. Einmal wird die Funktion mit "X" aufgerufen, einmal mit "O". Das kannst du direkt im Code sehen.


Also die 0 steht jetzt für die erste Reihe welche von oben nach unten geht  wie im oberen Codebeispiel zu sehen ist oder?

Genau. Man will horizontal checken, also verfährt man Zeile für Zeile.

wobei das y, dann für i stehen würde, richtig?

Genau, i wird hier für den y-Wert genutzt.

Da bräuchte ich auch noch eine Erklärung.

if (getBtn(0, i).value == sym &&
getBtn(0, i).value == getBtn(1, i).value) {
if(isEmpty(getBtn(2, i))) return getBtn(2, i);
}

Genau. Wie gesagt, die Schleife prüft für jede Zeile. Dabei wird im ersten if geprüft, ob das linke Feld das übergebene Symbol (sym) hat und das mittlere Feld auch. Wenn dies stimmt und das rechte Feld leer ist, wird der rechte Button zurückgegeben.

Die anderen beiden ifs überprüfen, ob mittlerer und rechter bzw. linker und rechter Wert mit dem Symbol übereinstimmen und ob das dritte Feld frei ist.

D.h. dieser Teil prüft in jeder Zeile, ob dort schon zweimal das Symbol vorkommt und gibt das dritte Feld zurück, sofern es leer ist.

Das gleiche wird auch vertikal, d.h. Spalte für Spalte gemacht.

Diagonal wird keine Schleife benutzt, sondern nur sechs if-Anweisungen.

Sind nirgendwo zwei in einer Reihe, wobei das dritte Feld frei ist, wird null zurückgegeben.

1
GGHyperX 
Beitragsersteller
 16.10.2017, 07:21
@tavkomann Abhängigkeit von x und y: Der Startwert ist immer derselbe, deshalb die "+ 1" am Ende. Der x-Wert verändert die ID um 1, deshalb "+ x". Der y-Wert verändert die ID um 3, deshalb "3y". Es ergibt sich:
ID = 3y + x + 1

Warum verwenden wir noch die 3y, bzw. wozu brauchen wir eine Steigung von 3 und dementsprechend immer die dritte ID?

0
GGHyperX 
Beitragsersteller
 16.10.2017, 07:53
@GGHyperX
if (getBtn(0, 0).value == sym &&
getBtn(0, 0).value == getBtn(0, 2)) {
if (isEmpty(getBtn(1, 1))) return getBtn(1, 1);
}

&&
0|0  1|0  2|0

0|1 1|1 2|1

0|2 1|2 2|2


Warum soll er dann (1,1), auswählen?



1
tavkomann  16.10.2017, 17:00
@GGHyperX

Warum verwenden wir noch die 3y, bzw. wozu brauchen wir eine Steigung von 3 und dementsprechend immer die dritte ID?

Schau mal in die Tabelle. Wenn du den y-Wert um eins erhöhst, dann erhöht sich die ID um drei. Wenn du ihn um zwei erhöhst, erhöht sich die ID um sechs. So ist einfach der Zusammenhang, wenn du dir die Werte anschaust.

Warum soll er dann (1,1), auswählen?

Ups, das ist ein Flüchtigkeitsfehler. Statt 0, 0 muss in diesen Zeilen 2, 0 stehen.

1
GGHyperX 
Beitragsersteller
 17.10.2017, 07:19
@tavkomann
 y | ID
----------
0 | 1
|
1 | 4
|
2 | 7

Wie bildest du diese Wertetabelle bzw. wie kommt man auf y = 0,1,2 und ID 1,4,7.

x | 0  1  2
---|---------
ID | 1 2 3

Auch hier, warum jetzt diese Wertetabelle?

Das war eher meine Frage :D

Aber nochmals vielen lieben Dank :-)

0
tavkomann  17.10.2017, 17:31
@GGHyperX

Das ergibt sich aus deiner Benennung der Buttons:

1    2    3

4 5 6

7 8 9

Ich habe nur die erste Spalte bzw. Zeile für die beiden Tabellen verwendet. Dabei habe ich x- und y-Wert dazugeschrieben, um zu sehen, wie sie voneinander abhängen.

1
GGHyperX 
Beitragsersteller
 05.10.2017, 19:13
0
GGHyperX 
Beitragsersteller
 05.10.2017, 20:42
@tavkomann

okay, cool. Danke. Könntest du vll. erwähnen, was bei mir falsch war bzw. nicht richtig funktioniert hat? - und mir eventuell auch nochmal deine Vorgehensweise erklären? Wäre echt nett, würde es sehr gerne verstehen und davon lernen :)

0
tavkomann  05.10.2017, 21:01
@GGHyperX

Danke.

Gerne.

Könntest du vll. erwähnen, was bei mir falsch war bzw. nicht richtig funktioniert hat?

Zuerst habe ich deinen zusätzlichen Code von oben dort eingefügt und dann nachgesehen, warum es nicht funktioniert. In der Konsole kam der Fehler mit bot, weil du eine Variable genauso wie die Funktion genannt hast. Deshalb habe ich sie zu btn umbenannt.

Außerdem habe ich die Variable symbol entfernt, da sie redundant ist. Genauso habe ich setX entfernt und die eine Zeile direkt eingebaut. Zudem war in der Bedingung in der Funktion bot ein Fehler mit dem logischen Oder.

Dann hast du schließlich noch den Fehler, dass du in der Funktion bot die Funktion button aufrufst. Dies löst eine Endlosschleife aus, da die Funktion button wieder die Funktion bot aufruft, diese wieder button usw. Des Weiteren hast du in der Funktion button statt btn button geschrieben. Dies habe ich korrigiert.

und mir eventuell auch nochmal deine Vorgehensweise erklären?

Zuerst habe ich in der Entwicklerkonsole nachgesehen, ob es syntaktische Fehler oder Laufzeitfehler gibt. Nachdem ich diese beseitigt habe, habe ich nach semantischen Fehlern geschaut, d.h. warum der Code zwar korrekt ausgeführt wird, aber nicht das tut, was er tun soll. Dazu kann man den Code im Kopf durchgehen, d.h. so tun, als ob man jetzt auf einen Button geklickt hätte, und dann schauen, was der Code tun würde.

Wäre echt nett, würde es sehr gerne verstehen und davon lernen :)

Ah, das kommt schon mit der Erfahrung. Bleib einfach am Ball und du wirst besser. Aus Fehlern lernt man bekanntlich ;)

1
tavkomann  06.10.2017, 22:52
@tavkomann

Leider nehme ich keine Freundschaftsanfragen an. Du kannst deine Fragen aber gerne hier stellen :)

1
GGHyperX 
Beitragsersteller
 07.10.2017, 11:44
@tavkomann

okay, und zwar würde ich gerne via Button Klick zwischen dem Modus Player vs Player und Player vs AI wechseln können. Die beiden Funktion sind funktionsfähig also laufen jeweils nur ich weiß nicht, wie ich das implentieren kann um dann halt via Button-Klick zu wechseln.

Zudem kann ich nachdem ein Button bereits schon eine "value" bekommen hat, trotzdem noch ein Klick-Event ausführen und dann setzt der BOT wieder sein Feld. Da weiß ich leider auch nicht weiter...

Der Code: https://jsfiddle.net/w78L5f05/3/

0
tavkomann  07.10.2017, 13:14
@GGHyperX

okay, und zwar würde ich gerne via Button Klick zwischen dem Modus Player vs Player und Player vs AI wechseln können. Die beiden Funktion sind funktionsfähig also laufen jeweils nur ich weiß nicht, wie ich das implentieren kann um dann halt via Button-Klick zu wechseln.

https://jsfiddle.net/w78L5f05/6/

Zudem kann ich nachdem ein Button bereits schon eine "value" bekommen hat, trotzdem noch ein Klick-Event ausführen und dann setzt der BOT wieder sein Feld. Da weiß ich leider auch nicht weiter...

Das habe ich auch eingebaut. Du musst vorher überprüfen, ob auf diesem Button schon ein Kreuz oder ein Kreis ist, und in diesem Fall sofort abbrechen.

Außerdem solltest du dir angewöhnen, nach jeder Anweisung ein Semikolon zu setzten. JavaScript ist in dieser Hinsicht sehr tolerant, aber es gibt andere Sprachen, die so etwas nicht zulassen.

1
GGHyperX 
Beitragsersteller
 07.10.2017, 15:16
@tavkomann

Nochmals vielen Dank für deine Bemühungen! :)

Ich habe gerade gesehen, dass ich auch den falschen Code gesendet hatte also die falsche Version  ... trotzdem hast du mir genau die Lösung codiert, wie ich mir das gedacht hatte.

Hier war mein vorheriger Versuch, der Ansatz mit dem Button-Switch war sehr ähnlich ;)

https://jsfiddle.net/w78L5f05/5/

if (btn.value == "X" || btn.value == "O") {

return;

Das ist die Überprüfung, ob btn bereits eine value hat und wenn nicht, wird die Funktion abgebrochen? oder wie habe ich das mit "return" zu verstehen.

Könntest du mir eventuell auch nochmal erklären, wie due Funktion playerPC funktioniert, insbesondere der Teil mit dem "setTimeout", verstehe ich auch noch nicht so ganze :/

0
tavkomann  07.10.2017, 15:33
@GGHyperX

Das ist die Überprüfung, ob btn bereits eine value hat und wenn nicht, wird die Funktion abgebrochen? oder wie habe ich das mit "return" zu verstehen.

Genau. Das hast du richtig verstanden.

Könntest du mir eventuell auch nochmal erklären, wie due Funktion playerPC funktioniert, insbesondere der Teil mit dem "setTimeout", verstehe ich auch noch nicht so ganze :/

btn.value = "X";
var win = checkForWin();
if (win == true) return;

Der angeklickte Button bekommt als Wert ein X. Anschließend wird die Funktion checkForWin aufgerufen. Diese habe ich so umgeschrieben, dass sie true zurückgibt, wenn das Spiel vorbei ist, sonst false. Diesen Wert speichere ich in der der Variable win (für mehr Übersichtlichkeit) und breche ab, falls das Spiel vorbei ist. Ansonsten würde nämlich noch ein Kreis für den PC gesetzt werden, was aber nicht geht, wenn es ein Unentschieden war, da alle Felder belegt sind. Dadurch würde man in einer Endlosschleife landen.

symbol = "O";
bot();

Dann wird das Symbol auf O gesetzt und der Computer ist dran.

setTimeout(function() {
checkForWin();
symbol = "X";
},10);

Es wird überprüft, ob der Computer gewonnen hat und das Symbol wieder auf X gesetzt. Dies wird um zehn Millisekunden verzögert ausgeführt, da sonst im Falle eines Sieges der Alert schneller auftaucht, als der Wert des Buttons gesetzt wird. Mach es mal ohne Timeout und lasse den PC gewinnen. Dann wird nämlich der letzte Spielzug des PCs nicht angezeigt, weil der Alert schneller war.

1
GGHyperX 
Beitragsersteller
 07.10.2017, 16:12
@tavkomann

Programmierst/entwickelst du nur hobbymäßig oder machst du es unter anderem auch beruflich?

0
tavkomann  07.10.2017, 16:33
@GGHyperX

Beides, will mich aber zu Genauerem nicht äußern, um Beruf und Gutefrage voneinander zu trennen.

0
GGHyperX 
Beitragsersteller
 11.10.2017, 09:59
@tavkomann

Lohnt es sich bei einem Tic-Tac-Toe ein 2D Array zu verwenden? Wenn ja, wie würde das ca. aussehen?


var 2D Array = [  [1, 2, 3],  [4, 5, 6],  [7, 8, 9]]

Jetzt hat man natürlich ein 2D Array, aber ich verstehe nicht ganz, was das einem bringen soll...

Muss man dieses Array trotz allem auch wieder via IDs mit den Buttons verknüfpen oder wie?

Habe auch irgendwelche Möglichkeiten mit Schleifen gesehen, aber auch das noch nicht ganz verstanden.

und -

wie würde man jetzt vorgehen um eine etwas schlauere Anweisung zu geben - also irgendein Algorithmus, damit der "BOT" besser ist, da er ja momentan nur irgendein Feld auswählt und nach keinem Prinzip. ://








0
GGHyperX 
Beitragsersteller
 11.10.2017, 14:09
@GGHyperX

So sähe dann das 2D-Array aus.
Jetzt muss ich irgendwie via einer Schleife, denn "KI" programmieren...

let array = [      [1, 2, 3],      [4, 5, 6],      [7, 8, 9]];

var btn0 = array[0][0] = document.getElementById("1")var btn1 = array[0][1] = document.getElementById("2")var btn2 = array[0][2] = document.getElementById("3")var btn3 = array[1][0] = document.getElementById("4")var btn4 = array[1][1] = document.getElementById("5")var btn5 = array[1][2] = document.getElementById("6")var btn6 = array[2][0] = document.getElementById("7")var btn7 = array[2][1] = document.getElementById("8")var btn8 = array[2][2] = document.getElementById("9")
0
tavkomann  11.10.2017, 18:49
@GGHyperX

Lohnt es sich bei einem Tic-Tac-Toe ein 2D Array zu verwenden?

Nicht wirklich. Tic-Tac-Toe ist sowieso immer mit einem 3x3-Feld.

Muss man dieses Array trotz allem auch wieder via IDs mit den Buttons verknüfpen oder wie?

Ja. Deswegen sehe ich den Nutzen nicht.

Habe auch irgendwelche Möglichkeiten mit Schleifen gesehen, aber auch das noch nicht ganz verstanden.

Ja, ich würde eher Schleifen verwenden. Es kommt darauf an, wofür du sie verwenden willst.

Jetzt muss ich irgendwie via einer Schleife, denn "KI" programmieren...

Dann kannst du auch gleich eine Schleife verwenden und benötigst kein Array.

wie würde man jetzt vorgehen um eine etwas schlauere Anweisung zu geben - also irgendein Algorithmus, damit der "BOT" besser ist, da er ja momentan nur irgendein Feld auswählt und nach keinem Prinzip. ://

Du musst dir ein Prinzip ausdenken. Beispiel:

  • wenn ich zwei in einer Reihe habe, setze auf das dritte Feld, um zu gewinnen,
  • ansonsten, wenn der Gegner zwei in einer Reihe hat, auf das dritte Feld setzen, damit er nicht gewinnt,
  • ansonsten, wenn Mitte frei, in die Mitte setzen,
  • ansonsten, wenn Ecke frei, in Ecke setzen,
  • ansonsten zufällig wählen

Das ist sicherlich nicht das beste Prinzip, jedoch schon einmal besser als Zufall. Diesen Algorithmus kannst du dann umsetzen, indem du die Bedingungen jeweils überprüfst (if, else if, ..., else). 

Hast du dies geschafft, kannst du dir überlegen, was man besser machen könnte. Dazu kannst du z.B. überlegen, nach welchen Kriterien du selbst setzt.

1
GGHyperX 
Beitragsersteller
 11.10.2017, 19:52
@tavkomann

okay, das mit dem 2D Array hat mich auch ein bisschen verwirrt, da viele Leute das Tic Tac Toe Game mit einem 2D Array programmiert haben.

Du musst dir ein Prinzip ausdenken. Beispiel:

wenn ich zwei in einer Reihe habe, setze auf das dritte Feld, um zu gewinnen,

ansonsten, wenn der Gegner zwei in einer Reihe hat, auf das dritte Feld setzen, damit er nicht gewinnt,

ansonsten, wenn Mitte frei, in die Mitte setzen

,ansonsten, wenn Ecke frei, in Ecke setzen,

ansonsten zufällig wählen

Bei dem KI benötigt man also nur If-Statements und keine Schleifen? Was wäre denn eine Möglichkeit eine Schleife für einen KI zu verwenden?

0
tavkomann  11.10.2017, 20:26
@GGHyperX

Bei dem KI benötigt man also nur If-Statements und keine Schleifen?

KI kannst du das nicht nennen. Du weißt nämlich genau, was passiert, es ist fest vorgegeben. Das ist keine "künstliche Intelligenz", da sie nicht lernfähig ist. Es ist eher eine Vorstufe davon.

Übrigens: Die Reihenfolge der Antworten auf Gutefrage wird - wie ich neulich erfahren habe - durch Machine Learning, also mithilfe von neuronalen Netzen, festgelegt. Deswegen weiß auch keiner der GF-Mitarbeiter, warum manchmal negativ bewertete Antworten vorne stehen. Bei diesem Tic-Tac-Toe-Algorithmus ist allerdings jedem klar, wie er sich verhalten wird.

Was wäre denn eine Möglichkeit eine Schleife für einen KI zu verwenden?

Schleifen verwendet man, wenn man bestimmte Programmabläufe mehrfach ausführen möchte. Man sollte sich nicht überlegen, wozu man Schleifen verwenden sollte. Man sollte eher umgekehrt vorgehen, d.h. erst einen Algorithmus formulieren und danach überlegen, mit welchen Mitteln man diesen in einer bestimmten Programmiersprache implementieren kann.

0

Sowas nachträglich zu ändern, wenn das von Anfang an im Konzept fehlt ist oft schwer, hier dürfte das aber nicht so schwer sein. Du musst einfach nach jedem Spiuelerzug einen "KI-Zug aufrufen".

Wie die KI funktionieren soll musst du wissen, da gibt's viele viele Wege.

Woher ich das weiß:Studium / Ausbildung – Informatikstudium