Thread: Boolean Value cross-functional in Game TicTacToe

  1. #1
    Registered User
    Join Date
    Nov 2014
    Posts
    9

    Unhappy Boolean Value cross-functional in Game TicTacToe

    Hey everyone. I got a little question why something doesn't work without setting global variables.


    I want to know how to deliver values for example my boolean value "ende" (means end) from the function in line 99
    Code:
    bool pruefeGewinn()
    or in line 116
    Code:
    bool spielfeldVoll()
    to the main function for using it there for
    Code:
    } while (ende != true);
    in line 164. How to return it correctly?

    Thank you for helping me.

    Here is the Code of the game TicTacToe.

    Code:
    #include <stdio.h> // In- and Output
    #include <stdlib.h> // Implementation of many functions
    #include <stdbool.h> // Allows in C99 True and False as Boolean
    #include <time.h> // Allows using Random by time
    
    /*----------------------- Constants -------------------------*/
    
    #define KANTENLAENGE 3
    #define STRING 100
    
    const char leer = ' ';
    const char kreuz = 'X';
    const char kreis = 'O';
    
    /*-------------------- Global Variables --------------------*/
    
    char spielfeld[KANTENLAENGE][KANTENLAENGE] = {
        {},
        {}
    };
    
    int siege_kreis = 0; // Wins loop
    int siege_kreuz = 0; // Wins cross
    int zufall = 0;      // Random number
    
    /*------------------------ Functions ------------------------*/
    
    void starteSpiel() {
        printf("-----------------------------------------------------------------\n");
        printf("-------------------------- Tic Tac Toe --------------------------\n");
        printf("-----------------------------------------------------------------\n");
        printf("Willkommen bei dem Spiel. Es wird gestartet. \n");
        printf("Geben Sie die Koordinaten in dieser Form ein: Bsp. \"23\" = 2 und 3\n\n");
    }
    
    void leereSpielfeld() { // Clear the game of Os and Xs
        for (int i = 0; i < KANTENLAENGE; i++) {
            for (int j = 0; j < KANTENLAENGE; j++) {
                spielfeld[i][j] = leer;
            }
        }
    }
    
    void spielfeldAusgeben() { // Output for player to see the playing field
    
        printf("-----------------------------------------------------------------\n");
        printf("    ");
        for (int i = 0; i < KANTENLAENGE; i++) {
            int zahl_x;
            zahl_x = i + 1; // Arrays start with 0, now with 1
            printf("  %i", zahl_x);
        }
        printf("\n");
    
        for (int i = 0; i < KANTENLAENGE; i++) {
            int zahl_y;
            zahl_y = i + 1; //Arrays start with 0, now with 1
            printf("\n  %i  ", zahl_y);
            for (int j = 0; j < KANTENLAENGE; j++) {// Playing filed
                printf("<%c>", spielfeld[i][j]);
            }
        }
        printf("\n-----------------------------------------------------------------\n");
    
    }
    
    void naechsterZug() { // Next draw of O or X and proofing of field is free
    
        int ersteKoordinate;
        int zweiteKoordinate;
        char amZug;
        bool eingabeOK = true;
    
        if (zufall != 1) {
            zufall++;
            amZug = kreuz;
    
        } else {
            zufall--;
            amZug = kreis;
        }
        printf("Bitte Koordinaten fuer Spieler %c eingeben (Zeile Spalte): ", amZug);
        do {
            char eingabe[STRING];
            scanf("%s", &eingabe);
            int ascii = 48;
            ersteKoordinate = eingabe[0] - ascii;
            zweiteKoordinate = eingabe[1] - ascii;
            if (ersteKoordinate <= 0 || ersteKoordinate >= 4 || zweiteKoordinate <= 0 || zweiteKoordinate >= 4 || (!(spielfeld[ersteKoordinate - 1][zweiteKoordinate - 1] == ' '))) {
                eingabeOK = false;
                printf("\nFalsche Eingabe. Bitte erneut: ");
            } else {
                eingabeOK = true;
            }
        } while (eingabeOK != true);
        spielfeld[ersteKoordinate - 1][zweiteKoordinate - 1] = amZug;
    }
    
    bool pruefeGewinn() { // Check if X or O has won
        bool ende = false;
        if (((spielfeld[0][0] == kreuz) && (spielfeld[0][1] == kreuz) && (spielfeld[0][2] == kreuz)) || ((spielfeld[1][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[1][2] == kreuz)) || ((spielfeld[2][0] == kreuz) && (spielfeld[2][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][0] == kreuz) && (spielfeld[2][0] == kreuz)) || ((spielfeld[0][1] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][1] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][2] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][1] == kreuz)) && (spielfeld[2][0] == kreuz)) {
            printf("\nSpieler Kreuz hat gewonnen!\n");
            siege_kreuz++;
            zufall = true;
            return ende = true;
        } else {
            if (((spielfeld[0][0] == kreis) && (spielfeld[0][1] == kreis) && (spielfeld[0][2] == kreis)) || ((spielfeld[1][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[1][2] == kreis)) || ((spielfeld[2][0] == kreis) && (spielfeld[2][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][0] == kreis) && (spielfeld[2][0] == kreis)) || ((spielfeld[0][1] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][1] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][2] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][1] == kreis)) && (spielfeld[2][0] == kreis)) {
                printf("\nSpieler Kreis hat gewonnen!\n");
                siege_kreis++;
                zufall = false;
                return ende = true;
            }
        }
    }
    
    bool spielfeldVoll() { // Proofing if there is a place to put another X or O
        bool ende = false;
        int zaheler_unentschieden = 0;
        for (int i = 0; i < KANTENLAENGE; i++) {
            for (int j = 0; j < KANTENLAENGE; j++) {
    
                if (spielfeld[i][j] != leer) {
                    zaheler_unentschieden++;
                    if (zaheler_unentschieden >= 9) {
                        printf("\nUnentschieden!\n");
                        return ende = true;
                    }
                }
            }
        }
    }
    
    bool neustarten() { // Restart to play again
        bool neustart = true;
        int erneut;
        do {
            printf("\nErneut spielen? Ja = 1, Nein= 0: ");
            scanf("%i", &erneut);
        } while (!(erneut == 0 || erneut == 1));
    
        if (erneut == 0) {
            return neustart = false;
        }
    }
    
    int main(int argc, char** argv) { // Main function to call out functions
    
        bool neustart; // Restart
        bool ende; // End
    
        starteSpiel();
    
        srand(time(NULL));
        zufall = rand() % 2; // Random choose witch player starts
        do {
            leereSpielfeld();
            spielfeldAusgeben();
            do {
                naechsterZug();
                spielfeldAusgeben();
                pruefeGewinn();
                spielfeldVoll();
    
            } while (ende != true);
            neustarten(); // Restart
        } while (neustart != false);
    
        printf("\nKreuz hat %i Siege und Kreis hat %i Siege.\n\n", siege_kreuz, siege_kreis); // Numbers of wins
    
        return (EXIT_SUCCESS);
    }
    Last edited by Gooody; 12-11-2014 at 10:52 AM.

  2. #2
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,413
    It should be:
    Code:
    if (erneut == 0) {
        neustart = false;
    }
    return neustart;
    So the idea is that neustarts is initially true, then based on some condition, you set it to false. Either way, you return its value.
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  3. #3
    Registered User
    Join Date
    Nov 2014
    Posts
    9
    I fixed that and there is no warning or something but when i start and for example O wins, it doesn't work. So the programm says "win" but wants another input instead of ending the game.
    Do I need prototypes or something? The bool values work in these named two functions but they won't returned so i can't use them in main, i guess..

    Code:
    /*Code*/
    
    bool pruefeGewinn() { // Check if X or O has won
        bool ende = false;
        if (((spielfeld[0][0] == kreuz) && (spielfeld[0][1] == kreuz) && (spielfeld[0][2] == kreuz)) || ((spielfeld[1][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[1][2] == kreuz)) || ((spielfeld[2][0] == kreuz) && (spielfeld[2][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][0] == kreuz) && (spielfeld[2][0] == kreuz)) || ((spielfeld[0][1] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][1] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][2] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][1] == kreuz)) && (spielfeld[2][0] == kreuz)) {
            printf("\nSpieler Kreuz hat gewonnen!\n");
            siege_kreuz++;
            zufall = true;
            return ende = true;
        } else {
            if (((spielfeld[0][0] == kreis) && (spielfeld[0][1] == kreis) && (spielfeld[0][2] == kreis)) || ((spielfeld[1][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[1][2] == kreis)) || ((spielfeld[2][0] == kreis) && (spielfeld[2][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][0] == kreis) && (spielfeld[2][0] == kreis)) || ((spielfeld[0][1] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][1] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][2] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][1] == kreis)) && (spielfeld[2][0] == kreis)) {
                printf("\nSpieler Kreis hat gewonnen!\n");
                siege_kreis++;
                zufall = false;
                ende = true;
            }
        }
        return ende;
    }
    
    bool spielfeldVoll() { // Proofing if there is a place to put another X or O
        bool ende = false;
        int zaheler_unentschieden = 0;
        for (int i = 0; i < KANTENLAENGE; i++) {
            for (int j = 0; j < KANTENLAENGE; j++) {
    
                if (spielfeld[i][j] != leer) {
                    zaheler_unentschieden++;
                    if (zaheler_unentschieden >= 9) {
                        printf("\nUnentschieden!\n");
                        ende = true;
                    }
                }
            }
        }
        return ende;
    }
    
    bool neustarten() { // Restart to play again
        bool neustart = true;
        int erneut;
        do {
            printf("\nErneut spielen? Ja = 1, Nein= 0: ");
            scanf("%i", &erneut);
        } while (!(erneut == 0 || erneut == 1));
    
        if (erneut == 0) {
            neustart = false;
        }
        return neustart;
    }
    
    int main(int argc, char** argv) { // Main function to call out functions
    
        bool neustart; // Restart
        bool ende; // End
    
        starteSpiel();
    
        srand(time(NULL));
        zufall = rand() % 2; // Random choose witch player starts
        do {
            leereSpielfeld();
            spielfeldAusgeben();
            do {
                naechsterZug();
                spielfeldAusgeben();
                pruefeGewinn();
                spielfeldVoll();
    
            } while (ende == false);
            neustarten(); // Restart
        } while (neustart == true);
    
        printf("\nKreuz hat %i Siege und Kreis hat %i Siege.\n\n", siege_kreuz, siege_kreis); // Numbers of wins
    
        return (EXIT_SUCCESS);
    }
    Last edited by Gooody; 12-11-2014 at 12:04 PM.

  4. #4
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,909
    Try compiling at the maximum warning level (-Wall option for gcc, else consult your compiler docs):
    Code:
    $ make foo
    gcc -Wall -ggdb3 -pedantic -std=gnu99 -O0 -o foo foo.c -lm -lpthread -lrt
    foo.c:18:3: warning: ISO C forbids empty initializer braces [-Wpedantic]
       {},
       ^
    foo.c:19:3: warning: ISO C forbids empty initializer braces [-Wpedantic]
       {}
       ^
    foo.c: In function ‘naechsterZug’:
    foo.c:85:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[100]’ [-Wformat=]
         scanf("%s", &eingabe);
         ^
    foo.c: In function ‘pruefeGewinn’:
    foo.c:101:710: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
       if (((spielfeld[0][0] == kreuz) && (spielfeld[0][1] == kreuz) && (spielfeld[0][2] == kreuz)) || ((spielfeld[1][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[1][2] == kreuz)) || ((spielfeld[2][0] == kreuz) && (spielfeld[2][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][0] == kreuz) && (spielfeld[2][0] == kreuz)) || ((spielfeld[0][1] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][1] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][2] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][1] == kreuz)) && (spielfeld[2][0] == kreuz)) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ^
    foo.c:107:712: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
         if (((spielfeld[0][0] == kreis) && (spielfeld[0][1] == kreis) && (spielfeld[0][2] == kreis)) || ((spielfeld[1][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[1][2] == kreis)) || ((spielfeld[2][0] == kreis) && (spielfeld[2][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][0] == kreis) && (spielfeld[2][0] == kreis)) || ((spielfeld[0][1] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][1] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][2] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][1] == kreis)) && (spielfeld[2][0] == kreis)) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ^
    foo.c: In function ‘main’:
    foo.c:167:19: warning: ‘ende’ is used uninitialized in this function [-Wuninitialized]
         } while (ende == false);
                       ^
    foo.c:169:3: warning: ‘neustart’ is used uninitialized in this function [-Wuninitialized]
       } while (neustart == true);
       ^
    Lines 18,19: Either explicitly initialize the entire game board when you declare it, or drop the initialization brackets from the declaration and just use leereSpielfeld.
    Line 85: When using scanf with %s, you don't need an &. The name of an array without the [ ] is the address of the first element.
    Lines 101, 107: You may have issues with order of operations here. The warning implies that somewhere, you have a parenthesis out of place, or you mixed up || and &&. See below
    Line 167, 169: ende and neustart need values before you compare them. Check the return value from naechsterZug(), spielfeldAusgeben(), pruefeGewinn(), and spielfeldVoll() function calls in main to determine whether you should end the game, play again, etc. Set ende and neustart accordingly.

    I found your mistake on lines 101 and 107 by putting each nesting level on it's own line with different indentation. However, that's the tedious way. It would be better if you had functions that check a row, column or diagonal for a win, and used those in combination.
    Code:
    bool checkRowWin(int row, char symbol)
    {
        use a loop to check if specific row contains only specified symbol -- if so, return true, else false
    }
    // checkColumnWin and checkDiagonalWin will be similar
    bool checkAllWin(char symbol)
    {
        use loops to check all row, column wins
        check diagonal win
    }
    ...
    bool pruefeGewinn() {
        // this function becomes so simple!
        return checkAllWin(kreuz) || checkAllWin(kreis);
    }

  5. #5
    Registered User
    Join Date
    Nov 2014
    Posts
    9
    101 & 107 did i fixed, just set the round bracket at the end of these two lines and delete one at the far end. Your solution looks pretty nice and I will try it when the programm works. I also fixed the "&" in line 85 and the brackets at the beginning of the 2 dem. array.
    There is a little problem with understanding the return value. I tried many ways but it still wont work for me with the values of pruefeGewinn() and spielfeldVoll(). I have no idea how to include the returns of these in main and how they working. I thought if i have
    Code:
    bool test(){
        bool value = true;
        
        if(1 > 10){
            value = false;
        }
        return value;
    }
    
    int main(int argc, char** argv) {
        bool value;
        do{
            test();
            
        }while(value != false);   
    }
    it will work.
    Can you explain why this wouldn't work? Does I include the name of the value in the function like test(value) or something? Maybe you can correct it for me so I can understand.
    Thanks in advance!

  6. #6
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,909
    No, the variable called value in main() has nothing to do with the variable called value in test(). This is due to variable scope (read up in your textbook). You need to set value in main() based on what test() returns. You have a few options:
    Code:
    value = test();  // value is true if test is true, false if false
    value = !test();  // value is true if test is false, false if test is true
    if (test()) {
        value = true;  // or false, depending on what you want
    }

  7. #7
    Registered User
    Join Date
    Nov 2014
    Posts
    9
    THANK YOU!!! People on cprogramming are awesome!
    A funny thing to notice is that when i finished the programm three weeks ago, it was disaster and as a tapeworm.
    By the way the .exe shrinked from 181 KB to to now 62 KB with the same range of functions and definitly a better performance.
    On one of these days I will try anduril462s idea with the win function.

    Code:
    #include <stdio.h> // In- and Output
    #include <stdlib.h> // Implementation of many functions
    #include <stdbool.h> // Allows in C99 True and False as Boolean
    #include <time.h> // Allows using Random by time
    
    /*----------------------- Constants -------------------------*/
    
    #define KANTENLAENGE 3
    #define STRING 100
    
    const char leer = ' ';
    const char kreuz = 'X';
    const char kreis = 'O';
    
    /*-------------------- Global Variables --------------------*/
    
    char spielfeld[KANTENLAENGE][KANTENLAENGE];
    
    int siege_kreis = 0; // Wins loop
    int siege_kreuz = 0; // Wins cross
    
    /*------------------------ Functions ------------------------*/
    
    void starteSpiel() {
        printf("-----------------------------------------------------------------\n");
        printf("-------------------------- Tic Tac Toe --------------------------\n");
        printf("-----------------------------------------------------------------\n");
        printf("Willkommen bei dem Spiel. Es wird gestartet. \n");
        printf("Geben Sie die Koordinaten in dieser Form ein: Bsp. \"23\" = 2 und 3\n\n");
    }
    
    void leereSpielfeld() { // Clear the game of Os and Xs
        for (int i = 0; i < KANTENLAENGE; i++) {
            for (int j = 0; j < KANTENLAENGE; j++) {
                spielfeld[i][j] = leer;
            }
        }
    }
    
    void spielfeldAusgeben() { // Output for player to see the playing field
    
        printf("-----------------------------------------------------------------\n");
        printf("    ");
        for (int i = 0; i < KANTENLAENGE; i++) {
            int zahl_x;
            zahl_x = i + 1; // Arrays start with 0, now with 1
            printf("  %i", zahl_x);
        }
        printf("\n");
    
        for (int i = 0; i < KANTENLAENGE; i++) {
            int zahl_y;
            zahl_y = i + 1; //Arrays start with 0, now with 1
            printf("\n  %i  ", zahl_y);
            for (int j = 0; j < KANTENLAENGE; j++) {// Playing filed
                printf("<%c>", spielfeld[i][j]);
            }
        }
        printf("\n-----------------------------------------------------------------\n");
    
    }
    
    int naechsterZug(int zufall) { // Next draw of O or X and proofing of field is free
    
        int ersteKoordinate;
        int zweiteKoordinate;
        char amZug;
        bool eingabeOK = true;
    
        if (zufall != 1) {
            zufall++;
            amZug = kreuz;
    
        } else {
            zufall--;
            amZug = kreis;
        }
        printf("Bitte Koordinaten fuer Spieler %c eingeben (Zeile Spalte): ", amZug);
        do {
            char eingabe[STRING];
            scanf("%s", eingabe);
            int ascii = 48;
            ersteKoordinate = eingabe[0] - ascii;
            zweiteKoordinate = eingabe[1] - ascii;
            if (ersteKoordinate <= 0 || ersteKoordinate >= 4 || zweiteKoordinate <= 0 || zweiteKoordinate >= 4 || (!(spielfeld[ersteKoordinate - 1][zweiteKoordinate - 1] == ' '))) {
                eingabeOK = false;
                printf("\nFalsche Eingabe. Bitte erneut: ");
            } else {
                eingabeOK = true;
            }
        } while (eingabeOK != true);
        spielfeld[ersteKoordinate - 1][zweiteKoordinate - 1] = amZug;
        return zufall;
    }
    
    bool pruefeGewinn() { // Check if X or O has won
        int zufall;
        bool ende = false;
        if (((spielfeld[0][0] == kreuz) && (spielfeld[0][1] == kreuz) && (spielfeld[0][2] == kreuz)) || ((spielfeld[1][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[1][2] == kreuz)) || ((spielfeld[2][0] == kreuz) && (spielfeld[2][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][0] == kreuz) && (spielfeld[2][0] == kreuz)) || ((spielfeld[0][1] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][1] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][2] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][0] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][2] == kreuz)) || ((spielfeld[0][2] == kreuz) && (spielfeld[1][1] == kreuz) && (spielfeld[2][0] == kreuz))) {
            printf("\nSpieler Kreuz hat gewonnen!\n");
            siege_kreuz++;
            zufall = true;
            return ende = true;
        } else {
            if (((spielfeld[0][0] == kreis) && (spielfeld[0][1] == kreis) && (spielfeld[0][2] == kreis)) || ((spielfeld[1][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[1][2] == kreis)) || ((spielfeld[2][0] == kreis) && (spielfeld[2][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][0] == kreis) && (spielfeld[2][0] == kreis)) || ((spielfeld[0][1] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][1] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][2] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][0] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][2] == kreis)) || ((spielfeld[0][2] == kreis) && (spielfeld[1][1] == kreis) && (spielfeld[2][0] == kreis))) {
                printf("\nSpieler Kreis hat gewonnen!\n");
                siege_kreis++;
                zufall = false;
                ende = true;
            }
        }
        return ende;
    }
    
    bool spielfeldVoll() { // Proofing if there is a place to put another X or O
        bool ende = false;
        int zaheler_unentschieden = 0;
        for (int i = 0; i < KANTENLAENGE; i++) {
            for (int j = 0; j < KANTENLAENGE; j++) {
    
                if (spielfeld[i][j] != leer) {
                    zaheler_unentschieden++;
                    if (zaheler_unentschieden >= 9) {
                        printf("\nUnentschieden!\n");
                        ende = true;
                    }
                }
            }
        }
        return ende;
    }
    
    bool neustarten() { // Restart to play again
        bool neustart = true;
        int erneut;
        do {
            printf("\nErneut spielen? Ja = 1, Nein= 0: ");
            scanf("%i", &erneut);
        } while (!(erneut == 0 || erneut == 1));
    
        if (erneut == 0) {
            neustart = false;
        }
        return neustart;
    }
    
    int main(int argc, char** argv) { // Main function to call out functions
    
        starteSpiel();
    
        srand(time(NULL));
        int zufall;
        zufall = rand() % 2; // Random choose witch player starts
        bool neustart;
        do {
            leereSpielfeld();
            spielfeldAusgeben();
            bool ende;
            do {
                zufall = naechsterZug(zufall);
                spielfeldAusgeben();
                ende = pruefeGewinn();
                if(ende == false){
                    ende = spielfeldVoll();
                }
            } while (ende != true);
            neustart = neustarten(); // Restart
        } while (neustart != false);
    
        printf("\nKreuz hat %i Siege und Kreis hat %i Siege.\n\n", siege_kreuz, siege_kreis); // Numbers of wins
    
        return (EXIT_SUCCESS);
    }

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Need help with tictactoe game(C)
    By devildog561 in forum Game Programming
    Replies: 2
    Last Post: 03-10-2012, 06:46 PM
  2. Need help with tictactoe game
    By devildog561 in forum C Programming
    Replies: 1
    Last Post: 03-10-2012, 06:36 PM
  3. i need this for my tictactoe game. pls help.
    By riel in forum C Programming
    Replies: 1
    Last Post: 01-20-2008, 01:31 AM
  4. Help Wit TicTacToe Game
    By WackoWolf in forum C Programming
    Replies: 5
    Last Post: 11-17-2005, 12:20 PM
  5. Functional programming languages... r they really functional?
    By code_mutant in forum C++ Programming
    Replies: 10
    Last Post: 02-25-2004, 05:29 AM

Tags for this Thread