Tic-Tac-Toe mit array's



  • DirkB schrieb:

    Habe ich um 15:45:26 geschrieben.

    😕 😕
    Ja wie grieg ich den jz weg?


  • Mod

    Du hast jetzt schon zwei gute Antworten dazu bekommen. Einmal meine (die auch auf EBCDIC funktioniert, dessen Zeichentabelle ich nicht komplett auswendig kenne 😃 ) und die von DirkB. Bitte lies sie, sonst verlieren Helfer das Interesse.



  • Mann, Mann, Mann.

    DirkB schrieb:

    int als Arrayindex findet der Compiler besser.

    Heißt: Der Compiler hätte als Arrayindex lieber ein int statt eines char.

    Da schauen wir mal in deine Funktion rein:

    void eingabe(char feld[3][3],char zeile, int spalte)
    {
    ...
       feld[zeile][spalte]='X';
        system("cls");
    
    }
    

    und sehen: hoppla, der Index für zeile ist ja vom Typ char.

    Was kann man da machen? (achte auf das fett gedruckte)

    DirkB schrieb:

    void eingabe(char feld[3][3],[b]int [/b]zeile, int spalte)
    

    denn:

    DirkB schrieb:

    Zeichen (Buchstaben) passen auch in ein int. 🙂

    oder du castest zeile nach int. Dann ist der Compiler auch ruhig.

    Deinen Hintern wisch ich jetzt aber nicht ab.



  • OKEY OKEY OKEY
    Danke, Ich weiß ich bin etwas begriffsstützig 😉
    Danke für eure Hilfe 🙂



  • ok so weit so gut ... 0 warnings .... nur schreibt er mir bei int alles auf [0][0] -.-'



  • cooky451 schrieb:

    cooky451 schrieb:

    Sollten sich die Werte der Variablen die in der main() deklariert wurden irgendwann mal ändern?



  • cooky451 schrieb:

    cooky451 schrieb:

    cooky451 schrieb:

    Sollten sich die Werte der Variablen die in der main() deklariert wurden irgendwann mal ändern?

    JA! ??? tun sie auch o.O



  • Hello World schrieb:

    JA! ??? tun sie auch o.O

    Aha, echt? Wo genau? Insbesondere den Wert von "spalte" würde ich mal beobachten 😉



  • ICH DEPP <--
    Ich muss es über die Adresse aufrufen oder?



  • Hello World schrieb:

    Ich muss es über die Adresse aufrufen oder?

    Ja, ich glaube auch dann stimmt irgendetwas nicht ganz mit dem System, aber du weist ja jetzt woher der Fehler kommt.

    void foo(int *p)
    {
      printf("%p - %i\n", p, *p); // Adresse, Wert
      *p += 1; // Dereferenzierung, funktioniert.
      // p += 1 // <- Ist böse, wenn p nicht auf ein Array zeigt.
    }
    
    int main()
    {
      int i = 5;
      foo(&i);
      foo(&i);
    }
    


  • So würde es ja auch perfekt funktionieren ... und wenn ich dann wieder alles umschreiben muss -.- gibt es da denn nicht auch i-eine andere Lösung?

    weiter unten
    


  • Ich denke die Warnungen sind jetzt weg? 😮

    Und bei eingabe sind die gotos ÜBERFLÜSSIG! DAS GEHT ANDERS! 😡

    Zudem unterscheiden sich die beiden if Zweige nur durch 'X' und 'O'
    Das kann man zusammen fassen.



  • 1.)Ne es gibt noch warnings 😞
    2.)Ja ich weiß aber do,while mag mich nicht 😉
    3.)Egal ich habs hahlt für mich übersichtlicher gemacht ^^
    4.)Die Warnings sind mir im Moment mehr oder weinger ******* egal
    5.)Scheitere ich nun an einem PC-Gegner der sich beim 3. Zug immer aufhängt -.-

    #include <KÄÄÄÄÄSSSSEEEEEE.h>
    

    EDIT: ok CPU_gegner funzt.... unentschieden kommt allerdings zu frü xD



  • Hello World schrieb:

    1.)Ne es gibt noch warnings 😞
    2.)Ja ich weiß aber do,while mag mich nicht 😉
    3.)Egal ich habs hahlt für mich übersichtlicher gemacht ^^
    4.)Die Warnings sind mir im Moment mehr oder weinger ******* egal
    5.)Scheitere ich nun an einem PC-Gegner der sich beim 3. Zug immer aufhängt -.-

    1. Du hast die schon genannten Korrekturen auch nicht eingetragen..
    2. do .. while tue solange (die Bedingung wahr ist)
    3. OK, mit der Einstellung hilft dir nochmal jemand , nicht.
    4. Auch Warnungen muss man ernst nehmen.
    5. Liegt das an einem Code, wo keiner mehr durchsteigt -> Spaghetticode



  • Ok Meine to-do list bis morgen
    1.Die erwähnten Korrekturen vornehmen
    2.Versuchen das goto rauszubringen
    3.Code übersichtlichermachen

    ist das okey? 😉



  • Initialsiere dein feld mit ' ' für jedes Element (sind ja nur 9)
    Dann kannst du am Anfang dein leeres Feld schon mit zeichneFeld() ausgeben.

    Die Variable zeile sollte vom Typ int sein (auch wenn da ein 'A' drin steht, das geht in C)

    Du hast nach Zeil 38: scanf("%d",&auswahl); dein Programm zweimal da stehen. Sooo groß sind die Unterschiede nicht zwischen Mensch-Mensch und Mensch-Computer.

    Schreib eine Funktion check_feld() , die die anderen check_xxx() aufruft. Diese Funktion gibt dann -1 oder 0 oder 'X' oder 'O' zurück. Je nachdem ob noch Züge möglich sind, Unentschieden oder wer Gewinner ist.

    Dann geht auch sowas

    int sieger;
    sieger = check_feld(feld);
    if (sieger > 0)
      printf("Gratulation Player %c. Sie haben gewonnen!\n", sieger);
    ....
    

    eingabe(..., char player) braucht den player auch nur zum drucken und setzten. player sollte auch int sein.

    void eingabe(char feld[3][3],char zeile, int spalte, int player) 
    { print   'Spieler %c ist dran', player
      tue
        Koordinaten einlesen
      solange (Koordinaten ungültig)
    
      setze an Koordinaten player
    }
    

    Kurz und knapp, keine überflüssige Wiederholung, kein goto 😉

    Viel Spaß dabei.



  • Sooooo
    Punkt 2 & 3 hätte ich dann schon mal!!
    nur mit Punkt 1 gibts noch Probleme denn sobald ich dass mit der adresse anreden möchte also ein * davor schreibe kommen etwa 2 Dutzen warnings und ein paar errors -.-'

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <windows.h>
    #include <time.h>
    
    void programStart();
    void zeichneFeld(char feld[3][3]);
    void eingabe(char feld[3][3],char zeile, int spalte,char player);
    void eingabeUndPc(char feld[3][3],char zeile, int spalte,char player);
    int pruefeEingabe(char zeile, int spalte);
    int pruefeFeld(char feld[3][3],int zeile,int spalte);
    int pruefeFeldPc(char feld[3][3],int zeile,int spalte);
    int checkDiagonal(char feld[3][3]);
    int checkZeile(char feld[3][3]);
    int checkSpalte(char feld[3][3]);
    int checkUnentschieden(int zuege, int zuege_x,int zuege_o);
    
    int main()
    {
        char feld[3][3] = {{0}};
        int i=0,x=0,o=0,
            xz=0,oz=0,
            xs=0,os=0,
            zuege=0,
            zuege_o=0,
            zuege_x=0,
            draw,
            auswahl;
        int spalte=1;
        char zeile='A';
    
            programStart();
            system("cls");
            printf("\n\t\t\t(1) Um gegen einen Freund zu spielen\n");
            printf("\n\t\t\t(2) Um gegen den Computer zu spielen\n");
            scanf("%d",&auswahl);
    
    if(auswahl==1)
    {
        printf("\n\n\n\t\t\t    TIC TAC TOE\n\n");
        printf("\t\t\t     1   2   3  \n");
        printf("\t\t\t   +---+---+---+\n");
        printf("\t\t\t A |   |   |   |\n");
        printf("\t\t\t   |---+---+---|\n");
        printf("\t\t\t B |   |   |   |\n");
        printf("\t\t\t   |---+---+---|\n");
        printf("\t\t\t C |   |   |   |\n");
        printf("\t\t\t   +---|---|---+\n");
    
            for(i=0;i<=5;i++)
            {
                zuege++;
                eingabe(feld,zeile,spalte,'X');
                zuege_x++;
                zeichneFeld(feld);
                x=checkDiagonal(feld);
                if(x==2)
                {
                    printf("Gratulation Player X Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                xz=checkZeile(feld);
                if(xz==2)
                {
                    printf("Gratulation Player X Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                xs=checkSpalte(feld);
                if(xs==2)
                {
                    printf("Gratulation Player X Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                draw=checkUnentschieden(zuege,zuege_x,zuege_o);
                if(draw==1)
                    return 0;
                eingabe(feld,zeile,spalte,'O');
                zuege_o++;
                zeichneFeld(feld);
                o=checkDiagonal(feld);
                if(o==1)
                {
                    printf("Gratulation Player O Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                oz=checkZeile(feld);
                if(oz==1)
                {
                    printf("Gratulation Player O Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                os=checkSpalte(feld);
                if(os==1)
                {
                    printf("Gratulation Player O Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                checkUnentschieden(zuege,zuege_x,zuege_o);
                if(draw==1)
                    return 0;
            }
    
        system("PAUSE");
        return 0;
        }
    if(auswahl==2)
    {
        fflush(stdin);
        printf("\n\n\n\t\t\t    TIC TAC TOE\n\n");
        printf("\t\t\t     1   2   3  \n");
        printf("\t\t\t   +---+---+---+\n");
        printf("\t\t\t A |   |   |   |\n");
        printf("\t\t\t   |---+---+---|\n");
        printf("\t\t\t B |   |   |   |\n");
        printf("\t\t\t   |---+---+---|\n");
        printf("\t\t\t C |   |   |   |\n");
        printf("\t\t\t   +---|---|---+\n");
    
            for(i=0;i<=5;i++)
            {
                zuege++;
    
                /** Eingabe des Spieler X                           **/
                eingabeUndPc(feld,zeile,spalte,'X');
                zuege_x++;
                zeichneFeld(feld);
    
                /** Überprüfung ob 3 X in einer Diagonale vorkommen **/
                x=checkDiagonal(feld);
                if(x==2)
                {
                    printf("Gratulation Player X Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
    
                /** Überprüfung ob 3 X in einer Zeile vorkommen     **/
                xz=checkZeile(feld);
                if(xz==2)
                {
                    printf("Gratulation Player X Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
    
                /** Überprüfung ob 3 X in einer Spalte vorkommen    **/
                xs=checkSpalte(feld);
                if(xs==2){
                    printf("Gratulation Player X Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
    
                /** Überprüft ob noch ein Spieler gewinnen kann     **/
                draw=checkUnentschieden(zuege,zuege_x,zuege_o);
                if(draw==1)
                    return 0;
    
                /** Eingabe des Computer                            **/
                eingabeUndPc(feld,zeile,spalte,'O');
                zuege_o++;
                zeichneFeld(feld);
    
                /** Überprüfung ob 3 O in einer Diagonale vorkommen **/
                o=checkDiagonal(feld);
                if(o==1){
                    printf("Gratulation Player O Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
    
                /** Überprüfung ob 3 O in einer Zeile vorkommen    **/
                oz=checkZeile(feld);
                if(oz==1){
                    printf("Gratulation Player O Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
    
                /** Überprüfung ob 3 O in einer Zeile vorkommen    **/
                os=checkSpalte(feld);
                if(os==1){
                    printf("Gratulation Player O Sie haben gewonnen!\n");
                    system("PAUSE");
                    return 0;
                }
                /** Überprüft ob noch ein Spieler gewinnen kann   **/
                checkUnentschieden(zuege,zuege_x,zuege_o);
                if(draw==1)
                    return 0;
            }
        system("PAUSE");
        return 0;
    }
        return 0;
    }
    void programStart(){
        /** Ausgabe der Regeln und so **/
        printf("Herzlich Willkomen bei Tic-Tac-Toe!\n\n"
               "Der Spieler X beginnt, Die Eingabe erfolgt im Format\n"
               "ZeileSpalte, z.B.: B2!\nWenn sie soweit sind kann das Spiel beginnen!\n\n");
        system("PAUSE");
        system("cls");
    }
    void zeichneFeld(char feld[3][3]){
    
        /** Ausgebe des kompletten Tic-Tac-Toe stand **/
        printf("\n\n\n\t\t\t    TIC TAC TOE\n\n");
        printf("\t\t\t     1   2   3  \n");
        printf("\t\t\t   +---+---+---+\n");
        printf("\t\t\t A | %c | %c | %c |\n",feld[0][0],feld[0][1],feld[0][2]);
        printf("\t\t\t   |---+---+---|\n");
        printf("\t\t\t B | %c | %c | %c |\n",feld[1][0],feld[1][1],feld[1][2]);
        printf("\t\t\t   |---+---+---|\n");
        printf("\t\t\t C | %c | %c | %c |\n",feld[2][0],feld[2][1],feld[2][2]);
        printf("\t\t\t   +---|---|---+\n");
    
    }
    void eingabe(char feld[3][3],char zeile, int spalte, char player){
        char enter[3], dummy;
        int ok;
    
        if(player=='X'){
        do{
    
        do{
        /** Eingabe **/
        printf("\n        \t\tSpieler X Ihre Eingabe -> ");
        gets(enter);
        ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
        }while(pruefeEingabe(zeile,spalte)!=0&&dummy!='\n');
    
        /** Wandelt Buchstaben in Positionen (Zahlen) um **/
        if(zeile=='A')
            zeile=0;
        if(zeile=='B')
            zeile=1;
        if(zeile=='C')
            zeile=2;
        spalte-=1;
    
        }while(pruefeFeld(feld,zeile,spalte)==1);
    
        /** Beschreibt das entsprechende Feld **/
        feld[zeile][spalte]='X';
        system("cls");
        }
    
        if(player=='O'){
    
        do{
        do{
        printf("\n        \t\tSpieler O Ihre Eingabe -> ");
        gets(enter);
        ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
        }while(pruefeEingabe(zeile,spalte)!=0&&dummy!='\n');
    
        /** Wandelt Buchstaben in Positionen (Zahlen) um **/
        if(zeile=='A')
            zeile=0;
        if(zeile=='B')
            zeile=1;
        if(zeile=='C')
            zeile=2;
        spalte-=1;
    
       }while(pruefeFeld(feld,zeile,spalte)==1);
    
        /** Beschreibt das entsprechende Feld **/
        feld[zeile][spalte]='O';
        system("cls");
    
        }
    
    }
    void eingabeUndPc(char feld[3][3],char zeile, int spalte, char player){
        char enter[3], dummy;
        int ok;
    
        if(player=='X'){
        do{
        do{
        printf("\n        \t\tSpieler X Ihre Eingabe -> ");
        gets(enter);
        ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
        }while(pruefeEingabe(zeile,spalte)!=0&&dummy!='\n');
    
        /** Wandelt Buchstaben in Positionen (Zahlen) um **/
        if(zeile=='A')
            zeile=0;
        if(zeile=='B')
            zeile=1;
        if(zeile=='C')
            zeile=2;
        spalte-=1;
    
        }while(pruefeFeld(feld,zeile,spalte)==1);
    
        /** Beschreibt das entsprechende Feld **/
        feld[zeile][spalte]='X';
        system("cls");}
        if(player=='O'){
        printf("\n        \t\tDer Computer ist dran! ");
    
        time_t t;
        int i,j;
    
        do{
        time(&t);
        srand((unsigned int)t); /** Zufallsgenerator initialisieren **/
        i=0;j=0;t=0;
    
        /** Erzeugung der Zufallszall für die Position in der Zeile **/
        for (i=0;i<9;i++)
            if(feld[0][0]!=0&&feld[0][1]!=0&&feld[0][1]!=0)
               zeile=rand()%3+1;
            zeile=rand()%3+0;
    
        /** Erzeugung der Zufallszall für die Position in der Spalte **/
        for (j=0;j<9;j++)
            if(feld[0][0]!=0&&feld[1][0]!=0&&feld[2][0]!=0)
               spalte=rand()%3+1;
            spalte=rand()%3+1;
    
        }while(pruefeFeldPc(feld,zeile,spalte)==1);
    
        /** Beschreibt das entsprechende Feld **/
        feld[zeile][spalte]='O';
        system("cls");
    
        }
    
    }
    int pruefeEingabe(char zeile, int spalte){
        if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3)
            return 0;
        else
            return 1;
    
    }
    int pruefeFeld(char feld[3][3],int zeile,int spalte){
        /** Überprüft ob auf dem geplannten, zu beschreibenden Feld nicht bereits ein Wert gespeichert ist **/
        if(feld[zeile][spalte]!=0){
            printf("Position schon vergeben!\n");
            return 1;
        }
        else
            return 0;
    }
    int pruefeFeldPc(char feld[3][3],int zeile,int spalte){
        /** Überprüft ob auf dem geplannten, zu beschreibenden Feld nicht bereits ein Wert gespeichert ist **/
        if(feld[zeile][spalte]!=0){
            return 1;
        }
        else
            return 0;
    }
    int checkDiagonal(char feld[3][3]){
        char help1,help2,help3;
    
        /** Überprüft ob drei gleiche in einer Diagonale sind **/
        help1=feld[0][0];
        help2=feld[1][1];
        help3=feld[2][2];
        if(help1==help2&&help2==help3&&help1==help3){
            if(help1=='X'){
                printf("Spieler X gewinnt\n");
                system("PAUSE");
                return 2;
            }
            if(help1=='O'){
                printf("Spieler O gewinnt\n");
                system("PAUSE");
                return 1;
            }
        }
        /** Überprüft ob drei gleiche in einer Diagonale sind **/
        help1=feld[0][2];
        help2=feld[1][1];
        help3=feld[2][0];
        if(help1==help2&&help2==help3&&help1==help3){
            if(help1=='X'){
                printf("Spieler X gewinnt\n");
                system("PAUSE");
                return 2;
            }
            if(help1=='O'){
                printf("Spieler O gewinnt\n");
                system("PAUSE");
                return 1;
            }
        }
        return 0;
    }
    int checkZeile(char feld[3][3]){
        char help1,help2,help3;
        int i;
    
        /** Überprüft ob drei gleiche in einer Zeile sind **/
        for(i=0;i<=3;i++){
        help1=feld[i][0];
        help2=feld[i][1];
        help3=feld[i][2];
        if(help1==help2&&help2==help3&&help1==help3){
            if(help1=='X'){
                printf("Spieler X gewinnt\n");
                system("PAUSE");
                return 2;
            }
            if(help1=='O'){
                printf("Spieler O gewinnt\n");
                system("PAUSE");
                return 1;
            }
        }
        }
    
        return 0;
    }
    int checkSpalte(char feld[3][3]){
        char help1,help2,help3;
        int i;
    
        /** Überprüft ob drei gleiche in einer Spalte sind **/
        for(i=0;i<=3;i++)
        {
            help1=feld[0][i];
            help2=feld[1][i];
            help3=feld[2][i];
            if(help1==help2&&help2==help3&&help1==help3){
                if(help1=='X'){
                    printf("Spieler X gewinnt\n");
                    system("PAUSE");
                    return 2;
                }
                if(help1=='O'){
                    printf("Spieler O gewinnt\n");
                    system("PAUSE");
                    return 1;
                }
            }
        }
    
        return 0;
    }
    int checkUnentschieden(int zuege, int zuege_x,int zuege_o){
        /** Überprüft ob ein Spieler noch geweinnen könnte **/
        if(zuege>=9||zuege_o>=5||zuege_x>=5){
            printf("Unentschieden!\n");
            system("PAUSE");
            return 1;
        }
        return 0;
    }
    


  • Hello World schrieb:

    nur mit Punkt 1 gibts noch Probleme denn sobald ich dass mit der adresse anreden möchte also ein * davor schreibe kommen etwa 2 Dutzen warnings und ein paar errors -.-'

    Und wir dürfen in den 463 Codezeilen jetzt herausfinden, wo diese Meldungen auftauchen könnten?



  • Hello World schrieb:

    Sooooo
    Punkt 2 & 3 hätte ich dann schon mal!!
    nur mit Punkt 1 gibts noch Probleme denn sobald ich dass mit der adresse anreden möchte also ein * davor schreibe kommen etwa 2 Dutzen warnings und ein paar errors -.-'

    1. Es gabe mehrere erwähnte Korrekturen.
    Ein paar hast du nicht eingebaut. Welche hat denn einen *? Und wo im Text hast du sie eingebaut? Und wie?
    2. Ok die Gotos sind weg.
    3. Hahaha, wo denn?



  • also ich dachte da so ....

    void eingabe(char feld[3][3],char zeile, int spalte,char player);
    

    in

    void eingabe(char feld[3][3],int *zeile, int *spalte,char player);
    

Anmelden zum Antworten