|
@ -8,25 +8,25 @@ void printBoard(); |
|
|
|
|
|
|
|
|
struct ticTacToe GAME; |
|
|
struct ticTacToe GAME; |
|
|
|
|
|
|
|
|
struct command COMMANDS[MAX_COMMANDS] = { |
|
|
|
|
|
|
|
|
struct usrCommand COMMANDS[MAX_COMMANDS] = { |
|
|
{ 1, "\"start menu\" - startet das menu", startMenu}, |
|
|
{ 1, "\"start menu\" - startet das menu", startMenu}, |
|
|
{ 2, "\"start game\" - startet das spiel", startGame} |
|
|
{ 2, "\"start game\" - startet das spiel", startGame} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
void startTicTacToe(){ |
|
|
void startTicTacToe(){ |
|
|
setbuf(stdout, 0); |
|
|
|
|
|
|
|
|
setbuf(stdout, 0); // for debug output |
|
|
printf( "%s\n", getWelcomeMessageTicTacToe() ); |
|
|
printf( "%s\n", getWelcomeMessageTicTacToe() ); |
|
|
printf( "%s\n\n", getRulesMessageTicTacToe() ); |
|
|
printf( "%s\n\n", getRulesMessageTicTacToe() ); |
|
|
|
|
|
|
|
|
GAME = createTicTacToe(); |
|
|
|
|
|
|
|
|
GAME = createTicTacToe(); // create the "game object" |
|
|
|
|
|
|
|
|
while( GAME.currentState != -1 ){ |
|
|
while( GAME.currentState != -1 ){ |
|
|
commandFunction command; |
|
|
|
|
|
printf("search command!\n"); |
|
|
|
|
|
command = getCommandById( GAME.currentState + 1); |
|
|
|
|
|
|
|
|
commandFunction usrCommand; |
|
|
|
|
|
//printf("search command!\n"); |
|
|
|
|
|
usrCommand = getCommandById( GAME.currentState + 1); |
|
|
|
|
|
|
|
|
if( command != NULL) |
|
|
|
|
|
command(0); |
|
|
|
|
|
|
|
|
if( usrCommand != NULL) |
|
|
|
|
|
usrCommand(0); // 0, for non test behavior |
|
|
else{ |
|
|
else{ |
|
|
printf("command not found"); |
|
|
printf("command not found"); |
|
|
return; |
|
|
return; |
|
@ -64,11 +64,11 @@ int handleCommand( char* input ){ |
|
|
|
|
|
|
|
|
commandFunction getCommandById( int id ){ |
|
|
commandFunction getCommandById( int id ){ |
|
|
commandFunction result = NULL; |
|
|
commandFunction result = NULL; |
|
|
size_t arraySize = sizeof(COMMANDS) / sizeof(COMMANDS[0]); |
|
|
|
|
|
|
|
|
size_t arraySize = sizeof(COMMANDS) / sizeof(COMMANDS[0]); // calculate size of Array |
|
|
for (size_t i = 0; i < arraySize; i++) { |
|
|
for (size_t i = 0; i < arraySize; i++) { |
|
|
//printf( "%s", COMMANDS[i].description ); |
|
|
//printf( "%s", COMMANDS[i].description ); |
|
|
if( COMMANDS[i].id == id ){ |
|
|
if( COMMANDS[i].id == id ){ |
|
|
result = COMMANDS[i].fun; |
|
|
|
|
|
|
|
|
result = COMMANDS[i].fun; // save the function pointer as result |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -80,22 +80,26 @@ char* getUserInput(){ |
|
|
printf( ":" ); |
|
|
printf( ":" ); |
|
|
fgets(userInput, sizeof(userInput), stdin); |
|
|
fgets(userInput, sizeof(userInput), stdin); |
|
|
|
|
|
|
|
|
size_t len = strlen(userInput); |
|
|
|
|
|
if (len > 0 && userInput[len - 1] == '\n') { |
|
|
|
|
|
userInput[len - 1] = '\0'; |
|
|
|
|
|
|
|
|
size_t lengthOfInput = strlen(userInput); |
|
|
|
|
|
if (lengthOfInput > 0 && userInput[lengthOfInput - 1] == '\n') { |
|
|
|
|
|
userInput[lengthOfInput - 1] = '\0'; // declare end of command |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return userInput; |
|
|
return userInput; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void initializeBoard( bool board[BORAD_SIZE][BORAD_SIZE] ){ |
|
|
void initializeBoard( bool board[BORAD_SIZE][BORAD_SIZE] ){ |
|
|
for (int i = 0; i < 3; ++i) { |
|
|
|
|
|
for (int j = 0; j < 3; ++j) { |
|
|
|
|
|
board[i][j] = 0; |
|
|
|
|
|
|
|
|
for (int line = 0; line < 3; ++line) { |
|
|
|
|
|
for (int column = 0; column < 3; ++column) { |
|
|
|
|
|
board[line][column] = 0; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* The function checks if the user has written a valid command |
|
|
|
|
|
* @param input |
|
|
|
|
|
* @return 1 for a valid command and 0 for an invalid one. |
|
|
|
|
|
*/ |
|
|
int handleGameInput( char* input ){ |
|
|
int handleGameInput( char* input ){ |
|
|
if( strstr(input, "set") != NULL ){ |
|
|
if( strstr(input, "set") != NULL ){ |
|
|
return 1; |
|
|
return 1; |
|
@ -105,7 +109,7 @@ int handleGameInput( char* input ){ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int startMenu( int code ){ |
|
|
int startMenu( int code ){ |
|
|
if( code == -1 ){ // command test |
|
|
|
|
|
|
|
|
if( code == -1 ){ // usrCommand test |
|
|
return 1; |
|
|
return 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -125,15 +129,16 @@ int startMenu( int code ){ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void printBoard(){ |
|
|
void printBoard(){ |
|
|
|
|
|
// calculate the size of the board and print the upper frame |
|
|
for( int i = 0; i < BORAD_SIZE*4+1; i++ ){ |
|
|
for( int i = 0; i < BORAD_SIZE*4+1; i++ ){ |
|
|
printf("-"); |
|
|
printf("-"); |
|
|
} |
|
|
} |
|
|
printf("\n"); |
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; ++i) { |
|
|
|
|
|
|
|
|
for (int line = 0; line < 3; ++line) { |
|
|
printf("| "); |
|
|
printf("| "); |
|
|
for (int j = 0; j < 3; ++j) { |
|
|
|
|
|
if( GAME.board[i][j] == true ) |
|
|
|
|
|
|
|
|
for (int column = 0; column < 3; ++column) { |
|
|
|
|
|
if( GAME.board[line][column] == true ) |
|
|
printf( "X" ); |
|
|
printf( "X" ); |
|
|
else |
|
|
else |
|
|
printf ( " " ); |
|
|
printf ( " " ); |
|
@ -143,12 +148,18 @@ void printBoard(){ |
|
|
printf( "\n" ); |
|
|
printf( "\n" ); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// calculate the size of the board and print the upper frame |
|
|
for( int i = 0; i < BORAD_SIZE*4+1; i++ ){ |
|
|
for( int i = 0; i < BORAD_SIZE*4+1; i++ ){ |
|
|
printf("-"); |
|
|
printf("-"); |
|
|
} |
|
|
} |
|
|
printf("\n"); |
|
|
printf("\n"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Get a the user input and parse it. |
|
|
|
|
|
* @param input |
|
|
|
|
|
* @return a array with the x and y direction where the user wants to set the marker. |
|
|
|
|
|
*/ |
|
|
int* getMarkerParameters( char* input ){ |
|
|
int* getMarkerParameters( char* input ){ |
|
|
int* array = (int*)malloc(2 * sizeof(int)); |
|
|
int* array = (int*)malloc(2 * sizeof(int)); |
|
|
|
|
|
|
|
@ -156,8 +167,8 @@ int* getMarkerParameters( char* input ){ |
|
|
int firstArgument = input[index-1] - '0'; |
|
|
int firstArgument = input[index-1] - '0'; |
|
|
int secondArgument = input[index+1] - '0'; |
|
|
int secondArgument = input[index+1] - '0'; |
|
|
|
|
|
|
|
|
array[0] = firstArgument-1; |
|
|
|
|
|
array[1] = secondArgument-1; |
|
|
|
|
|
|
|
|
array[0] = firstArgument-1; // return x |
|
|
|
|
|
array[1] = secondArgument-1; // return y |
|
|
|
|
|
|
|
|
return array; |
|
|
return array; |
|
|
} |
|
|
} |
|
@ -186,9 +197,9 @@ void handleGame(){ |
|
|
|
|
|
|
|
|
// gameCommand processing |
|
|
// gameCommand processing |
|
|
if( gameCommand == 1 ) { // set marker in field |
|
|
if( gameCommand == 1 ) { // set marker in field |
|
|
int* params = getMarkerParameters( input ); |
|
|
|
|
|
setBoardMarker( GAME.board, params ); |
|
|
|
|
|
free(params); |
|
|
|
|
|
|
|
|
int* params = getMarkerParameters( input ); // get the x and y values |
|
|
|
|
|
setBoardMarker( GAME.board, params ); // apply the x and y values in the field |
|
|
|
|
|
free(params); // prent memory leakage |
|
|
|
|
|
|
|
|
printBoard(); |
|
|
printBoard(); |
|
|
|
|
|
|
|
@ -202,17 +213,16 @@ void handleGame(){ |
|
|
|
|
|
|
|
|
bool playerHasWon( bool board[BORAD_SIZE][BORAD_SIZE]){ |
|
|
bool playerHasWon( bool board[BORAD_SIZE][BORAD_SIZE]){ |
|
|
bool player = 1; |
|
|
bool player = 1; |
|
|
// Überprüfe Zeilen und Spalten |
|
|
|
|
|
for (int i = 0; i < 3; i++) { |
|
|
for (int i = 0; i < 3; i++) { |
|
|
// Überprüfe Zeilen |
|
|
|
|
|
|
|
|
// check the rows |
|
|
if ((board[i][0] == player && board[i][1] == player && board[i][2] == player) || |
|
|
if ((board[i][0] == player && board[i][1] == player && board[i][2] == player) || |
|
|
// Überprüfe Spalten |
|
|
|
|
|
|
|
|
// check the columns |
|
|
(board[0][i] == player && board[1][i] == player && board[2][i] == player)) { |
|
|
(board[0][i] == player && board[1][i] == player && board[2][i] == player)) { |
|
|
return true; // Spieler hat gewonnen |
|
|
return true; // Spieler hat gewonnen |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Überprüfe Diagonalen |
|
|
|
|
|
|
|
|
// check the diagonal line |
|
|
if ((board[0][0] == player && board[1][1] == player && board[2][2] == player) || |
|
|
if ((board[0][0] == player && board[1][1] == player && board[2][2] == player) || |
|
|
(board[0][2] == player && board[1][1] == player && board[2][0] == player)) { |
|
|
(board[0][2] == player && board[1][1] == player && board[2][0] == player)) { |
|
|
return true; // Spieler hat gewonnen |
|
|
return true; // Spieler hat gewonnen |
|
@ -222,7 +232,7 @@ bool playerHasWon( bool board[BORAD_SIZE][BORAD_SIZE]){ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int startGame( int code ){ |
|
|
int startGame( int code ){ |
|
|
if( code == -1 ){ // command test |
|
|
|
|
|
|
|
|
if( code == -1 ){ // usrCommand test |
|
|
return 1; |
|
|
return 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|