Tic-Tac-Toe mit array's



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <windows.h>
    
    #define Z 3
    #define S 3
    
    void programStart();
    void zeichneFeld(char *feld[3][3], int n, int s);
    void eingabe(char *feld,char zeile, int spalte);
    int pruefeEingabe(char zeile, int spalte);
    
    int main()
    {
        char feld[3][3] = {{0}};
        int n=0,s=0;
        int spalte=1;
        char zeile='A';
            programStart();
    
            printf("     1   2   3  \n");
            printf("   |---|---|---|\n");
            printf(" A |   |   |   |\n");
            printf(" B |   |   |   |\n");
            printf(" C |   |   |   |\n");
            printf("   |---|---|---|\n");
            printf("Noch keine Spielzuege vorhanden!\n");
    
            eingabe(feld,zeile,spalte);
            zeichneFeld(feld[n][s],n,s);
    
        system("PAUSE");
        return 0;
    }
    void programStart()
    {
        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], int n, int s)
    {
    
        printf("     1   2   3  \n");
        printf("   |---|---|---|\n");
        printf(" A |%s |%s |%s |\n",feld[n][s],feld[n][s],feld[n][s]);
        printf(" B |%s |%s |%s |\n",feld[n][s],feld[n][s],feld[n][s]);
        printf(" C |%s |%s |%s |\n",feld[n][s],feld[n][s],feld[n][s]);
        printf("   |---|---|---|\n");
    
    }
    void eingabe(char *feld,char zeile, int spalte)
    {
        char enter[3], dummy;
        int ok;
        printf("Spieler X Ihre Eingabe -> ");
        gets(enter);
        ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
        printf("%c%d\n",zeile,spalte);
        if(zeile=='A')
            zeile=0;
        if(zeile=='B')
            zeile=1;
        if(zeile=='C')
            zeile=2;
        spalte=-1;
        feld[zeile][spalte]='X';
        system("PAUSE");
    
    }
    int pruefeEingabe(char zeile, int spalte)
    {
        if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3)
            return 0;
        else
            return 1;
    
    }
    

    ok .... in zeile 77 will ich das feld ja beschreiben -.-'


  • Mod

    Und der Compiler lässt das nicht zu, weil feld ein char* ist. Daher ist dann feld[zeile] ein char und feld[zeile][spalte] macht keinen Sinn mehr, da man einen char nicht weiter dereferenzieren kann.

    Das ist aber eigentlich ein Folgefehler, weil feld in diesem Zusammenhang eigentlich gar kein char* sein sollte, sondern wohl eher ein char (*)[3].

    Ob diese Änderung alleine hilft, bezweifle ich jedoch, da die obige Compilerausgabe dir zeigt, dass dein Programm überall nur so vor Fehlern strotzt.

    ⚠ Und zum allerletzten Mal: Stell vernünftige Fragen! Beschreibe deine Fehler! Dies war das letzte Mal, dass du ohne eine vernünftige Fehlerbeschreibung eine Antwort bekommst. Einfach nur Quellcode mit der Angabe "geht nicht" ist keine Fehlerbeschreibung.



  • In Zeile 77 weiß der Compiler nichts von der Feldgröße 3x3

    Bei void zeichneFeld(char *feld[3][3], int n, int s) ist ein * zuviel.



  • Nochmal zu zeichneFeld:
    %s gibt einen String aus.
    Das ist ein Zeichenfolge, die mit dem Zeichen'\0' abgeschlossen ist. feld[][] besteht aber nur aus einzelnen Zeichen.
    Im ersten Post war das zumindest noch richtig.



  • ok
    @SeppJ ja ja ... ist okey
    @DirkB Danke 🙂
    So ich verstehe das in Zeile 77 nicht was dieses Warning von mir will?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <windows.h>
    
    #define Z 3
    #define S 3
    
    void programStart();
    void zeichneFeld(char feld[3][3], int n, int s);
    void eingabe(char feld[3][3],char zeile, int spalte);
    int pruefeEingabe(char zeile, int spalte);
    
    int main()
    {
        char feld[3][3] = {{0}};
        int n=0,s=0;
        int spalte=1;
        char zeile='A';
            programStart();
    
            printf("     1   2   3  \n");
            printf("   |---|---|---|\n");
            printf(" A |   |   |   |\n");
            printf(" B |   |   |   |\n");
            printf(" C |   |   |   |\n");
            printf("   |---|---|---|\n");
            printf("Noch keine Spielzuege vorhanden!\n");
    
            eingabe(feld,zeile,spalte);
            zeichneFeld(feld,n,s);
    
        system("PAUSE");
        return 0;
    }
    void programStart()
    {
        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], int n, int s)
    {
    
        printf("     1   2   3  \n");
        printf("   |---|---|---|\n");
        printf(" A |%d |%d |%d |\n",feld[n][s],feld[n][s],feld[n][s]);
        printf(" B |%d |%d |%d |\n",feld[n][s],feld[n][s],feld[n][s]);
        printf(" C |%d |%d |%d |\n",feld[n][s],feld[n][s],feld[n][s]);
        printf("   |---|---|---|\n");
    
    }
    void eingabe(char feld[3][3],char zeile, int spalte)
    {
        char enter[3], dummy;
        int ok;
        printf("Spieler X Ihre Eingabe -> ");
        gets(enter);
        ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
        printf("%c%d\n",zeile,spalte);
        if(zeile=='A')
            zeile=0;
        if(zeile=='B')
            zeile=1;
        if(zeile=='C')
            zeile=2;
        spalte=-1;
        feld[zeile][spalte]='X';
        system("PAUSE");
    
    }
    int pruefeEingabe(char zeile, int spalte)
    {
        if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3)
            return 0;
        else
            return 1;
    
    }
    

    EDIT: ist doch eigentlich eine korrekte zuweisung oder?



  • Du hast ja jetzt einiges geändert.
    Wie lautet denn jetzt die Warnung?



  • So jz läufts .... hab aber immer noch 1 Warning

    75: Array subscribed has type 'char'
    

    Quellcode:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <windows.h>
    
    #define Z 3
    #define S 3
    
    void programStart();
    void zeichneFeld(char feld[3][3], int n, int s);
    void eingabe(char feld[3][3],char zeile, int spalte);
    int pruefeEingabe(char zeile, int spalte);
    
    int main()
    {
        char feld[3][3] = {{0}};
        int n=0,s=0;
        int spalte=1;
        char zeile='A';
            programStart();
    
            printf("     1   2   3  \n");
            printf("   |---|---|---|\n");
            printf(" A |   |   |   |\n");
            printf(" B |   |   |   |\n");
            printf(" C |   |   |   |\n");
            printf("   |---|---|---|\n");
            printf("Noch keine Spielzuege vorhanden!\n");
    
            eingabe(feld,zeile,spalte);
            zeichneFeld(feld,n,s);
            eingabe(feld,zeile,spalte);
            zeichneFeld(feld,n,s);
    
        system("PAUSE");
        return 0;
    }
    void programStart()
    {
        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], int n, int s)
    {
    
        printf("     1   2   3  \n");
        printf("   |---|---|---|\n");
        printf(" A | %c | %c | %c |\n",feld[0][0],feld[0][1],feld[0][2]);
        printf(" B | %c | %c | %c |\n",feld[1][0],feld[1][1],feld[1][2]);
        printf(" C | %c | %c | %c |\n",feld[2][0],feld[2][1],feld[2][2]);
        printf("   |---|---|---|\n");
    
    }
    void eingabe(char feld[3][3],char zeile, int spalte)
    {
        char enter[3], dummy;
        int ok;
        printf("Spieler X Ihre Eingabe -> ");
        gets(enter);
        ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
    
        if(zeile=='A')
            zeile=0;
        if(zeile=='B')
            zeile=1;
        if(zeile=='C')
            zeile=2;
        spalte-=1;
        feld[zeile][spalte]='X';
        system("cls");
    
    }
    int pruefeEingabe(char zeile, int spalte)
    {
        if(zeile>='A'&&zeile<='C'&&spalte>=1&&spalte<=3)
            return 0;
        else
            return 1;
    
    }
    

  • Mod

    Der Compiler möchte dich darauf aufmerksam machen, dass du ohne die Zeilen 68-73 sterben würdest.



  • Gut ist logisch, aber wie bekomm ich den Warning weg?


  • Mod

    Hello World_unreg schrieb:

    Gut ist logisch, aber wie bekomm ich den Warning weg?

    Ersetz den ganzen Block durch:

    ok=sscanf(enter,"%c%d%c",&zeile,&spalte,&dummy);
    
        feld[zeile - 'A'][spalte - 1]='X';
    

    Und außerdem: Wozu ist dummy gut? Wozu ist enter gut? Warum prüfst du ok nicht?

    edit: Jaja, ganz genau genommen ist das nicht portabel, da 'B' und 'C' nicht auf 'A' folgen müssen. Dann kann man das Spiel eben nicht auf einem System mit EBCDIC-Zeichensatz spielen.



  • int als Arrayindex findet der Compiler besser.

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

    Zeichen (Buchstaben) passen auch in ein int. 🙂



  • SeppJ schrieb:

    Dann kann man das Spiel eben nicht auf einem System mit EBCDIC-Zeichensatz spielen.

    Warum nicht? Zumindest A-I sind fortlaufend bei EBCDIC.



  • Das heißt?



  • Hello World_unreg schrieb:

    Das heißt?

    Das der Code auch auf einem System mit EBCDIC laufen würde.



  • Ok das wäre nicht gut 😉
    Aber wie kann ich diesen Warning beheben .... da er führ mich logisch erscheint -.-'



  • Habe ich um 15:45:26 geschrieben.



  • 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 🙂


Anmelden zum Antworten