424,987 Members | 971 Online
Need help? Post your question and get tips & solutions from a community of 424,987 IT Pros & Developers. It's quick & easy.

I need help w/my tic tac toe code

 P: n/a My code does not seem to be working properly... The game is b/w a human and the computer. The computer always goes first. The computer chooses the first corner in the first turn. in the comp's 2nd turn, it chooses the opposite corner if possible, if that corner is not availabe, the computer chooses randomly. In the computers next turns...it does the following: 1. checks for a winning position else 2. blocks human from a winning position else 3. randomly chooses a position The code is: //Tic-Tac-Toe program // // The game board is a 3x3 array of ints // board[3][3]: // board[0][0] is upper left corner // board[0][1] is top row, middle // ... // board[2][2] is bottom right // 0 means the spot is empty // 1 means 'X' has the spot // 2 means 'O' has the spot #include #include #include // drawpos will draw the right character to the screen, depending // on the value of the parameter val. // if val is 0, the spot is empty to draw a blank // if val is 1, the spot belongs to player X, print 'X' // if val is 2, the spot belongs to player O, print 'O' void drawpos( int val ) { if (val==0) cout << " "; // val is 0, so draw a space else if (val==1) cout << "X"; // val is 1, so draw a 'X' else if (val==2) cout << "O"; // val is 2, so draw a 'O' } // drawrow gets an array of 3 ints and draw a // row of a tic-tac-toe game using the array to determine // what should go in each of the three squares. // // draws a row of the board void drawrow( int row[3] ) { cout << " "; // indent a space drawpos(row[0]); // draw the leftmost spot cout << " | "; // draw the vertial bar drawpos(row[1]); // draw the middle cout << " | "; // draw the vertial bar drawpos(row[2]); // draw the rightmost spot cout << endl; // newline (end of the line) } // drawgame will print out a tic-tac-toe game board // // the output looks something like this: // // | | // ---|---|--- // X | | O // ---|---|--- // X | O | // // // the top left corner is board[0][0] // the top middle is board[0][1] // the bottom right corner is board[2][2] void drawgame( int board[3][3] ) { drawrow(board[0]); // draws the top row cout << "---|---|---" << endl; drawrow(board[1]); // draws the middlerow cout << "---|---|---" << endl; drawrow(board[2]); // draws the bottom row } bool checkPosition ( int board [3][3], int row, int col ) { if ( ( row > 2 ) || ( row < 0 ) || ( col > 2 ) || ( col < 0 ) // out of range test || ( board [ row ][ col ] != 0 ) ) //position is occupied return false; else return true; } bool won ( int board [3][3], int player ) { int i, j; // ROW TEST for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) if ( board [i][j] == player ) continue; else break; if ( j == 3 ) return true; } // COLUMN TEST for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) if ( board [j][i] == player ) continue; else break; if ( j == 3 ) return true; } //DIAGONAL TEST 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 ) ) ) return true; return false; } void main () { int board [3][3] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int turn = 1; int flag = 0; int row, col, player; bool pos, testWin = 0; drawgame ( board ); cout << "\nPlayer 1 is X............Computer is 0" << endl; cout << "\nComputer goes first." << endl; do { if ( ( turn % 2 ) == 1 ) // computer's turn { player = 2; if ( turn == 1 ) // no possibility of any wins yet...choose strategic position (CORNERS) board[0][0] = 2; else if ( turn == 3 ) // no possibility of any wins yet...choose strategic position { if ( board[0][0] == 2 ) pos = checkPosition ( board, 2, 2 ); if ( pos ) board[2][2] = 2; else if ( board[2][2] == 2 ) { pos = checkPosition ( board, 0, 0 ); if ( pos ) board[0][0] = 2; else if ( board[0][2] == 2 ) { pos = checkPosition ( board, 2, 0 ); if ( pos ) board[2][0] = 2; else if ( board[2][0] == 2 ) { pos = checkPosition ( board, 0, 2 ); if ( pos ) board[0][2] = 2; else { int n1, n2; do { n1 = 1 + rand() % 2; n2 = 1 + rand() % 2; pos = checkPosition ( board, n1, n2 ); } while ( !pos ); board[n1][n2] = 2; } } } } } else // turn is > 5 { //check for win situation int i, j; for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) { pos = checkPosition ( board, i , j ); if ( pos ) { board[i][j] = 2; testWin = won ( board, player ); if ( !testWin ) board[i][j] = 0; else break; } } if ( j < 3 ) // computer won and broke from the loop break; } if ( j < 3 ) { drawgame ( board ); cout << "\nComputer WINS!"; break; } // block player 1 from winning if ( j == 3 ) { for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) { pos = checkPosition ( board, i , j ); if ( pos ) { board[i][j] = 1; testWin = won ( board, 1 ); if ( !testWin ) board[i][j] = 0; else { board[i][j] = 2; break; } } } if ( j < 3 ) break; } if ( j == 3 ) // computer chooses a random value { int n1, n2; do { n1 = 1 + rand() % 2; n2 = 1 + rand() % 2; pos = checkPosition ( board, n1, n2 ); } while ( !pos ); board[n1][n2] = 2; } } } drawgame ( board ); } else // player 1's turn { player = 1; do { cout << "\nPlayer 1, Enter a position: "; cin >> row >> col; pos = checkPosition ( board, row, col ); if ( ! pos ) cout << "\nSorry...choose a different position! " << endl; } while ( ! pos ); // player entered a wrong position board [ row ][ col ] = player; drawgame ( board ); cout<<"\n"; // test for winning position // tests only if each player has played twice already if ( turn > 4 ) { bool testWin = won( board, player ); if ( testWin ) // Player Won! { cout << "YOU WIN!" << endl; break; } } } turn++; // counter } while ( turn <= 9 ); if ( turn == 10 ) cout << "\nDRAW"; // no winner getch(); } Apr 13 '06 #1
8 Replies

 P: n/a "sabirah" wrote in message news:11**********************@v46g2000cwv.googlegr oups.com... My code does not seem to be working properly... What exactly is the problem you're having? Are we supposed to analyze all your code (which really needs to be indented for us to read, by the way), and guess where it might be going wrong? You need to tell us what the exact problem is, what you expect to be happening, and what you are observing. Then maybe we can concentrate on just the problem part. -Howard Apr 13 '06 #2

 P: n/a while playing...if i choose on my first turn the bottom right corner, the computer doesnt play. So I think the problem is with this code: else if ( turn == 3 ) // no possibility of any wins yet...choose strategic position { if ( board[0][0] == 2 ) pos = checkPosition ( board, 2, 2 ); if ( pos ) board[2][2] = 2; else if ( board[2][2] == 2 ) { pos = checkPosition ( board, 0, 0 ); if ( pos ) board[0][0] = 2; else if ( board[0][2] == 2 ) { pos = checkPosition ( board, 2, 0 ); if ( pos ) board[2][0] = 2; else if ( board[2][0] == 2 ) { pos = checkPosition ( board, 0, 2 ); if ( pos ) board[0][2] = 2; else { int n1, n2; do { n1 = 1 + rand() % 2; n2 = 1 + rand() % 2; pos = checkPosition ( board, n1, n2 ); } while ( !pos ); board[n1][n2] = 2; } } } } } and i think is primarily in my use of the rand() function. Apr 13 '06 #3

 P: n/a if i choose on my first turn the bottom right corner ( which is board[2][2] ), the computer will not play his turn. Apr 13 '06 #4

 P: n/a in the computer's turn 3, the computer should choose a corner...and if the corners are occupied, then choose a random position. if i dont choose the corner the computer, will play normally. if i choose a corner, the computer won't play. Apr 13 '06 #5

 P: n/a Thank you for making me elaborate on what my problem was...I figured out what the problem was. Apr 13 '06 #6

 P: n/a Thank you for making me elaborate on what my problem is...I figured out what the problem was. Apr 13 '06 #7

 P: n/a "sabirah" wrote in message news:11**********************@e56g2000cwe.googlegr oups.com... Thank you for making me elaborate on what my problem was...I figured out what the problem was. I'm glad I helped. The same thing happens to me all the time... simply describing the problem to someone helps me figure it out. By the way, your responses should include relevant portions of the message(s) you're responding to, so we don't have to go back and read previous posts to know what you're talking about. Ok? -Howard Apr 13 '06 #8

 P: n/a Howard wrote: By the way, your responses should include relevant portions of the message(s) you're responding to, so we don't have to go back and read previous posts to know what you're talking about. Ok? As the OP is posting from Google (no surprise) the information below may be of value. Brian -- Please quote enough of the previous message for context. To do so from Google, click "show options" and use the Reply shown in the expanded header. Apr 13 '06 #9