#include using namespace std; int turn = 0, place; bool Xwin = false, Owin = false, invalid_input = false; char pos1 = ' ', pos2 = ' ', pos3 = ' ', pos4 = ' ', pos5 = ' ', pos6 = ' ', pos7 = ' ', pos8 = ' ', pos9 = ' '; // This problem can be made way easier using an array, see other solution. char input_char; /* * +2 for successful print out of the game grid * +2 for successful input system * +2 for successful game over via filled grid * +2 for successful game over via either side winning * +2 for checking whether if inputs are valid */ int main() { while(!Xwin && !Owin && turn < 9) // Game Over check loop { // Print out the game grid cout << "+---+---+---+" << endl << "| " << pos1 << " | " << pos2 << " | " << pos3 << " |\n" << "+---+---+---+" << endl << "| " << pos4 << " | " << pos5 << " | " << pos6 << " |\n" << "+---+---+---+" << endl << "| " << pos7 << " | " << pos8 << " | " << pos9 << " |\n" << "+---+---+---+" << endl; if(turn % 2 == 0) // Even number turns are X turns input_char = 'X'; else // Odd number turns are O turns input_char = 'O'; do // This loop is for input validation { cout << "Place " << input_char << " at: "; cin >> place; cin.ignore(); if(place < 1 || place > 9) // Allows only 1-9 as inputs { invalid_input = true; cout << "Invalid input! 1-9 only.\n"; } else // Check that the position entered isn't already used { switch(place) { case 1: invalid_input = (pos1 != ' '); break; case 2: invalid_input = (pos2 != ' '); break; case 3: invalid_input = (pos3 != ' '); break; case 4: invalid_input = (pos4 != ' '); break; case 5: invalid_input = (pos5 != ' '); break; case 6: invalid_input = (pos6 != ' '); break; case 7: invalid_input = (pos7 != ' '); break; case 8: invalid_input = (pos8 != ' '); break; case 9: invalid_input = (pos9 != ' '); break; } if(invalid_input) cout << "Invalid input! Position already filled.\n"; } } while(invalid_input); switch(place) // Proceed with putting the marker in place { case 1: pos1 = input_char; break; case 2: pos2 = input_char; break; case 3: pos3 = input_char; break; case 4: pos4 = input_char; break; case 5: pos5 = input_char; break; case 6: pos6 = input_char; break; case 7: pos7 = input_char; break; case 8: pos8 = input_char; break; case 9: pos9 = input_char; break; } // Check whether if there's 3 in a row (Manually check all 8 possible win scenarios) if(turn >= 4) // Perform the check only after the 5th turn, the minimum to get 3 of a kind { if(pos1 == pos2 && pos2 == pos3) // Top row victory { if(pos1 == 'X') Xwin = true; else if(pos1 == 'O') // Don't use else because we want to exclude spaces Owin = true; } else if(pos4 == pos5 && pos5 == pos6) // Middle row victory { if(pos4 == 'X') Xwin = true; else if(pos4 == 'O') Owin = true; } else if(pos7 == pos8 && pos8 == pos9) // Bottom row victory { if(pos7 == 'X') Xwin = true; else if(pos7 == 'O') Owin = true; } else if(pos1 == pos4 && pos4 == pos7) // Left column victory { if(pos4 == 'X') Xwin = true; else if(pos4 == 'O') Owin = true; } else if(pos2 == pos5 && pos5 == pos8) // Middle column victory { if(pos5 == 'X') Xwin = true; else if(pos5 == 'O') Owin = true; } else if(pos3 == pos6 && pos6 == pos9) // Right column victory { if(pos6 == 'X') Xwin = true; else if(pos6 == 'O') Owin = true; } else if(pos1 == pos5 && pos5 == pos9) // Back diagonal victory { if(pos1 == 'X') Xwin = true; else if(pos1 == 'O') Owin = true; } else if(pos3 == pos5 && pos5 == pos7) // Forward diagonal victory { if(pos3 == 'X') Xwin = true; else if(pos3 == 'O') Owin = true; } } turn++; } // Display the final results cout << "+---+---+---+" << endl << "| " << pos1 << " | " << pos2 << " | " << pos3 << " |\n" << "+---+---+---+" << endl << "| " << pos4 << " | " << pos5 << " | " << pos6 << " |\n" << "+---+---+---+" << endl << "| " << pos7 << " | " << pos8 << " | " << pos9 << " |\n" << "+---+---+---+" << endl; cout << "Game Over - "; if(Xwin) cout << "X wins!" << endl; else if(Owin) cout << "O wins!" << endl; else cout << "Draw" << endl; return 0; }