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);
}