[Gelöst]Hilfe !!! KI für Tic Tak Toe in C++
-
Hallo Leute

Ich hab folgendes Problem -> entweder bin ich zu blöd, oder hab eine Denkblockade ?!
Ich will eine KI für mein TTT Programm schreiben mit
-> Wenn 1 und 2 dann 3
-> Wenn 2 und 3 dann 1
-> wenn 4 und 5 dann 6
-> wenn 7 und 8 dann 9
-> wenn 5 und 7 dann 3 und andersrum
-> wenn 1 und 5 dann 9 und andersrum
Ich will nicht alles auflisten ich glaub ihr wisst wie man das spielt.Nun ja hab schon eine einfache schwierigkeitsstufe geschreiben mit random...
UND JETZT KOMM ICH NICHT WEITER...Hier der code
// Tic Tac Toe1.cpp #include <iostream> #include <string> #include <stdlib.h> #include <conio.h> #include <ctime> using namespace std; bool ende,zug; int wahl,spieler; string input; string feld[10]; void guess(); void guess1(); void hauptmenue(); void pvscoml(); void pvscoms(); //___________________________________________________________________________ void win(bool x) { if (x == true) { spieler = (spieler == 1) ? 2 : 1; cout << "spieler " << spieler << " Gewonnen!!!" << endl << endl; getch(); system("cls"); hauptmenue(); } else cout << "Unentschieden" << endl << endl; ende = true; system("pause"); } //___________________________________________________________________________ void richtig() { if (feld[1] == feld[2] && feld[2] == feld[3]) win(true); else if (feld[4] == feld[5] && feld[5] == feld[6]) win(true); else if (feld[7] == feld[8] && feld[8] == feld[9]) win(true); else if (feld[1] == feld[4] && feld[4] == feld[7]) win(true); else if (feld[2] == feld[5] && feld[5] == feld[8]) win(true); else if (feld[3] == feld[6] && feld[6] == feld[9]) win(true); else if (feld[1] == feld[5] && feld[5] == feld[9]) win(true); else if (feld[3] == feld[5] && feld[5] == feld[7]) win(true); else if (feld[1] != "1" && feld[2] != "2" && feld[3] != "3" && feld[4] != "4" && feld[5] != "5" && feld[6] != "6" && feld[7] != "7" && feld[8] != "8" && feld[9] != "9") win(false); } //________________________________________________________________________________________________ void start() { feld[0] = "0"; feld[1] = "1"; feld[2] = "2"; feld[3] = "3"; feld[4] = "4"; feld[5] = "5"; feld[6] = "6"; feld[7] = "7"; feld[8] = "8"; feld[9] = "9"; ende = false; spieler = 1; } //___________________________________________________________________________________ void guess() { system("cls"); cout << "Tic Tac Toe" << endl << endl; cout << "Plaver VS Plaver" << endl; cout << "spieler 1 (X) - spieler 2 (O)" << endl << endl; cout << endl; cout << " | | " << endl; cout << " " << feld[1] << " | " << feld[2] << " | " << feld[3] << endl; cout << "_____|_____|_____" << endl; cout << " | | " << endl; cout << " " << feld[4] << " | " << feld[5] << " | " << feld[6] << endl; cout << "_____|_____|_____" << endl; cout << " | | " << endl; cout << " " << feld[7] << " | " << feld[8] << " | " << feld[9] << endl; cout << " | | " << endl << endl; } void guess1() { system("cls"); cout << "Tic Tac Toe" << endl << endl; cout << "Plaver VS Computer" << endl; cout << "spieler 1 (X) - Computer (O)" << endl << endl; cout << endl; cout << " | | " << endl; cout << " " << feld[1] << " | " << feld[2] << " | " << feld[3] << endl; cout << "_____|_____|_____" << endl; cout << " | | " << endl; cout << " " << feld[4] << " | " << feld[5] << " | " << feld[6] << endl; cout << "_____|_____|_____" << endl; cout << " | | " << endl; cout << " " << feld[7] << " | " << feld[8] << " | " << feld[9] << endl; cout << " | | " << endl << endl; } //________________________________________________________________________________________________ void pvp() { start(); while (!ende) { guess(); cout << "spieler " << spieler << ", gib ein Feld ein: "; cin >> input; if(isalpha(input[0]) == false) { wahl= atoi(input.c_str()); if (wahl == 1 && feld[1] == "1") { feld[1] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 2 && feld[2] == "2") { feld[2] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 3 && feld[3] == "3") { feld[3] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 4 && feld[4] == "4") { feld[4] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 5 && feld[5] == "5") { feld[5] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 6 && feld[6] == "6") { feld[6] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 7 && feld[7] == "7") { feld[7] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 8 && feld[8] == "8") { feld[8] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 9 && feld[9] == "9") { feld[9] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } richtig(); } else { cout<<"Eingabe muss eine Zahl sein!"<<endl; getch(); } } } //_________________________________________________________________________ void schwer() { char auswahl1; cout << " Tic Tac Toe" << endl; cout << " Schwierigkeitsstufen"<< endl <<endl; printf("1. Leicht \n2. Schwer\n3. Hauptmenue\n"); do { // Menü ausgeben auswahl1 = getchar(); switch (auswahl1) { case '1': pvscoml(); break; case '2': pvscoms(); break; case '3': hauptmenue(); break; case '\n': continue; default: cout << "Fehler" << endl; } }while(auswahl1 == '1' || auswahl1 == '2'|| auswahl1 == '\n'); } //_________________________________________________________________________________ void pvscoms () { } //__________________________________________________________________________________ void pvscoml() { bool bInputOk = false; start(); while(!ende) { guess1(); if(spieler ==1) { cout << "Spieler gib ein Feld ein: "; cin >> input; if(isalpha(input[0]) == false) { wahl= atoi(input.c_str()); bInputOk = true; } else { cout<<"Eingabe muss eine Zahl sein!"<<endl; getch(); bInputOk = false; } }else{ wahl = rand()%9; bInputOk = true; cout <<"Computer spiel:" << wahl << endl; getch(); } if (bInputOk) { if (wahl == 1 && feld[1] == "1") { feld[1] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 2 && feld[2] == "2") { feld[2] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 3 && feld[3] == "3") { feld[3] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 4 && feld[4] == "4") { feld[4] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 5 && feld[5] == "5") { feld[5] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 6 && feld[6] == "6") { feld[6] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 7 && feld[7] == "7") { feld[7] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 8 && feld[8] == "8") { feld[8] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } if (wahl == 9 && feld[9] == "9") { feld[9] = (spieler == 1) ? "X" : "O"; spieler = (spieler == 1) ? 2 : 1; } richtig(); } } } //__________________________________________________________________________ void beenden() { char beenden; printf("Moechten Sie wircklich beenden?!\n"); printf("Fuer Ja -> j & Fuer Nein -> n \n"); beenden = getchar(); if(beenden =='j') { exit(0); } else { hauptmenue(); } }//_________________________________________________________ void hauptmenue() { char auswahl; cout << " Tic Tac Toe" << endl; cout << " Hauptmenue"<< endl <<endl; printf("1. Player vs Player \n2. Player vs Computer \n3. Beenden\n"); do { // Menü ausgeben auswahl = getchar(); switch (auswahl) { case '1': pvp(); break; case '2': schwer(); break; case '3': beenden(); break; case '\n': continue; default: cout << "Fehler" << endl; } }while(auswahl == '1' || auswahl == '2' || auswahl == '\n'); } //_________________________________________________________________________________________ int main() { srand ( (unsigned int)time(NULL) ); hauptmenue(); } //________________Sorry für die einfache Programmierung bin neu hier

