#include int check_board(char[][]); void check_winner(int); int check_badmove(char[][], int, int); char switch_curr_player(char); void draw_board(char[][]); main() { /* declare all main variables */ char board[3][3]; int i,j, done, rc, movedone; int nummoves; int xmove, ymove; char curr_player; int computer; /* initialize board to the character '_' */ for(i=0; i<3; i++) { for (j=0; j<3; j++) { board[i][j] = '_'; } } /* seed the random number generator */ srand(time(NULL)); printf("0 - player versus player\n"); printf("1 - player versus computer\n"); printf("Please enter game mode (0 or 1): "); scanf("%d", &computer); if (computer < 0 || computer > 1) { printf("you must choose either mode 0 or 1\n"); exit(1); } /* call the draw_board function to draw the playing board */ draw_board(board); /* initialize loop variables */ nummoves = 0; done = 0; curr_player = 'X'; /* outer loop, goes until sombody wins or there is a draw */ while(!done) { /* inner loop: ask cuur player to make a move, if invalid move is made, ask again */ movedone = 0; while(!movedone) { xmove = ymove = -1; if (computer && curr_player == 'O') { while(check_badmove(board, xmove, ymove)) { xmove = rand()%3; ymove = rand()%3; } } else { printf("player %c: enter a move in x,y coordinates (x,y): ", curr_player); scanf("%d,%d", &xmove, &ymove); } /* check if inputted move is valid */ if (check_badmove(board, xmove, ymove)) { printf("player %c: Illegal move, try again!\n", curr_player); } else { /* fill in the board with curr_player's symbol */ board[xmove][ymove] = curr_player; nummoves++; movedone++; printf("Player %c plays at (%d,%d)\n", curr_player, xmove, ymove); } draw_board(board); } /* check to see if the last move found a winner! */ rc = check_board(board); if (rc) { check_winner(rc); done++; } if (nummoves == 9) { printf("Draw!\n"); done++; } /* switch to whomever makes the next move */ curr_player = switch_curr_player(curr_player); } } char switch_curr_player(char curr) { if (curr == 'X') { return('O'); } return('X'); } int check_badmove(char inboard[3][3], int xmove, int ymove) { int rc; rc = 0; if (inboard[xmove][ymove] != '_') { rc = 1; } else if (xmove > 2 || xmove < 0) { rc = 1; } else if (ymove > 2 || ymove < 0) { rc = 1; } return(rc); } void check_winner(int winner) { switch(winner) { case 1: printf("X wins!\n"); break; case 2: printf("O wins!\n"); break; default: printf("no winner yet\n"); break; } } int check_board(char inboard[3][3]) { int i, diagidx; int rc; int xdiaga, xdiagb, odiaga, odiagb; xdiaga = xdiagb = odiaga = odiagb = 1; diagidx = 0; rc = 0; for (i=0; i<3; i++) { if (inboard[i][0] == 'X' && inboard[i][1] == 'X' && inboard[i][2] == 'X') { rc = 1; } else if (inboard[i][0] == 'O' && inboard[i][1] == 'O' && inboard[i][2] == 'O') { rc = 2; } if (inboard[0][i] == 'X' && inboard[1][i] == 'X' && inboard[2][i] == 'X') { rc = 1; } else if (inboard[0][i] == 'O' && inboard[1][i] == 'O' && inboard[2][i] == 'O') { rc = 2; } switch(inboard[i][diagidx]) { case 'X': odiaga = 0; break; case 'O': xdiaga = 0; break; default: xdiaga = odiaga = 0; break; } switch (inboard[2-i][diagidx]) { case 'X': odiagb = 0; break; case 'O': xdiagb = 0; break; default: xdiagb = odiagb = 0; break; } diagidx++; if (rc) { break; } } if (xdiaga || xdiagb) { rc = 1; } else if (odiaga || odiagb) { rc = 2; } return(rc); } void draw_board(char inboard[3][3]) { int i, j; for(i=0; i<3; i++) { for (j=0; j<3; j++) { printf("| %c ", inboard[i][j]); } printf("|\n"); } }