Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.03.2015, 03:43

Tic Tac Toe Computer Gegner funktioniert nicht

Hey ich wollte gerade mein Tic Tac Toe Konsolenspiel um einen Computergegner erweitern und habe angefangen eine Funktion für diesen zu erstellen
diese sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char computer_gegner(char *felder)
{
    char zug[4], eingabe, zeichen = 'O'; // zug[4] = Der Spieler kann höchstens 4 Züge machen da der Computer anfängt            
    static int o = 0, x = 1;            //o = soll testen welcher Zug momentan ist, x = das selbe für X 
    if (o == 0)                         // Soll beim erstenmal Zug[0-3] mit ' ' initialisieren
    {
        for (int i = 0; i < 4; i++)
            zug[i] = ' ';
    }
    if (x == 1)                         // Sollte es der erste Zug von dem Computer sein, soll er auf Feld 5 ein X setzen
        felder[5] = 'X';
    if (zug[0] == '3' && x == 2)        // Sollte zug[0] den Wert '3' besitzen und der momentane Zug vom Computer ist der 2. so 
    felder[7] = 'X';                    //  setzte ein X auf das Feld7                  
    x++;                                // erhöht den Wert der angibt welchen Zug der Computer machen muss
    feld_zeichnen(felder);              //"zeichnet" das Feld, die Funktion setzt nur in das Feld die werte von felder[1-9] ein
    cin >> eingabe;                     // fordert eine Eingabe für den Spieler
    felder[eingabe - '0'] = 'O';        //setzt auf das Feld der Eingabe ein 'O'
    zug[o] = eingabe;                   //Soll zug[0] mit dem Wert der eingabe gleichsetzen, bzw zug[1] beim zweiten durchlauf
    o++;                                //erhöhe o
    return eingabe;                     
    

}


Das erste "X" setzt er auch auf das Feld 5, und das Feld was der Spieler angibt macht er auch, aber wenn der Spieler das Feld 3 wählt setzt der Computer kein X auf Feld 7

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

2

29.03.2015, 13:19

Hallo Tokitari,

auch wenn du deinen Code mit einer Menge Kommentare versehen hast, ist es schwierig, die verhaltensweise deiner KI zu verstehen. Das ist denke ich auch das Problem, denn wären die Reaktionen deiner KI auf bestimmte Eingaben übersichtlicher, dann gäb es keine Schwierigkeiten. Soweit ich das verstehe, wird in der Methode COMPUTER[...] auch die Eingabe eines SPIELERS abgefragt. Das ist schonmal schlecht - der Methodenname passt entweder nicht oder dieser Teil müsste in eine andere Methode ausgelagert werden. Letzteres würde ich dir auch empfehlen:

Du hast drei Methoden: Computer, Spieler, Überprüfen. Alle bekommen einen Zeiger auf das Feld übergeben (char** Feld) und returnen keinen Wert (void). Computer berechnet nun den Zug des Computers und trägt diesen gleich in das Feld ein. Spieler fragt die Eingabe des Spielers ab und trägt auch seinen Zug ein. Überprüfen ist für für die Gewinnerkennung zuständig. Nun werden in deiner Main reihum die Methoden aufgerufen und dazwischen immer das Feld gezeichnet.

Außerdem würde ich auf Static-Member verzichten, soetwas schafft nur Verwirrung. Schreib dir lieber eine Methode, die dir den aktuellen Zug oder soetwas returnt. Das kann sie entweder mit dem Spielfeld als Übergabeparameter tun oder einfach eine globale Variable auslesen.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

3

29.03.2015, 13:51

Ich werde mal die Funktion neu schreiben, vielen Dank erstmal

4

29.03.2015, 23:13

Ich habe jetz die Variable zug[] in der main Funktion deklariert und greife mit einem Pointer darauf zu. Außerdem verwende ich jetzt 2 verschiedene Funktionen, einmal für den Spieler und einmal für den Computer. Es funktioniert jetzt alles so wie es soll, trotzdem benutze ich weiterhin die static Variablen anstatt den global deklarierten Variablen und es funktioniert trotzdem. Danke für die Hilfe nochmal

Werbeanzeige