/* tictactoe.cpp Written by: Ken Mathis Written on: 07/08/02 Purpose: Play tic-tac-toe of course :) This is a tictactoe game. The AI (artificial intelligence) is pretty strong. First the engine checks if it can win, if it can it moves there ;) of course. If the engine can't win on his next move he checks to see if the player can. If he can't win and the player can't win, he moves to a random open square. */ // include the header files #include #include #include #include #include // declare functions void displayboard(); void pickagain(); void move(int pos); void instructions(); int checkwin(); int checkcats(); int ai(); // global variables int board[3][3]; int turn = 1; // main function int main() { // declare necessary variables int position; int win, cats; int x; // make it more random :) srand((unsigned) time(NULL)); instructions(); // show instructions displayboard(); // show board // main loop do { // get user move cout << "Enter your position (0 to exit): "; cin >> position; move(position); // move to position chosen turn = 2; // set it to computers turn win = checkwin(); // check to see if the player won if (win == 0) // if player didn't win then continue win = 0; else if (win == 1) // if player did win then declare it and exit { displayboard(); cout << "You win!\n"; break; } cats = checkcats(); // check for cats if (cats == 0) // if no cats then continue cats = 0; else // if cats then declare it and exit { displayboard(); cout << "cats!\n"; break; } x = ai(); // get computer move turn = 1; // switch to players turn win = checkwin(); // check if the computer won if (win == 0) // if comp doesn't win continue win = 0; else if (win == 2) // if comp wins then declare it and exit { displayboard(); cout << "You lost!\n"; break; } cats = checkcats(); // check for cats if (cats == 0) // if no cats then continue cats = 0; else // if cats then declare it and continue { displayboard(); cout << "cats!\n"; break; } displayboard(); // display the board } while(position != 0); // loop until the player enters 0 cout << "come back soon\n"; return 0; } // display board function void displayboard() { int x,y; // declare necessary variables for (x = 0; x < 3; x++) // step through the rows { for (y = 0; y < 3; y++) // step through the columns { cout << board[x][y]; // display the [row][column] } cout << endl; // when the row is done, begin a new line } } // pick again function void pickagain() { int newposition; // declare necessary variables cout << "You can't move there!\n"; cout << "enter new location: "; cin >> newposition; // get the new position move(newposition); // move to new position } // move piece function void move(int pos) { int isok = 1; // declare necessary variables // check where to move and if the move is legal switch (pos) { case 1: if (board[2][0] == 0) board[2][0] = turn; else isok = 0; break; case 2: if (board[2][1] == 0) board[2][1] = turn; else isok = 0; break; case 3: if (board[2][2] == 0) board[2][2] = turn; else isok = 0; break; case 4: if (board[1][0] == 0) board[1][0] = turn; else isok = 0; break; case 5: if (board[1][1] == 0) board[1][1] = turn; else isok = 0; break; case 6: if (board[1][2] == 0) board[1][2] = turn; else isok = 0; break; case 7: if (board[0][0] == 0) board[0][0] = turn; else isok = 0; break; case 8: if (board[0][1] == 0) board[0][1] = turn; else isok = 0; break; case 9: if (board[0][2] == 0) board[0][2] = turn; else isok = 0; break; default: break; } if (isok == 0) // if illegal move then pick again pickagain(); } // checkwin function int checkwin() { // check if player won // check if player won across top if ((board[0][0] == 1) && (board[0][1] == 1) && (board[0][2] == 1)) return 1; // check if player won across middle else if ((board[1][0] == 1) && (board[1][1] == 1) && (board[1][2] == 1)) return 1; // check if player won across bottom else if ((board[2][0] == 1) && (board[2][1] == 1) && (board[2][2] == 1)) return 1; // check if player won down left else if ((board[0][0] == 1) && (board[1][0] == 1) && (board[2][0] == 1)) return 1; // check if player won down middle else if ((board[0][1] == 1) && (board[1][1] == 1) && (board[2][1] == 1)) return 1; // check if player won down right else if ((board[0][2] == 1) && (board[1][2] == 1) && (board[2][2] == 1)) return 1; // check if player has diagnal win left to right else if ((board[0][0] == 1) && (board[1][1] == 1) && (board[2][2] == 1)) return 1; // check if player has diagnal win right to left else if ((board[0][2] == 1) && (board[1][1] == 1) && (board[2][0] == 1)) return 1; // check if comp won // check if comp won across top else if ((board[0][0] == 2) && (board[0][1] == 2) && (board[0][2] == 2)) return 2; // check if comp won across middle else if ((board[1][0] == 2) && (board[1][1] == 2) && (board[1][2] == 2)) return 2; // check if comp won across bottom else if ((board[2][0] == 2) && (board[2][1] == 2) && (board[2][2] == 2)) return 2; // check if comp won down left else if ((board[0][0] == 2) && (board[1][0] == 2) && (board[2][0] == 2)) return 2; // check if comp won down middle else if ((board[0][1] == 2) && (board[1][1] == 2) && (board[2][1] == 2)) return 2; // check if comp won down right else if ((board[0][2] == 2) && (board[1][2] == 2) && (board[2][2] == 2)) return 2; // check if comp won diagnal left to right else if ((board[0][0] == 2) && (board[1][1] == 2) && (board[2][2] == 2)) return 2; // check if comp won diagnal right to left else if ((board[0][2] == 2) && (board[1][1] == 2) && (board[2][0] == 2)) return 2; // check if noone won else return 0; } // checkcats function int checkcats() { int x,y; // declare necessary variables int cats = 1; for (x = 0; x < 3; x++) // probe rows { for (y = 0; y < 3; y++) // probe columns { if (board[x][y] == 0) // check if a square is empty { cats = 0; break; } } } return (cats); } // ai function int ai() { int random; // declare necessary variables int moved = 0; // check if i can win across top if ((board[0][0] == 2) && (board[0][1] == 2) && (board[0][2] == 0)) { move(9); return 0; } else if ((board[0][0] == 2) && (board[0][2] == 2) && (board[0][1] == 0)) { move(8); return 0; } else if ((board[0][0] == 0) && (board[0][1] == 2) && (board[0][2] == 2)) { move(7); return 0; } // check if i can win across middle else if ((board[1][0] == 2) && (board[1][1] == 2) && (board[0][2] == 0)) { move(6); return 0; } else if ((board[1][0] == 2) && (board[1][1] == 0) && (board[1][2] == 2)) { move(5); return 0; } else if ((board[1][0] == 0) && (board[1][1] == 2) && (board[1][2] == 2)) { move(4); return 0; } // check if i can win across bottom else if ((board[2][0] == 2) && (board[2][1] == 2) && (board[2][2] == 0)) { move(3); return 0; } else if ((board[2][0] == 2) && (board[2][1] == 0) && (board[2][2] == 2)) { move(2); return 0; } else if ((board[2][0] == 0) && (board[2][1] == 2) && (board[2][2] == 2)) { move(1); return 0; } // check if i can win down left else if ((board[0][0] == 2) && (board[1][0] == 2) && (board[2][0] == 0)) { move(1); return 0; } else if ((board[0][0] == 2) && (board[1][0] == 0) && (board[2][0] == 2)) { move(4); return 0; } else if ((board[0][0] == 0) && (board[1][0] == 2) && (board[2][0] == 2)) { move(7); return 0; } // check if i can win down middle else if ((board[0][1] == 2) && (board[1][1] == 2) && (board[2][1] == 0)) { move(2); return 0; } else if ((board[0][1] == 2) && (board[1][1] == 0) && (board[2][1] == 2)) { move(5); return 0; } else if ((board[0][1] == 0) && (board[1][1] == 2) && (board[2][1] == 2)) { move(8); return 0; } // check if i can win down right else if ((board[0][2] == 2) && (board[1][2] == 2) && (board[2][2] == 0)) { move(3); return 0; } else if ((board[0][2] == 2) && (board[1][2] == 0) && (board[2][2] == 2)) { move(6); return 0; } else if ((board[0][2] == 0) && (board[1][2] == 2) && (board[2][2] == 2)) { move(9); return 0; } //check if i can win by diagnal left to right else if ((board[0][0] == 2) && (board[1][1] == 2) && (board[2][2] == 0)) { move(3); return 0; } else if ((board[0][0] == 2) && (board[1][1] == 0) && (board[2][2] == 2)) { move(5); return 0; } else if ((board[0][0] == 0) && (board[1][1] == 2) && (board[2][2] == 2)) { move(7); return 0; } // check if i can win by diagnal right to left else if ((board[0][2] == 2) && (board[1][1] == 2) && (board[2][0] == 0)) { move(1); return 0; } else if ((board[0][2] == 2) && (board[1][1] == 0) && (board[2][0] == 2)) { move(5); return 0; } else if ((board[0][2] == 0) && (board[1][1] == 2) && (board[2][0] == 2)) { move(9); return 0; } // if i can't win... let's see if the player can win // check for player winning across top else if ((board[0][0] == 1) && (board[0][1] == 1) && (board[0][2] == 0)) { move(9); return 0; } else if ((board[0][0] == 1) && (board[0][1] == 0) && (board[0][2] == 1)) { move(8); return 0; } else if ((board[0][0] == 0) && (board[0][1] == 1) && (board[0][2] == 1)) { move(7); return 0; } // check if player can win across middle else if ((board[1][0] == 1) && (board[1][1] == 1) && (board[1][2] == 0)) { move(6); return 0; } else if ((board[1][0] == 1) && (board[1][1] == 0) && (board[1][2] == 1)) { move(5); return 0; } else if ((board[1][0] == 0) && (board[1][1] == 1) && (board[1][2] == 1)) { move(4); return 0; } // see if player can win across bottom else if ((board[2][0] == 1) && (board[2][1] == 1) && (board[2][2] == 0)) { move(3); return 0; } else if ((board[2][0] == 1) && (board[2][1] == 0) && (board[2][2] == 1)) { move(2); return 0; } else if ((board[2][0] == 0) && (board[2][1] == 1) && (board[2][2] == 1)) { move(1); return 0; } // see if player can win down left else if ((board[0][0] == 1) && (board[1][0] == 1) && (board[2][0] == 0)) { move(1); return 0; } else if ((board[0][0] == 1) && (board[1][0] == 0) && (board[2][0] == 1)) { move(4); return 0; } else if ((board[0][0] == 0) && (board[1][0] == 1) && (board[2][0] == 1)) { move(7); return 0; } // see if player can win down middle else if ((board[0][1] == 1) && (board[1][1] == 1) && (board[2][1] == 0)) { move(2); return 0; } else if ((board[0][1] == 1) && (board[1][1] == 0) && (board[2][1] == 1)) { move(5); return 0; } else if ((board[0][1] == 0) && (board[1][1] == 1) && (board[2][1] == 1)) { move(8); return 0; } // see if player can win down right else if ((board[0][2] == 1) && (board[1][2] == 1) && (board[2][2] == 0)) { move(3); return 0; } else if ((board[0][2] == 1) && (board[1][2] == 0) && (board[2][2] == 1)) { move(6); return 0; } else if ((board[0][2] == 0) && (board[1][2] == 1) && (board[2][2] == 1)) { move(9); return 0; } // see if player can win diagnal left to right else if ((board[0][0] == 1) && (board[1][1] == 1) && (board[2][2] == 0)) { move(3); return 0; } else if ((board[0][0] == 1) && (board[1][1] == 0) && (board[2][2] == 1)) { move(5); return 0; } else if ((board[0][0] == 0) && (board[1][1] == 1) && (board[2][2] == 1)) { move(7); return 0; } // see if player can win diagnal right to left else if ((board[0][2] == 1) && (board[1][1] == 1) && (board[2][0] == 0)) { move(1); return 0; } else if ((board[0][2] == 1) && (board[1][1] == 0) && (board[2][0] == 1)) { move(5); return 0; } else if ((board[0][2] == 0) && (board[1][1] == 1) && (board[2][0] == 1)) { move(9); return 0; } // if i can't win and you can't win... chose a random square else { do { random = 1 + rand() % 9; // chose random square // check if that square is empty switch(random) { case 1: if (board[2][0] == 0) { move(1); moved = 1; } break; case 2: if (board[2][1] == 0) { move(2); moved = 1; } break; case 3: if (board[2][2] == 0) { move(3); moved = 1; } break; case 4: if (board[1][0] == 0) { move(4); moved = 1; } break; case 5: if (board[1][1] == 0) { move(5); moved = 1; } break; case 6: if (board[1][2] == 0) { move(6); moved = 1; } break; case 7: if (board[0][0] == 0) { move(7); moved = 1; } break; case 8: if (board[0][1] == 0) { move(8); moved = 1; } break; case 9: if (board[0][2] == 0) { move(9); moved = 1; } break; } } while (moved == 0); } return 0; } // instructions function void instructions() { cout << "Here is a list of commands.\n"; cout << "1 - bottom left\n"; cout << "2 - bottom middle\n"; cout << "3 - bottom right\n"; cout << "4 - middle left\n"; cout << "5 - middle middle\n"; cout << "6 - middle right\n"; cout << "7 - top right\n"; cout << "8 - top middle\n"; cout << "9 - top right\n"; cout << "0 - exit\n"; cout << "These keys should look like this on your keyboard\n"; cout << "789\n"; cout << "456\n"; cout << "123\n"; cout << "0\n\n\n"; }