Over the last few weeks I have been implementing a bot into my Tic Tac Toe program, allowing a single player to test their skills at tic tac toe, while also sharpening my skills in regards to writing AI. The bot has proven to be a somewhat tedious, but very successful attempt at Artificial Intelligence. After many hours of testing, and improvising (and nearly 2000 lines of code), I believe it to be unbeatable… while I’m sure there is a flaw in there somewhere, I am unable to find it. I will continue to improvise and improve the bot, but for the time being, it is completed! Here is some gameplay (Just a note: the bot always plays as player 2 (O)):
// // main.cpp // Tic Tac Toe // // Created by Aidan Takami on 3/8/18. // Copyright © 2018 Aidan Takami. All rights reserved. // #include #include using namespace std; //Array to represent the spots on the board char spot[10] = {'o','1','2','3','4','5','6','7','8','9'}; char cpuChoices[5]{0,0,0,0,0}; int ifWon(); void singlePlayer(); void cpuTurn(int); void board(); void clearBoard(); void clearCpu(); bool cpuChoicesContains(char); int findSpot(); //Main method int main() { cout << "\n\n\tTic Tac Toe\n\n"; //Allows player to play vs CPU or human string temp; cout << "Would you like to play with 2 players, or 1? (enter 1 or 2)" << endl; cin >> temp; if(temp == "1"){ singlePlayer(); } start: int player = 1,i = -1,choice; char side, playOn; //Game loop, which will continue while no player has won while(i==-1){ //Draws the board board(); //Deciphers which players turn it is, using the modulus operator player=(player%2)?1:2; //Intro text & takes players move cout << "Player " << player << ", enter a number: "; cin >> choice; //Decides the team that the current player is on (X's or O's) side=(player == 1) ? 'X' : 'O'; //Will take the player's move and mark the correct box (if unoccupied) with the correct side if (choice == 1 && spot[1] == '1') spot[1] = side; else if (choice == 2 && spot[2] == '2') spot[2] = side; else if (choice == 3 && spot[3] == '3') spot[3] = side; else if (choice == 4 && spot[4] == '4') spot[4] = side; else if (choice == 5 && spot[5] == '5') spot[5] = side; else if (choice == 6 && spot[6] == '6') spot[6] = side; else if (choice == 7 && spot[7] == '7') spot[7] = side; else if (choice == 8 && spot[8] == '8') spot[8] = side; else if (choice == 9 && spot[9] == '9') spot[9] = side; //If selected box is occupied else { cout<<"Invalid move "; //gives the same player another turn player--; cin.ignore(); cin.get(); } //determines if the board contains a win or draw. i=ifWon(); //Continues the play process player++; } //If a player won, draws the board and announces who won board(); if(i==1) cout<<"Player "<<--player<<" wins! "; //If draw, announces a draw else cout<<"==>\aGame draw"; //Gives players an option to play again cout << " Would you like to play again? (y/n)" << endl; cin >> playOn; if(playOn == 'y' || playOn == 'Y' ){ clearBoard(); goto start; } else exit(0); } //function that returns the result of the game int ifWon() { //Game was won if (spot[1] == spot[2] && spot[2] == spot[3]) return 1; else if (spot[4] == spot[5] && spot[5] == spot[6]) return 1; else if (spot[7] == spot[8] && spot[8] == spot[9]) return 1; else if (spot[1] == spot[4] && spot[4] == spot[7]) return 1; else if (spot[2] == spot[5] && spot[5] == spot[8]) return 1; else if (spot[3] == spot[6] && spot[6] == spot[9]) return 1; else if (spot[1] == spot[5] && spot[5] == spot[9]) return 1; else if (spot[3] == spot[5] && spot[5] == spot[7]) return 1; //Game was a draw else if (spot[1] != '1' && spot[2] != '2' && spot[3] != '3' && spot[4] != '4' && spot[5] != '5' && spot[6] != '6' && spot[7] != '7' && spot[8] != '8' && spot[9] != '9') return 0; //Game still in progress else return -1; } //Function that draws the board void board() { cout << endl << endl << endl; //Prints each box of the board with the contents of the array properly alligned cout << "Player 1 (X) - Player 2 (O)" << endl << endl << endl; cout << " | | " << endl; cout << " " << spot[1] << " | " << spot[2] << " | " << spot[3] << endl; cout << "_____|_____|_____" << endl; cout << " | | " << endl; cout << " " << spot[4] << " | " << spot[5] << " | " << spot[6] << endl; cout << "_____|_____|_____" << endl; cout << " | | " << endl; cout << " " << spot[7] << " | " << spot[8] << " | " << spot[9] << endl; cout << " | | " << endl << endl; } //Method to allow player to play versus a CPU void singlePlayer(){ start: int player = 1,i = -1,choice, round = 0; char side, playOn; //Game loop, which will continue while no player has won while(i==-1){ //Deciphers which players turn it is, using the modulus operator player=(player%2)?1:2; //Draws the board for user if(player == 1) board(); //Intro text & takes players move cout << "Player " << player << ", enter a number: "; if(player == 2){ cpuTurn(round); cout << "CPU turn!" << endl; } else{ cin >> choice; //Decides the team that the current player is on (X's or O's) side=(player == 1) ? 'X' : 'O'; //Will take the player's move and mark the correct box (if unoccupied) with the correct side if (choice == 1 && spot[1] == '1') spot[1] = side; else if (choice == 2 && spot[2] == '2') spot[2] = side; else if (choice == 3 && spot[3] == '3') spot[3] = side; else if (choice == 4 && spot[4] == '4') spot[4] = side; else if (choice == 5 && spot[5] == '5') spot[5] = side; else if (choice == 6 && spot[6] == '6') spot[6] = side; else if (choice == 7 && spot[7] == '7') spot[7] = side; else if (choice == 8 && spot[8] == '8') spot[8] = side; else if (choice == 9 && spot[9] == '9') spot[9] = side; //If selected box is occupied else { cout<<"Invalid move "; //gives the same player another turn player--; cin.ignore(); cin.get(); } } //determines if the board contains a win or draw. i=ifWon(); //Continues the play process player++; round++; } //If a player won, draws the board and announces who won board(); if(i==1) cout<<"Player "<<--player<<" wins! "; //If draw, announces a draw else cout<<"==>\aGame draw"; //Gives players an option to play again cout << " Would you like to play again? (y/n)" << endl; cin >> playOn; if(playOn == 'y' || playOn == 'Y' ){ clearBoard(); clearCpu(); goto start; } else exit(0); } //AI to play against the player in single player mode //Organized by turn. void cpuTurn(int round){ //in the first round if(round == 1){ //AI will try to get the middle of the board if(spot[1] == 'X' || spot[2] == 'X' || spot[3] == 'X' || spot[4] == 'X'){ spot[5] = 'O'; cpuChoices[0] = '5'; } else if(spot [6] == 'X' || spot [7] == 'X' || spot[8] == 'X' || spot[9] =='X'){ spot[5] = 'O'; cpuChoices[0] = '5'; } //Otherwise, AI will go for spot 9 else{ spot[9] ='O'; cpuChoices[0] = '9'; } } //Second turn if(round == 3){ //AI will decide based upon previous moves by both AI and user if(spot[1] == 'X' && spot[2] == 'X'){ if(cpuChoices[0] == '5'){ spot[3] = 'O'; cpuChoices[1] = '3'; } } else if(spot[1] == 'X' && spot[3] == 'X'){ if(cpuChoices[0] == '5'){ spot[2] = 'O'; cpuChoices[1] = '2'; } } else if(spot[1] == 'X' && spot[4] == 'X'){ if(cpuChoices[0] == '5'){ spot[7] = 'O'; cpuChoices[1] = '7'; } } else if (spot[1] == 'X' && spot[5] == 'X'){ spot[3] = 'O'; cpuChoices[1] = '3'; } else if(spot[1] == 'X' && spot[6] == 'X'){ if(cpuChoices[0] == '5'){ spot[2] = 'O'; cpuChoices[1] = '2'; } } else if(spot[1] == 'X' && spot[7] == 'X'){ if(cpuChoices[0] == '5'){ spot[4] = 'O'; cpuChoices[1] = '4'; } } else if(spot[1] == 'X' && spot[8] == 'X'){ if(cpuChoices[0] == '5'){ spot[3] = 'O'; cpuChoices[1] = '3'; } } else if(spot[1] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[2] = 'O'; cpuChoices[1] = '2'; } } else if(spot[2] == 'X' && spot[3] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[2] == 'X' && spot[4] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[2] == 'X' && spot[5] == 'X'){ spot[8] = 'O'; cpuChoices[1] = '8'; } else if(spot[2] == 'X' && spot[6] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[2] == 'X' && spot[7] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[2] == 'X' && spot[8] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[2] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[3] = 'O'; cpuChoices[1] = '3'; } } else if(spot[3] == 'X' && spot[4] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[3] == 'X' && spot[5] == 'X'){ spot[7] = 'O'; cpuChoices[1] = '7'; } else if(spot[3] == 'X' && spot[6] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[3] == 'X' && spot[7] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[3] == 'X' && spot[8] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[3] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[6] = 'O'; cpuChoices[1] = '6'; } } else if(spot[4] == 'X' && spot[5] == 'X'){ spot[6] = 'O'; cpuChoices[1] = '6'; } else if(spot[4] == 'X' && spot[6] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[4] == 'X' && spot[7] == 'X'){ if(cpuChoices[0] == '5'){ spot[1] = 'O'; cpuChoices[1] = '1'; } } else if(spot[4] == 'X' && spot[8] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[4] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[3] = 'O'; cpuChoices[1] = '3'; } } else if(spot[5] == 'X' && spot[6] == 'X'){ spot[4] = 'O'; cpuChoices[1] = '4'; } else if(spot[5] == 'X' && spot[7] == 'X'){ spot[3] = 'O'; cpuChoices[1] = '3'; } else if(spot[5] == 'X' && spot[8] == 'X'){ spot[2] = 'O'; cpuChoices[1] = '2'; } else if(spot[6] == 'X' && spot[7] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[6] == 'X' && spot[8] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[6] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[3] = 'O'; cpuChoices[1] = '3'; } } else if(spot[7] == 'X' && spot[8] == 'X'){ if(cpuChoices[0] == '5'){ spot[9] = 'O'; cpuChoices[1] = '9'; } } else if(spot[7] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[8] = 'O'; cpuChoices[1] = '8'; } } else if(spot[8] == 'X' && spot[9] == 'X'){ if(cpuChoices[0] == '5'){ spot[7] = 'O'; cpuChoices[1] = '7'; } } } //third turn //Most complex turn, most games are won or lost in this round if(round == 5){ //Spots 1 & 2 taken first if(spot[1] == 'X' && spot[2] =='X'){ if(spot[4] =='X'){ if(cpuChoicesContains('3') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } else if(spot[5] == 'X'){ if(cpuChoicesContains('9') && cpuChoicesContains('6')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('9') && cpuChoicesContains('3')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } else if(spot[6] == 'X'){ if(cpuChoicesContains('3')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('4')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else{ spot[4] = 'O'; cpuChoices[2] = '4'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('3')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('3')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 1 & 3 taken first else if(spot[1] == 'X' && spot[3] =='X'){ if(spot[4] =='X'){ if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(!cpuChoicesContains('7')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7') && cpuChoicesContains('5')){ spot[2] = 'O'; cpuChoices[2] = '2'; } } else if(spot[5] == 'X'){ if(!cpuChoicesContains('9')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(!cpuChoicesContains('7')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else{ spot[2] = 'O'; cpuChoices[2] = '2'; } } else if(spot[6] == 'X'){ if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('8') && cpuChoicesContains('5')){ spot[2] = 'O'; cpuChoices[2] = '2'; } else if (!cpuChoicesContains('9')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if (cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[2] = 'O'; cpuChoices[2] = '2'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('8') && cpuChoicesContains('5')){ spot[2] = 'O'; cpuChoices[2] = '2'; } else{ spot[4] = 'O'; cpuChoices[2] = '4'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('5') && cpuChoicesContains('3')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('8') && cpuChoicesContains('5')){ spot[2] = 'O'; cpuChoices[2] = '2'; } } } //Spots 1 & 4 taken first else if(spot[1] == 'X' && spot[4] == 'X'){ if(spot[5] == 'X'){ if(!cpuChoicesContains('6')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('9') && cpuChoicesContains('6')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } else if(spot[6] == 'X'){ if(cpuChoicesContains('7') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('7') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('2') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if (cpuChoicesContains('3') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } } //Spots 1 & 5 taken first else if(spot[1] == 'X' && spot[5] == 'X'){ if(spot[6] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('9') && cpuChoicesContains('4')){ spot[8] = 'O'; cpuChoices[2] = '8'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('2') && cpuChoicesContains('9')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 1 & 6 taken first else if(spot[1] == 'X' && spot[6] == 'X'){ if(spot[7] == 'X'){ if(cpuChoicesContains('5') && cpuChoicesContains('2')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('9') && cpuChoicesContains('3')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('4') && cpuChoicesContains('5')){ spot[6] = 'O'; cpuChoices[2] = 6; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('5') && cpuChoicesContains('2')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } else if(spot[9] == 'X'){ if(!cpuChoicesContains('3')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 1 & 7 taken first else if(spot[1] == 'X' && spot[7] == 'X'){ if(spot[8] == 'X'){ if(cpuChoicesContains('5') && cpuChoicesContains('4')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('5') && cpuChoicesContains('4')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('8') && cpuChoicesContains('5')){ spot[2] = 'O'; cpuChoices[2] = '2'; } } } //Spots 1 & 8 taken first else if(spot[1] == 'X' && spot[8] == 'X'){ if(spot[9] == 'X'){ if(!cpuChoicesContains('7')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 2 & 3 taken first else if(spot[2] == 'X' && spot[3] == 'X'){ if(spot[4] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } } else if(spot[5] == 'X'){ if(cpuChoicesContains('7') && cpuChoicesContains('9')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('9') && cpuChoicesContains('8')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } else if(spot[6] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('5') && cpuChoicesContains('6')){ spot[4] = 'O'; cpuChoices[2] = '4'; } } } //Spots 2 & 4 taken first else if(spot[2] == 'X' && spot[4] == 'X'){ if(spot[5] == 'X'){ if(cpuChoicesContains('8') && cpuChoicesContains('9')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('9') && cpuChoicesContains('6')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } else if(spot[6] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = 1; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = '7'; cpuChoices[2] = '7'; } } } //Spots 2 & 5 taken first else if(spot[2] == 'X' && spot[5] == 'X'){ if(spot[6] == 'X'){ if(cpuChoicesContains('8') && cpuChoicesContains('9')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('4') && cpuChoicesContains('9')){ spot[8] = 'O'; cpuChoices[2] = '8'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('9') && cpuChoicesContains('8')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('9') && cpuChoicesContains('3')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } } //Spots 2 & 6 taken first else if(spot[2] == 'X' && spot[6] == 'X'){ if(spot[7] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 2 & 7 taken first else if(spot[2] == 'X' && spot[7] == 'X'){ if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('8') && cpuChoicesContains('5')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } } } //Spots 2 & 8 taken first if(spot[2] == 'X' && spot[8] == 'X'){ if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('5') && cpuChoicesContains('3')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } } //Spots 3 & 4 taken first else if(spot[3] == 'X' && spot[4] == 'X'){ if(spot[5] == 'X'){ if(cpuChoicesContains('9') && cpuChoicesContains('6')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('7') && cpuChoicesContains('9')){ spot[8] = 'O'; cpuChoices[2] = '8'; } } else if(spot[6] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[7] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } } else if (spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if (cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if (spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('5') && cpuChoicesContains('6')){ spot[2] = 'O'; cpuChoices[2] = '2'; } } } //Spots 3 & 5 taken first else if(spot[3] == 'X' && spot[5] == 'X'){ if(spot[6] == 'X'){ if(cpuChoicesContains('7') && cpuChoicesContains('9')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('4') && cpuChoicesContains('9')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('9') && cpuChoicesContains('7')){ spot[2] = 'O'; cpuChoices[2] = '2'; } else if(cpuChoicesContains('9') && cpuChoicesContains('2')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 3 & 6 taken first else if(spot[3] == 'X' && spot[6] == 'X'){ if(spot[7] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 3 & 7 taken first else if(spot[3] == 'X' && spot[7] == 'X'){ if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } } } //Spots 3 & 8 taken first else if(spot[3] == 'X' && spot[8] == 'X'){ if(spot[9] == 'X'){ if(cpuChoicesContains('5') && cpuChoicesContains('6')){ spot[4] = 'O'; cpuChoices[2] = '4'; } else if(cpuChoicesContains('5') && cpuChoicesContains('7')){ spot[4] = 'O'; cpuChoices[2] = '4'; } } } //Spots 4 & 5 taken first else if(spot[4] == 'X' && spot[5] == 'X'){ if(spot[7] == 'X'){ if(cpuChoicesContains('9') && cpuChoicesContains('6')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('2') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } else if(cpuChoicesContains('9') && cpuChoicesContains('6')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 4 & 6 taken first else if(spot[4] == 'X' && spot[6] == 'X'){ if(spot[7] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } else if(cpuChoicesContains('5') && cpuChoicesContains('1')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 4 & 7 taken first else if(spot[4] == 'X' && spot[7] == 'X'){ if(spot[8] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[9] = 'O'; cpuChoices[2] = '9'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('5') && cpuChoicesContains('7')){ spot[2] = 'O'; cpuChoices[2] = '2'; } } } //Spots 4 & 8 taken first else if(spot[4] == 'X' && spot[8] == 'X'){ if(spot[9] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('5')){ spot[7] = 'O'; cpuChoices[2] = '7'; } } } //Spots 5 & 6 taken first if(spot[5] == 'X' && spot[6] == 'X'){ if(spot[7] == 'X'){ if(cpuChoicesContains('4') && cpuChoicesContains('9')){ spot[3] = 'O'; cpuChoices[2] = '3'; } else if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[4] = 'O'; cpuChoices[2] = '4'; } } else if(spot[8] == 'X'){ if(cpuChoicesContains('4') && cpuChoicesContains('9')){ spot[2] = 'O'; cpuChoices[2] = '2'; } else if(cpuChoicesContains('9') && cpuChoicesContains('5')){ spot[1] = 'O'; cpuChoices[2] = '1'; } else if(cpuChoicesContains('2') && cpuChoicesContains('9')){ spot[4] = 'O'; cpuChoices[2] = '4'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('1') && cpuChoicesContains('5')){ spot[3] = 'O'; cpuChoices[2] = '3'; } } } //Spots 5 & 7 taken first if(spot[5] == 'X' && spot[7] == 'X'){ if(spot[8] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('9')){ spot[6] = 'O'; cpuChoices[2] = '6'; } } } //Spots 6 & 7 taken first if(spot[6] == 'X' && spot[7] == 'X'){ if(spot[8] == 'X'){ if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } else if(spot[9] == 'X'){ if(cpuChoicesContains('3') && cpuChoicesContains('5')){ spot[8] = 'O'; cpuChoices[2] = '8'; } else if(cpuChoicesContains('5') && cpuChoicesContains('9')){ spot[1] = 'O'; cpuChoices[2] = '1'; } } } } //Fourth turn //AI will search for any possible 3 in a row by both bot & human, and complete that row if(round == 7){ if((spot[1] == spot[2]) && spot[3] == '3'){ spot[3] = 'O'; } else if((spot[4] == spot[5]) && spot[6] == '6'){ spot[6] = 'O'; } else if((spot[7] == spot[8]) && spot[9] == '9'){ spot[9] = 'O'; } else if((spot[2] == spot[3]) && spot[1] == '1'){ spot[1] = 'O'; } else if((spot[5] == spot[6]) && spot[4] == '4'){ spot[4] = 'O'; } else if((spot[8] == spot[9]) && spot[7] == '7'){ spot[7] = 'O'; } else if((spot[1] == spot[3]) && spot[2] == '2'){ spot[2] = 'O'; } else if((spot[4] == spot[6]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[7] == spot[9]) && spot[8] == '8'){ spot[8] = 'O'; } else if((spot[1] == spot[4]) && spot[7] == '7'){ spot[7] = 'O'; } else if((spot[2] == spot[5]) && spot[8] == '8'){ spot[8] = 'O'; } else if((spot[3] == spot[6]) && spot[9] == '9'){ spot[9] = 'O'; } else if((spot[1] == spot[7]) && spot[4] == '4'){ spot[4] = 'O'; } else if((spot[2] == spot[8]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[3] == spot[9]) && spot[6] == '6'){ spot[6] = 'O'; } else if((spot[4] == spot[7]) && spot[1] == '1'){ spot[1] = 'O'; } else if((spot[5] == spot[8]) && spot[2] == '2'){ spot[2] = 'O'; } else if((spot[6] == spot[9]) && spot[3] == '3'){ spot[3] = 'O'; } else if((spot[1] == spot[5]) && spot[9] == '9'){ spot[9] = 'O'; } else if((spot[3] == spot[5]) && spot[7] == '7'){ spot[7] = 'O'; } else if((spot[1] == spot[9]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[3] == spot[7]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[5] == spot[9]) && spot[1] == '1'){ spot[1] = 'O'; } else if((spot[5] == spot[7]) && spot[3] == '3'){ spot[3] = 'O'; } //If no win is possible, AI will place marker in arbitrary posistion else{ spot[findSpot()] = 'O'; } } //Fifth turn //Exact same as 4th turn if(round == 9){ if((spot[1] == spot[2]) && spot[3] == '3'){ spot[3] = 'O'; } else if((spot[4] == spot[5]) && spot[6] == '6'){ spot[6] = 'O'; } else if((spot[7] == spot[8]) && spot[9] == '9'){ spot[9] = 'O'; } else if((spot[2] == spot[3]) && spot[1] == '1'){ spot[1] = 'O'; } else if((spot[5] == spot[6]) && spot[4] == '4'){ spot[4] = 'O'; } else if((spot[8] == spot[9]) && spot[7] == '7'){ spot[7] = 'O'; } else if((spot[1] == spot[3]) && spot[2] == '2'){ spot[2] = 'O'; } else if((spot[4] == spot[6]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[7] == spot[9]) && spot[8] == '8'){ spot[8] = 'O'; } else if((spot[1] == spot[4]) && spot[7] == '7'){ spot[7] = 'O'; } else if((spot[2] == spot[5]) && spot[8] == '8'){ spot[8] = 'O'; } else if((spot[3] == spot[6]) && spot[9] == '9'){ spot[9] = 'O'; } else if((spot[1] == spot[7]) && spot[4] == '4'){ spot[4] = 'O'; } else if((spot[2] == spot[8]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[3] == spot[9]) && spot[6] == '6'){ spot[6] = 'O'; } else if((spot[4] == spot[7]) && spot[1] == '1'){ spot[1] = 'O'; } else if((spot[5] == spot[8]) && spot[2] == '2'){ spot[2] = 'O'; } else if((spot[6] == spot[9]) && spot[3] == '3'){ spot[3] = 'O'; } else if((spot[1] == spot[5]) && spot[9] == '9'){ spot[9] = 'O'; } else if((spot[3] == spot[5]) && spot[7] == '7'){ spot[7] = 'O'; } else if((spot[1] == spot[9]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[3] == spot[7]) && spot[5] == '5'){ spot[5] = 'O'; } else if((spot[5] == spot[9]) && spot[1] == '1'){ spot[1] = 'O'; } else if((spot[5] == spot[7]) && spot[3] == '3'){ spot[3] = 'O'; } //If no win possible, AI will place marker in arbitrary posistion else{ spot[findSpot()] = 'O'; } } } //Method to clear the board & reset all values void clearBoard(){ spot[1] = '1'; spot[2] = '2'; spot[3] = '3'; spot[4] = '4'; spot[5] = '5'; spot[6] = '6'; spot[7] = '7'; spot[8] = '8'; spot[9] = '9'; } //Clears Array of CPU choices void clearCpu(){ cpuChoices[0] = '0'; cpuChoices[1] = '0'; cpuChoices[2] = '0'; cpuChoices[3] = '0'; cpuChoices[4] = '0'; } //Searches array of previous bot choices and returns true if bot has used that space bool cpuChoicesContains(char value){ for(int rep = 0; rep < 5; rep++){ if(cpuChoices[rep] == value) return true; } return false; } //Will find a spot for bot to place piece, for likely game will result in draw int findSpot(){ if(spot[1] == '1') return 1; if(spot[2] == '2') return 2; if(spot[3] == '3') return 3; if(spot[4] == '4') return 4; if(spot[5] == '5') return 5; if(spot[6] == '6') return 6; if(spot[7] == '7') return 7; if(spot[8] == '8') return 8; if(spot[9] == '9') return 9; return 0; }
One thought on “Game Sample: Tic Tac Toe AI”