/* 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

If you like this Article, then don’t forget to Click on Social likes buttons.