UND BITTE HELFT MIR ICH VERZEIFLE NOCH

-
ok, schade für dich, dass du nicht weiterkommst.
die lösung des problems ist aber shconmal besprochen worden und steht hier bzw. hier
-
Das hilft mir nicht...
Ich brauche keine komplett Lösung - ich möchte einen Denkanstoß
-
ok, ich drücke es mal anders aus, da du mich offensichtlich nicht verstanden hast:
DU sollst dein Problem genauer beschreiben. Mir und vielen anderen hier im Forum hilft es nicht, wenn du sagst "Jetzt weiss ich nicht weiter". Hier werden viele schonmal so ein TicTacToe programmiert haben, und auch viele werden dir aus dem Kopf eine unbezwingbare KI schreiben können, da das aber (wie du selbst gesagt hast) nicht möchtest und brauchst, solltest du ein paar mehr Infos publizieren.
Deine Wertetabelle oben ist aj gut und schön, was sie heist ist eig auch klar. Und jetzt?
Schreib dir eine Funktion, die 2 Parameter hat und damit 2 Felder(Zahlen) bekommt. Dadrin kannst du per if entscheiden welche Zahl(Feld) zurückgegeben wird...
Edit: Rechtschreibung wegen dummer Tastatur ausgebessert

-
Du musst die einzelnen Felder bewerten.
1. höchste Wertung für du kannst gewinnen
2. der Gegner kann gewinnen (du musst blocken)
3. du kannst im übernächsten Zug gewinnen
...Der nächste Schritt wäre dann mehr Halbzüge zu untersuchen.
Hast du dir mal die englische Wikipedia-Seite dazu durchgelesen?
-
Ja, hab mir schon fast alle Seiten durchgelesen die es zu "C++ KI tic tak toe" bei google gibt // Komischer Satz
Und ein bisschen hab ich schon was -> halt würde dann so aussehen - ist aber noch nciht ganz fertig
if(spieler != 1) { if (feld[1] == 'X' && feld[2]=='X') feld[3]= 'O'; else if (feld[4] == 'X' && feld[5] == 'X') feld[6]='O'; else if (feld[7] == 'X' && feld[8] == 'X') feld[9]='O'; else if (feld[1] == 'X' && feld[4] == 'X') feld[7]='O'; else if (feld[2] == 'X' && feld[5] == 'X') feld[8]='O'; else if (feld[3] == 'X' && feld[6] == 'X') feld[9]='O'; else if (feld[1] == 'X' && feld[5] == 'X') feld[9]='O'; else if (feld[3] == 'X' && feld[5] == 'X') feld[7]='O'; }
-
Das solltest du in eine Funktion auslagern und die Werte für 'X' und 'O' in Variablen packen. Dann ist es egal für wen die Funktion spielt (X oder O)
Du solltest auch erst überprüfen ob du nicht gewinnen kannst.
Dann rufst du die Funktion mit dem selben Wert für Spieler und gegner auf.Dazu ist es auch sinnvoll der Funktion einen Rückgabe wert zu spendieren. Damit kann sie anzeigen ob sie überhaupt einen Zug gemacht hat (Bei dir z.B. passiert nichts, wenn das mittlere Feld frei ist).
-
X und O wollte ich nicht deklarieren da Spieler 1, immer zuerst dran kommt
(Bisschen blöd)
aber ich bin soweit fertig, denkblockade weg und da hab ich mein TTT und es LÄUFT so wie ich will
void pvscoms () { bool eingabe = false; start(); while(!ende) { guess1(); if(spieler ==1) { cout << "Spieler gib ein Feld ein: "; cin >> input; if(isalpha(input[0]) == false) { wahl= atoi(input.c_str()); eingabe = true; } else { cout<<"Eingabe muss eine Zahl sein!"<<endl; getch(); eingabe = false; } } else { if (feld[1] == "X" && feld[2]=="X") wahl = 3; else if (feld[3] == "X" && feld[2] == "X") wahl = 1;//feld[1]="O"; else if (feld[1] == "X" && feld[3] == "X") wahl = 2;//feld[2]="O"; else if (feld[4] == "X" && feld[5] == "X") wahl = 6;//feld[6]="O"; else if (feld[6] == "X" && feld[4] == "X") wahl = 5;//feld[5]="O"; else if (feld[6] == "X" && feld[5] == "X") wahl = 4;//feld[4]="O"; else if (feld[6] == "X" && feld[4] == "X") wahl = 5;//feld[5]="O"; else if (feld[7] == "X" && feld[8] == "X") wahl = 9;//feld[9]="O"; else if (feld[9] == "X" && feld[8] == "X") wahl = 7;//feld[7]="O"; else if (feld[7] == "X" && feld[9] == "X") wahl = 8;//feld[8]="O"; else if (feld[1] == "X" && feld[4] == "X") wahl = 7;//feld[7]="O"; else if (feld[7] == "X" && feld[1] == "X") wahl = 4;//feld[4]="O"; else if (feld[4] == "X" && feld[7] == "X") wahl = 1;//feld[1]="O"; else if (feld[2] == "X" && feld[5] == "X") wahl = 8;//feld[8]="O"; else if (feld[5] == "X" && feld[8] == "X") wahl = 2;//feld[2]="O"; else if (feld[2] == "X" && feld[8] == "X") wahl = 5;//feld[5]="O"; else if (feld[3] == "X" && feld[6] == "X") wahl = 9;//feld[9]="O"; else if (feld[6] == "X" && feld[9] == "X") wahl = 3;//feld[3]="O"; else if (feld[3] == "X" && feld[9] == "X") wahl = 6;//feld[6]="O"; else if (feld[1] == "X" && feld[5] == "X") wahl = 9;//feld[9]="O"; else if (feld[5] == "X" && feld[9] == "X") wahl = 1;//feld[1]="O"; else if (feld[9] == "X" && feld[1] == "X") wahl = 5;//feld[5]="O"; else if (feld[3] == "X" && feld[5] == "X") wahl = 6;//feld[7]="O"; else if (feld[5] == "X" && feld[7] == "X") wahl = 3;//feld[3]="O"; else if (feld[3] == "X" && feld[7] == "X") wahl = 5;//feld[5]="O"; else{ wahl = rand()%9 +1; cout <<"Computer spiel:" << wahl << endl; getch(); } eingabe = true; }// Ende If Anweisung if(eingabe) { zuege(); richtig(); }// Ende der Mittleren If Anweisung // Ende 1. If Anweisung }// Ende While Schleife }// Ende Funktion
-
schön sieht das aber nicht aus.
und falls du Visual C++ nutzt, markier mal mit Strg-A deinen gesamten Quellcode und drück Strg+K+F...
-
Danke für den Tipp xD 
-
Könnte man das nicht in Klassen einteilen ? und wenn ja wie ?
