Tic - Tak -Toe



  • zu Rand:
    *rand Funktion
    rand will generate a random number between 0 and 'RAND_MAX' (at least 32767).

    Library: stdlib.h

    Prototype: int rand(void);

    Syntax: int r; /* Random number */

    r = rand();
    *

    hast du den gebrauchten HEader eingebunden ?



  • im code fehlen schliessende geschweifte klammern, IMHO.



  • und nimm die "int"'s vor den funktuionsaufrufen weg 😉

    der compiler monniert die nicht, weil er sie als funktionsprototypen interpretiert.



  • Gut, ich habe den quellcode soweit verbessert. Aber da sind weiterhin paar fehler drin, die ich nicht ausbügel konnt, da ich nicht weiß was gemeint ist. Kann ich jetzt eigentlich math.h und stdlib.h rauslassen (-ich dachte die bräuchte man für rand()!).

    #include <stdio.h>
    #include <time.h> // für rand(time(null))
    #include <math.h> 
    #include <stdlib.h>  // für rand
    
    int KI(float xodero) {
    char feld[9];
    float i;
    i=rand()%10;
    feld[i];
    
    if (xodero%2) {
     feld[i]='X';
    }
    
    else {
     feld[i]='O';
    }
    
    xodero++;
    return xodero;
    
    }   // schließt KI
    
    int zeigezug(extern char feld[]) {
    
      printf("     A  | B  | C  |");  
      printf("   +----+----+----+");
      printf(" 1 | %f | %f | %f |",feld[0],feld[1],feld[2]);
      printf("   +----+----+----+");
      printf(" 2 | %f | %f | %f |",feld[3],feld[4],feld[5]);
      printf("   +----+----+----+");
      printf(" 3 | %f | %f | %f |",feld[6],feld[7],feld[8]);
      printf("   +----+----+----+\n");
    
    // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK GEBEN.
    
    }
    
    int human() {
    printf ("Humannnnnn");
    }
    
    int main() {
     int x,wahl;
     printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI");
     scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher?
                        // "pointer" haben mich durcheinander gebracht :D
    
      switch(wahl) {
         case 1:
            int human();
            int zeigezug();
            x--;
         break; 
    
         case 2:
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
          break;
    
         case 3:
           int KI();
           int zeigezug();
         break;
    
    default:
         printf ("ungültige option");
    }
    
    return 1;
    }
    
    spiel.c: In function `int KI(float)':
    1. spiel.c:11: error: invalid types `char[9][float]' for array subscript
    2. spiel.c:13: error: invalid operands of types `float' and `int' to binary `
       operator%'
    3. spiel.c:14: error: invalid types `char[9][float]' for array subscript
    4. spiel.c:18: error: invalid types `char[9][float]' for array subscript
    5. spiel.c:22: warning: converting to `int' from `float'
    6. spiel.c: At global scope:
    7. spiel.c:26: error: storage class specifiers invalid in parameter declarations
    8. spiel.c:26: error: storage class specified for parameter `feld'
    9. spiel.c:91:2: warning: no newline at end of file
    


  • Wieso verwendest du dort überhaupt float? float sind Gleitkommazahlen und die brauchst du für eine einfache Zählvariable bestimmt nicht.
    -> ändere die Funktion mal so, daß sie int verwendet.

    Zweitens: Im Hauptprogramm mußt du die Funktionen AUFRUFEN, nicht neu deklarieren.

    PS: stdlib.h brauchst du, math.h nicht (dort stehen Sachen wie Sinus oder Potenzen drin).



  • Gut. float habe ich in int geändert.

    Jetzt habe ich nur 2 Fehler 😮 :

    spiel.c:26: error: storage class specifiers invalid in parameter declarations
    spiel.c:26: error: storage class specified for parameter `feld'
    

    wenn ich ehrlich bin verste ich von dem ganzen da oben nur class, error, in und for 😃

    Wenn ich aber bei den funktionen das int wegmachen, kommen tausende Fehler!(deßhalb lasse ich sie lieber ;))... das geleiche passiert auch nur, wenn ich sie im mainteil wegmachen.

    spiel.c:7: error: ISO C++ forbids declaration of KI' with no type spiel.c: In functionint KI(float)':
    spiel.c:11: error: invalid types char[9][float]' for array subscript spiel.c:13: error: invalid operands of types \float' and `int' to binary operator%' spiel.c:14: error: invalid typeschar[9][float]' for array subscript
    spiel.c:18: error: invalid types char[9][float]' for array subscript spiel.c:22: warning: converting to \int' from `float'
    spiel.c: At global scope:
    spiel.c:26: error: ISO C++ forbids declaration of zeigezug' with no type spiel.c:26: error: storage class specifiers invalid in parameter declarations spiel.c:26: error: storage class specified for parameterfeld'
    spiel.c:41: error: ISO C++ forbids declaration of human' with no type spiel.c: In functionint main()':
    spiel.c:26: error: too few arguments to function int zeigezug(char*)' spiel.c:55: error: at this point in file spiel.c:26: error: too few arguments to functionint zeigezug(char*)'
    spiel.c:62: error: at this point in file
    spiel.c:7: error: too few arguments to function int KI(float)' spiel.c:63: error: at this point in file spiel.c:26: error: too few arguments to functionint zeigezug(char*)'
    spiel.c:64: error: at this point in file
    spiel.c:26: error: too few arguments to function int zeigezug(char*)' spiel.c:66: error: at this point in file spiel.c:7: error: too few arguments to functionint KI(float)'
    spiel.c:67: error: at this point in file
    spiel.c:26: error: too few arguments to function int zeigezug(char*)' spiel.c:68: error: at this point in file spiel.c:26: error: too few arguments to functionint zeigezug(char*)'
    spiel.c:70: error: at this point in file
    spiel.c:7: error: too few arguments to function int KI(float)' spiel.c:71: error: at this point in file spiel.c:26: error: too few arguments to functionint zeigezug(char*)'
    spiel.c:72: error: at this point in file
    spiel.c:26: error: too few arguments to function int zeigezug(char*)' spiel.c:74: error: at this point in file spiel.c:7: error: too few arguments to functionint KI(float)'
    spiel.c:75: error: at this point in file
    spiel.c:26: error: too few arguments to function int zeigezug(char*)' spiel.c:76: error: at this point in file spiel.c:26: error: too few arguments to functionint zeigezug(char*)'
    spiel.c:78: error: at this point in file
    spiel.c:7: error: too few arguments to function int KI(float)' spiel.c:82: error: at this point in file spiel.c:26: error: too few arguments to functionint zeigezug(char*)'
    spiel.c:83: error: at this point in file
    spiel.c:91:2: warning: no newline at end of file

    #include <stdio.h>
    #include <time.h> // für rand(time(null))
    #include <stdlib.h>  // für rand
    
    int KI(int xodero) {
    char feld[9];
    int i;
    i=rand()%10;
    feld[i];
    
    if (xodero%2) {
     feld[i]='X';
    }
    
    else {
     feld[i]='O';
    }
    
    xodero++;
    return xodero;
    
    }   // schließt KI
    
    int zeigezug(extern char feld[]) {
    
      printf("     A  | B  | C  |");  
      printf("   +----+----+----+");
      printf(" 1 | %f | %f | %f |",feld[0],feld[1],feld[2]);
      printf("   +----+----+----+");
      printf(" 2 | %f | %f | %f |",feld[3],feld[4],feld[5]);
      printf("   +----+----+----+");
      printf(" 3 | %f | %f | %f |",feld[6],feld[7],feld[8]);
      printf("   +----+----+----+\n");
    
    // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK GEBEN.
    
    }
    
    int human() {
    printf ("Humannnnnn");
    }
    
    int main() {
     int x,wahl;
     printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI");
     scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher?
                        // "pointer" haben mich durcheinander gebracht :D
    
      switch(wahl) {
         case 1:
            int human();
            int zeigezug();
            x--;
         break;
    
         case 2:
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
            int KI();
            int zeigezug();
            int human();
            int zeigezug();
          break;
    
         case 3:
           int KI();
           int zeigezug();
         break;
    
    default:
         printf ("ungültige option");
    }
    
    return 1;
    }
    


  • Erstens: Ein Parameter kann nicht "extern" sein (betrifft den Prototyp von zeigezug).

    Zweitens: Such dir ein gutes Buch über C und mach dir klar, wie eine Funktion aufgerufen werden muß (insbesondere muß man an die Funktion auch Parameter übergeben).



  • ach ja, das habe ich ganz vergessen ... ich habe jetzt in jede funktion feld[i] geschrieben, da jede funktion feld[i] braucht und zurückgeben muss. human() soll später auch den wert feld[i] zurückgeben, das mache ich aber erst, wenn der rest ok ist.

    #include <stdio.h>
    #include <time.h> // für rand(time(null))
    #include <stdlib.h>  // für rand
    
    int KI(char feld[9]) {
    int i;
    i=rand()%10;
    feld[i];
    
    if (xodero%2) {
     feld[i]='X';
    }
    
    else {
     feld[i]='O';
    }
    
    xodero++;
    return feld[i];
    
    }   // schließt KI
    
    int zeigezug(extern char feld[9]) {
    
      printf("     A  | B  | C  |");  
      printf("   +----+----+----+");
      printf(" 1 | %f | %f | %f |",feld[0],feld[1],feld[2]);
      printf("   +----+----+----+");
      printf(" 2 | %f | %f | %f |",feld[3],feld[4],feld[5]);
      printf("   +----+----+----+");
      printf(" 3 | %f | %f | %f |",feld[6],feld[7],feld[8]);
      printf("   +----+----+----+\n");
    
    // === HIER MUSS GEGUCKT WERDEN OB ALLE FELDER VOLL SIND, WENN JA SOLL BOOL EIN FALSH WERT AN DIE SCHLEIFE ZURÜCK GEBEN.
    
    }
    
    int human() {
    printf ("Humannnnnn");
    }
    
    int main() {
     int x,wahl;
     printf ("Gegen wen wollen Sie Spielen?:\n 1. Human vs. Human\n 2. Human vs. KI\n 3. KI vs. KI");
     scanf ("%f",&wahl); // ist das & richtig, oder zeigt es jetzt auf ein Speicher?
                        // "pointer" haben mich durcheinander gebracht :D
    
      switch(wahl) {
         case 1:
            int human(feld[i]);
            int zeigezug(feld[i]);
            x--;
         break;
    
         case 2:
            int human(feld[i]);
            int zeigezug(feld[i]);
            int KI(feld[i]);
            int zeigezug(feld[i]);
            int human(feld[i]);
            int zeigezug(feld[i]);
            int KI(feld[i]);
            int zeigezug(feld[i]);
            int human(feld[i]);
            int zeigezug(feld[i]);
            int KI(feld[i]);
            int zeigezug(feld[i]);
            int human(feld[i]);
            int zeigezug(feld[i]);
            int KI(feld[i]);
            int zeigezug(feld[i]);
            int human(feld[i]);
            int zeigezug(feld[i]);
          break;
    
         case 3:
           int KI(feld[i]);
           int zeigezug(feld[i]);
         break;
    
    default:
         printf ("ungültige option");
    }
    
    return 1;
    }
    


  • oh, ich habe große scheiße geschrieben. Ich werde mich morgen nochmal melden 😞



  • http://www.pronix.de/pronix-4.html
    das liest du jetzt von vorne bis hinten.

    und wenn du dir persoenlich einen gefallen tun willst, schreibst du dein programm neu.



  • Also, ich werde das ganz bestimmt kein 3 mal lesen. Ausserdem habe ich noch das buch "C - Programmieren von anfang an "gelesen. Kannst du/ihr mir nicht villeicht genauere Anweißungen geben? So in der art als würdet ihr mich beauftragen? Um so mehr fest ist umso weniger kann ich falsch machen. Das wäre echt super nett.



  • du willst lernen, oder?
    also kommst du an einem mindestmass an aufwand nicht vorbei.
    dazu gehoert auch, seine programme zu verstehen. besonders deine funktionsaufrufe sind falsch. CStoll hat dir mehrmals gesagt, was du falsch machst. ueberlies ihn doch bitte nicht so beharrlich.



  • Er hat z.B. geschrieben:

    Zweitens: Im Hauptprogramm mußt du die Funktionen AUFRUFEN, nicht neu deklarieren.

    Ich verstehe, dass ich die int´s vor den funktionen in dem main-teil weglassen soll, aber wenn ich das tue (ich habe das ja auch ohne int gelernt), kommen plotzlich 100 fehler mehr. Daraus kann man wohl schließen, dass die ints da stehen müssen, warum soll ich die dan wegmachen?
    mein verstand sagt mir auch, dass ich funktion(); schreiben muss und nicht int funktion(), aber mein compiler (gcc) meckert ....



  • noname34 schrieb:

    Er hat z.B. geschrieben:

    Zweitens: Im Hauptprogramm mußt du die Funktionen AUFRUFEN, nicht neu deklarieren.

    Ich verstehe, dass ich die int´s vor den funktionen in dem main-teil weglassen soll, aber wenn ich das tue (ich habe das ja auch ohne int gelernt), kommen plotzlich 100 fehler mehr. Daraus kann man wohl schließen, dass die ints da stehen müssen, warum soll ich die dan wegmachen?
    mein verstand sagt mir auch, dass ich funktion(); schreiben muss und nicht int funktion(), aber mein compiler (gcc) meckert ....

    falsch.
    daraus schliesst man, dass man 100 fehler gemacht hat.
    es heisst funktion(); ohne typ davor, wenn du funktion() aufrufen willst.
    dein gcc meckert wegen etwas anderem: zu strikte compilerflags, MEHR fehler im programm, kosmische strahlung,...



  • Danke erstmal, dass du mir geantwortet hast (ich weiß, dass es manchmal so wirkt als würde ich es nicht ernst meinen).

    dein gcc meckert wegen etwas anderem: zu strikte compilerflags, MEHR fehler im programm, kosmische strahlung,...

    Ich habe 0 ahnung was ich falsch machen. Parameter habe ich doch angegeben.

    Kannst du/ihr mir nicht villeicht genauere Anweißungen geben? So in der art als würdet ihr mich beauftragen? Um so mehr fest ist umso weniger kann ich falsch machen. Das wäre echt super nett.

    + + + + + + + + + + + + +

    und wenn du dir persoenlich einen gefallen tun willst, schreibst du dein programm neu.

    ??????
    ?????



  • *push*



  • also zu erst machst du funktionsaufrufe ohne typ davor. was an fehlern uebrig bleibt, arbeitest du fehler fuer fehler ab und probierst nach jedem fehler zu kompilieren.

    mit einer kompletten neufassung wuerdest du dir selbst aber einen gefallen tun. aber schreib dann nicht einfach das programm runter und hoffe dass es kompiliert. schreibe ein stueck und teste, ob es noch wie erwartet funktioniert. dann nochmal was hinzufuegen, nochmal testen, usw...



  • *push*



  • was willst du noch, verdammt?!?



  • Ich will doch nur eine GENAUE AUFGABENSTELLUNG. Ist das den so schwer?


Anmelden zum Antworten