Spread the love
/* Tic Toc Toe */ # include <iostream> # include <cstdio> # include <cstdlib> # include <string> # include <time.h> # include <windows.h> # define l 3 # define c 3 using namespace std; bool validatePosition (char pos, char mt[l][c], bool player1); bool gameOver (char mt[l][c],short op,short &cont_p1,short &cont_p2,short &cont_cpu); void showGame (char mt[l][c],short op); void cpu(char mt[l][c]); void cpu_hard(char mt[l][c]); string changeName1(); string changeName2(); int main() { short i,j,op,cont_p1 = 0 ,cont_p2 = 0,cont_cpu = 0; char op2; char mt[l][c],pos; bool player1 = false,mult = false,is_cpu = false; string p1,p2; cout << "General Public License v3 \n"; cout << "Programmer: Romulo Sorato" << endl; cout << "Legend: \nPlayer 1: X \nPlayer 2 and CPU: O\n\n"; do { do { cout <<"Choose your option:\n1-Multiplayer 2-CPU\n"; cin>>op; if(op == 1) mult = true; else if (op == 2) is_cpu = true; if(op!=1 && op!=2) cout<<"Choose your option, type only 1 or 2\n"; } while(op != 1 && op != 2); if(is_cpu && mult) { cont_p1 = 0; cont_p2 = 0; cont_cpu = 0; } if(op == 2) { mult = false; cout<<"Choose level:2-Easy 3-Hard\n"<<endl; cin>>op; } fflush(stdin); if(op == 1) { is_cpu = false; p1 = changeName1(); p2 = changeName2(); } else p1 = changeName1(); cout << "Enter the number corresponding to the desired location: \n" << endl << endl; //Starting matrix for (i = 0; i < l; i++) { for (j = 0; j < c; j ++) { mt[i][j] = '?'; } } // ----------- int count = 1; // Showing the positions for (i = 0; i < l*2; i++) { cout << " "; for (j = 0; j < c*2; j++) { if(i % 2 == 0) { if(j%2 == 0) { cout << "["<<count<<"]" <<" "; count ++; } else { if(j != c*2-1) cout <<"| "; } } else { if(j%2 != 0) cout <<"-----"; } } cout << endl; } //--------- cout << endl; do { do { // Getting position player 1 do { cout << "Player 1:" << p1 <<"\n"; cin >> pos; } while (isdigit (pos) == 0); player1 = true; } while (!validatePosition (pos, mt, player1)); system ("CLS"); showGame(mt,op); if (gameOver(mt,op,cont_p1,cont_p2,cont_cpu)) break; if(op == 2) { Sleep(1000); cpu(mt); system ("CLS"); showGame(mt,op); } if(op == 3) { Sleep(1000); cpu_hard(mt); system ("CLS"); showGame(mt,op); } else if(op == 1) { do { cout << "Player 2:" << p2 <<"\n"; cin >> pos; player1 = false; } while (!validatePosition (pos, mt, player1)); system ("CLS"); showGame(mt,op); } if (gameOver(mt,op,cont_p1,cont_p2,cont_cpu)) break; } while (true); cout << "Do you want to continue? (y to continue or any other to quit)\nOr press c to change names" << endl; cin >> op2; tolower (op2); system ("CLS"); if(op2 == 'c') { fflush(stdin); p1 = changeName1(); p2 = changeName2(); } } while (op2 == 'y' || op2 == 'c'); return 0; } bool validatePosition (char pos, char mt [l][c], bool player1) { if (pos == '1') { if (mt [0][0] != '?') { cout << "Position already used,type another position." << endl; } else { if (player1 == true) mt [0][0] = 'X'; else mt [0][0] = 'O'; return true; } } else if (pos == '2') { if (mt [0][1] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [0][1] = 'X'; else mt [0][1] = 'O'; return true; } } else if (pos == '3') { if (mt[0][2] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [0][2] = 'X'; else mt [0][2] = 'O'; return true; } } else if (pos == '4') { if (mt [1][0] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [1][0] = 'X'; else mt [1][0] = 'O'; return true; } } else if (pos == '5') { if (mt [1][1] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [1][1] = 'X'; else mt [1][1] = 'O'; return true; } } else if (pos == '6') { if (mt [1][2] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [1][2] = 'X'; else mt [1][2] = 'O'; return true; } } else if (pos == '7') { if (mt [2][0] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [2] [0] = 'X'; else mt [2] [0] = 'O'; return true; } } else if (pos == '8') { if (mt [2][1] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [2][1] = 'X'; else mt [2][1] = 'O'; return true; } } else if (pos == '9') { if (mt [2][2] != '?') { cout << "Position already used, type another position." << endl; } else { if (player1 == true) mt [2] [2] = 'X'; else mt [2][2] = 'O'; return true; } } else cout << "Invalid number, type number 1-9."; return false; } void showGame(char mt[l][c],short op) { cout << "General Public License v3 \n"; cout << "Programmer: Romulo Sorato\n" << endl; if(op == 1) { cout << "Legend: \nPlayer 1: X \nPlayer 2: O\n" << endl << endl; } else cout << "Legend: \nPlayer 1: X \nCPU: O\n" << endl << endl; int count = 1; for (int i = 0; i < l; i++) { cout << " "; for (int j = 0; j < c; j ++) { if (mt [i][j] == '?') { cout << "["<<count<<"]| "; } else if (mt [i][j] == 'X') { cout << "[X]| "; } else cout << "[O]| "; count ++; } cout <<"\n\t --------------\n"; } cout << endl; } bool gameOver (char mt[l][c],short op,short &cont_p1,short &cont_p2,short &cont_cpu) { // Check if there was a winner or a tie int ct = 0 ;// total counter int d = c-1 ;// auxiliary variable for secondary diagonal int contd = 0 ;// counter diagonal int contd2 = 0 ;// counter for diagonal secondary int contc ;// counter for column int contl ;// counter for line player 1 int contdj2 = 0 ;// counter diagonal for player 2 int contd2j2 = 0 ;// counter for diagonal secondary player 2 int contcj2;// counter for the column player 2 int contlj2;// counter for line player 2 for (int i = 0; i < l; i ++) { contc = 0; contcj2 = 0; contl = 0; contlj2 = 0; if (mt [i][i] == 'O') contdj2 ++; if (mt [i][d] == 'O') contd2j2 ++; if (mt [i][i] == 'X') contd ++; if (mt [i][d] == 'X') contd2 ++; d--; for (int j = 0; j < c; j ++) { if (mt[i][j] != '?') ct ++; if (mt [i][j] == 'O') contlj2 ++; if (mt [j][i] == 'O') contcj2 ++; if (mt [i][j] == 'X') contl ++; if (mt [j][i] == 'X') contc ++; } if (contl == 3 || contd == 3 || contc == 3 || contd2 == 3) { cont_p1++; cout << "Player 1 wins!" << endl; if(op == 1) { cout <<" Ranking:\nPlayer 1:"<< cont_p1 <<"\nPlayer 2:"<< cont_p2 <<"\n"; } else { cout <<" Ranking:\nPlayer 1:"<< cont_p1 <<"\nCPU:"<< cont_cpu <<"\n"; } return true; } if (contlj2 == 3 || contdj2 == 3 || contcj2 == 3 || contd2j2 == 3) { if(op == 1) { cout << "Player 2 wins!" << endl; cont_p2++; cout <<" Ranking:\nPlayer 1:"<< cont_p1 <<"\nPlayer 2:"<< cont_p2 <<"\n"; } else { cout << "CPU wins!" << endl; cont_cpu++; cout <<" Ranking:\nPlayer 1:"<< cont_p1 <<"\nCPU:"<< cont_cpu <<"\n"; } return true; } } if (ct==l*c) { cout << "We tied!\n" << endl; if(op == 1) { cout <<" Ranking:\nPlayer 1:"<< cont_p1 <<"\nPlayer 2:"<< cont_p2 <<"\n"; } else cout <<" Ranking:\nPlayer 1:"<< cont_p1 <<"\nCPU:"<< cont_cpu <<"\n"; return true; } return false; } void cpu(char mt[l][c]) { /* initialize random seed: */ srand (time(NULL)); int x,cont; bool found = false; while(found == false) { x = rand()%9+1; cont = 1; for(int i = 0; i < l; i++ ) { for(int j = 0; j < c; j++ ) { if(cont == x) { if(mt[i][j] != 'X' && mt[i][j] != 'O') { mt[i][j] = 'O'; found = true; } } cont++; } } } } void cpu_hard(char mt[l][c]) { int d = c-1 ;// auxiliary variable for secondary diagonal int contd = 0 ;// counter diagonal int contd2 = 0 ;// counter for secondary diagonal int contc ;// counter for column int contl ;// counter for line player 1 int contd_Cpu = 0 ;// counter diagonal for cpu int contd2_Cpu = 0 ;// counter for secondary diagonal of cpu int contc2;// counter for the column cpu int contl2;// counter for line cpu bool found = false; for (int i = 0; i < l; i ++) { contc = 0; contl = 0; contc2 = 0; contl2 = 0; if (mt [i][i] == 'X') contd ++; if (mt [i][d] == 'X') contd2 ++; if (mt [i][i] == 'O') contd_Cpu ++; if (mt [i][d] == 'O') contd2_Cpu ++; d--; for (int j = 0; j < c; j ++) { if (mt [i][j] == 'X') contl ++; if (mt [j][i] == 'X') contc ++; if (mt [i][j] == 'O') contl2 ++; if (mt [j][i] == 'O') contc2 ++; } if(contd2_Cpu == 2 || contc2 == 2 || contd_Cpu == 2 || contl2 == 2) { if (contl2 == 2) { for (int z = 0; z < c; z ++) { if (mt [i][z] == '?') { mt[i][z] = 'O'; found = true; } } } else if(contd_Cpu == 2) { for (int z = 0; z < c; z ++) { if (mt [z][z] == '?') { mt[z][z] = 'O'; found = true; } } } else if(contc2 == 2) { for (int z = 0; z < c; z ++) { if (mt [z][i] == '?') { mt[z][i] = 'O'; found = true; } } } else if(contd2_Cpu == 2) { int x = 0; for (int z = c-1; z >= 0; z --) { if (mt [x][z] == '?') { mt[x][z] = 'O'; found = true; } x++; } } } else { if (contl == 2) { for (int z = 0; z < c; z ++) { if (mt [i][z] == '?') { mt[i][z] = 'O'; found = true; } } } else if(contd == 2) { for (int z = 0; z < c; z ++) { if (mt [z][z] == '?') { mt[z][z] = 'O'; found = true; } } } else if(contc == 2) { for (int z = 0; z < c; z ++) { if (mt [z][i] == '?') { mt[z][i] = 'O'; found = true; } } } else if(contd2 == 2) { int x = 0; for (int z = c-1; z >= 0; z --) { if (mt [x][z] == '?') { mt[x][z] = 'O'; found = true; } x++; } } } if(found) break; } if(!found) cpu(mt); } string changeName1() { string name1; cout << "Enter name of player 1" << endl; getline(cin, name1); return name1; } string changeName2() { string name2; cout << "Enter name of player 2" << endl; getline(cin, name2); return name2; }
Output