#include <stdio.h> #include <stdlib.h> // malloc #include <time.h> // srand #include <unistd.h> // optarg char **create_board(int board_sz); void print_board(char **Board, int board_sz); int is_draw(char **Board, int board_sz); char winning_move(char **Board, int board_sz, int row_index, int col_index); // Prints the Board void print_board(char **Board, int board_sz) { printf(" "); for (int i = 0; i < board_sz; i++) { printf("|%d", i); } printf("|\n"); for (int i = 0; i < board_sz; i++) { printf("%c", 'a' + i); for (int j = 0; j < board_sz; j++) { printf("|%c", Board[i][j]); } printf("|\n"); } } // Creates nxn tic tac toe Board char **create_board(int board_sz) { char **Board = (char **)malloc(board_sz * sizeof(char *)); for (int i = 0; i < board_sz; i++) { Board[i] = (char *)malloc(board_sz * sizeof(char)); } for (int i = 0; i < board_sz; i++) { for (int j = 0; j < board_sz; j++) { Board[i][j] = ' '; } } return Board; } // Returns true if the game is a draw int is_draw(char **Board, int board_sz) { for (int i = 0; i < board_sz; i++) { for (int j = 0; j < board_sz; j++) { if (Board[i][j] == ' ') { // empty square, so game ain't over yet return 0; } } } // no empty squares, so it's a draw return 1; } // Returns 'X' if (i,j) was a winning move for X // Returns 'O' if (i,j) was a winning move for O // Returns ASCII value 0 otherwise char winning_move(char **Board, int board_sz, int row_index, int col_index) { int win = 1; // check row for (int k = 0; k < board_sz; k++) { if (Board[row_index][k] != Board[row_index][col_index]) { win = 0; break; } } if (win) // means Board[i][k] == Board[i][j] { return Board[row_index][col_index]; } // check column win = 1; for (int k = 0; k < board_sz; k++) { if (Board[k][col_index] != Board[row_index][col_index]) { win = 0; break; } } if (win) { return Board[row_index][col_index]; } // check forward diagonal win = 1; for (int k = 0; k < board_sz; k++) { if (Board[k][k] != Board[row_index][col_index]) { win = 0; break; } } if (win) { return Board[row_index][col_index]; } // check reverse diagonal win = 1; for (int k = 0; k < board_sz; k++) { if (Board[k][board_sz - k - 1] != Board[row_index][col_index]) { win = 0; break; } } if (win) { return Board[row_index][col_index]; } // got nothing return 0; } // -------------------------getMove ------------------------------- int getMove( char ** Board, int board_sz, char *x, char *y ){ Board = create_board(board_sz); char winner = '\0'; char row = *x; char col = *y; char turn = 'X'; char ch; int computer_enabled = 0; if (turn == 'X' || !computer_enabled) { printf("computer 'O' Moves are 'enabled'\n"); printf("-Player's %c turn (qq to quit)\n\n", turn); // suggestion do { row = rand() % board_sz + 'a'; // col = rand() % board_sz + '0'; } while (Board[row - 'a'][col - '1'] != ' '); printf("*---> suggestion:\t(%c %c)\n\n", row, col); printf("(X) Enter Move (row column) ---------------------------> "); fflush(stdout); scanf(" %c %c", &row, &col); // quit when enter qq. if (ro.