Você está na página 1de 14

#include <iostream>

#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#define LIMPAR_TELA "cls"

using namespace std;

class Casa
{
public:
int dominado_por;

Casa(void) //;função CASA


{
dominado_por = 0;
}
};

class Linha
{
public:
Casa casa1;//Coluna 1
Casa casa2;//Coluna 2
Casa casa3;//Coluna 3
};

Linha linha1;//Linha 1
Linha linha2;//Linha 2
Linha linha3;//Linha 3

void domina_casa(int i, int j, int dominador)//Função casa de domina


{
Linha *aux;

if (j == 1)//se J for igual a 1


aux = &linha1;//Linha 1 copia para a variavel aauxiliar
else if (j == 2)//se J for igual a 2
aux = &linha2;//Linha 2 copia para a variavel aauxiliar
else if (j == 3)//se J for igual a 3
aux = &linha3;//Linha 3 copia para a variavel aauxiliar

if (i == 1)//se for igual a 1


aux->casa1.dominado_por = dominador;//Auxiliar manda para casa1 que fica igual
ao dominador
else if (i == 2)//se for igual a 2
aux->casa2.dominado_por = dominador;//Auxiliar manda para casa2 que fica igual
ao dominador
else if (i == 3)//se for igual a 3
aux->casa3.dominado_por = dominador;//Auxiliar manda para casa3 que fica igual
ao dominador
}

int checa_casa(int i, int j)//Função Checa casa


{
Linha *aux;

if (j == 1)//se J for igual a 1


aux = &linha1;//Linha 1 copia para a variavel aauxiliar
else if (j == 2)//se J for igual a 2
aux = &linha2;//Linha 2 copia para a variavel aauxiliar
else if (j == 3)//se J for igual a 3
aux = &linha3;//Linha 3 copia para a variavel aauxiliar

if (i == 1)//se for igual a 1


return aux->casa1.dominado_por;//Devolve para a função checa casa se for casa 1
else if (i == 2)//se for igual a 2
return aux->casa2.dominado_por;//Devolve para a função checa casa se for casa 2
else if (i == 3)//se for igual a 3
return aux->casa3.dominado_por;//Devolve para a função checa casa se for casa 3
}

void desenhar_jogo()//Função Desenhar o jogo


{
int j, i;
int aux;

cout << "+---+---+---+\n";//Desenho do jogo


for (j = 1; j <= 3; j++)//laço de repetição
{
cout << "|";//para fazer as colunas
for (i = 1; i <= 3; i++)
{
aux = checa_casa(i,j);
if (aux == 0)
cout << " ";
else if (aux == 1)
cout << " X ";
else if (aux == 2)
cout << " O ";
cout << "|";//para fazer as colunas
}
cout << "\n+---+---+---+\n";//Desenho do jogo
}
}

int checa_win()//Função Vitoria


{
int aux1, aux2, aux3;//Variaveis ultilizada
int i;//Variaveis ultilizada

for (i = 1; i <= 3; i++)//laço de Repeti~/ap


{
aux1 = checa_casa(1,i);//aux recebe o valor da função checa casa na posição 1
dependendo do "i" do laço for
aux2 = checa_casa(2,i);//aux recebe o valor da função checa casa na posição 2
dependendo do "i" do laço for
aux3 = checa_casa(3,i);//aux recebe o valor da função checa casa na posição 3
dependendo do "i" do laço for
if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))//se auxiliar 1 for igual o 2 e
auxliar 2 for igual ao 3 e auuxiliar 3 for diferente de 0, então faça: o bloco de comando
return aux1;//Retorna o valor da variavel aux1
aux1 = checa_casa(i,1);//auxiliar 1 recebe da função chega casa o valor "i" do laço
for na coluna 1
aux2 = checa_casa(i,2);//auxiliar 1 recebe da função chega casa o valor "i" do laço
for na coluna 2
aux3 = checa_casa(i,3);//auxiliar 1 recebe da função chega casa o valor "i" do laço
for na coluna 3
if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))//se auxiliar 1 for igual o 2 e
auxliar 2 for igual ao 3 e auuxiliar 3 for diferente de 0, então faça: o bloco de comando
return aux1;//Retorna o valor da variavel aux1
}
//Se não, faça...
aux1 = checa_casa(1,1);//aux1 recebe o valor da função checa casa na posição "i=1" e
"j=1"
aux2 = checa_casa(2,2);//aux1 recebe o valor da função checa casa na posição "i=2" e
"j=2"
aux3 = checa_casa(3,3);//aux1 recebe o valor da função checa casa na posição "i=3" e
"j=3"
if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))
return aux1;

aux1 = checa_casa(1,3);
aux3 = checa_casa(3,1);
if ((aux1 == aux2) && (aux2 == aux3) && (aux3 != 0))
return aux1;

return 0;
}

void loop_jogo(int jogador)//funçãp do jogador (que volta a função jogador)


{
int aux;
int tmp_coluna, tmp_linha;
int confirma;

aux = 5;
while (aux != 0)//enquanto for diferente de 0
{
system(LIMPAR_TELA);
desenhar_jogo();// Fução Desenhar jogo

confirma = 5;//confirmar
while (confirma != 1)//Enquando confirma for diferente de 1, faça o bloco de
instrução
{
tmp_linha = 5;
while ((tmp_linha < 1) || (tmp_linha > 3))
{
cout << "Jogador " << jogador << ". Em que linha deseja jogar? ";
if ((scanf("%d",&tmp_linha)) == 0)
{
cout << "Huh?\n";
getchar();
}
}

tmp_coluna = 5;
while ((tmp_coluna < 1) || (tmp_coluna > 3))
{
cout << "Jogador " << jogador << ". Em que coluna deseja jogar? ";
if ((scanf("%d",&tmp_coluna)) == 0)
{
cout << "Huh?\n";
getchar();
}
}

confirma = 5;
while ((confirma < 1) || (confirma > 2))
{
cout << "Jogador " << jogador << ". Confirma? (1 Sim / 2 Nao) ";
if ((scanf("%d",&confirma)) == 0)
{
cout << "Huh?\n";
getchar();
}
}
}

aux = checa_casa(tmp_coluna,tmp_linha);
if (aux != 0)
{
cout << "Casa em uso. Escolha outra.";
getchar(); getchar();
}
}

domina_casa(tmp_coluna,tmp_linha,jogador);
}

int joga_computador()//Função Jogar com o computador, Colocamos IA "Inteligencia


Artificial"
{
int aux, aux1, aux2, aux3;//Variaveis ultilizada
int i, j;//Variaveis ultilizada

/* Level 1 AI */
aux1 = checa_casa(2,2);//aux1 recebe o valor da função checa casa da posilçao 2 e 2
if (aux1 == 0)//se o valor do aux1 for igual a 0, então ele executará o bloco de
comando
{
domina_casa(2,2,2);
return 0;//VOlta para a função com valor 0
}

for (j = 2; j >= 1; j--)


{
for (i = 1; i <= 3; i++)
{
/* Horizontais */
aux1 = checa_casa(1,i);
aux2 = checa_casa(2,i);
aux3 = checa_casa(3,i);
if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
{
aux = checa_casa(2,i);
if (aux == 0)
{
domina_casa(2,i,2);
return 0;
}
}
else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
{
aux = checa_casa(3,i);
if (aux == 0)
{
domina_casa(3,i,2);
return 0;
}
}
else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
{
aux = checa_casa(1,i);
if (aux == 0)
{
domina_casa(1,i,2);
return 0;
}
}

/* Verticais */
aux1 = checa_casa(i,1);
aux2 = checa_casa(i,2);
aux3 = checa_casa(i,3);
if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
{
aux = checa_casa(i,2);
if (aux == 0)
{
domina_casa(i,2,2);
return 0;
}
}
else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
{
aux = checa_casa(i,3);
if (aux == 0)
{
domina_casa(i,3,2);
return 0;
}
}
else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
{
aux = checa_casa(i,1);
if (aux == 0)
{
domina_casa(i,1,2);
return 0;
}
}
}

/* Diagonal Principal */
aux1 = checa_casa(1,1);
aux2 = checa_casa(2,2);
aux3 = checa_casa(3,3);
if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
{
aux = checa_casa(2,2);
if (aux == 0)
{
domina_casa(2,2,2);
return 0;
}
}
else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
{
aux = checa_casa(3,3);
if (aux == 0)
{
domina_casa(3,3,2);
return 0;
}
}
else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
{
aux = checa_casa(1,1);
if (aux == 0)
{
domina_casa(1,1,2);
return 0;
}
}

/* Diagonal Secundaria */
aux1 = checa_casa(3,1);
aux3 = checa_casa(1,3);
if ((aux1 == aux3) && (aux2 == 0) && (aux1 == j))
{
aux = checa_casa(2,2);
if (aux == 0)
{
domina_casa(2,2,2);
return 0;
}
}
else if ((aux1 == aux2) && (aux3 == 0) && (aux1 == j))
{
aux = checa_casa(1,3);
if (aux == 0)
{
domina_casa(1,3,2);
return 0;
}
}
else if ((aux2 == aux3) && (aux1 == 0) && (aux2 == j))
{
aux = checa_casa(3,1);
if (aux == 0)
{
domina_casa(3,1,2);
return 0;
}
}
}
/* Level 2 AI */

/* Defesa */
aux1 = checa_casa(1,1);
aux2 = checa_casa(3,3);
if ((aux1 == 1) && (aux2 == 1))
{
aux = checa_casa(2,1);
if (aux == 0)
{
domina_casa(2,1,2);
return 0;
}
}

aux1 = checa_casa(3,1);
aux2 = checa_casa(1,3);
if ((aux1 == 1) && (aux2 == 1))
{
aux = checa_casa(2,1);
if (aux == 0)
{
domina_casa(2,1,2);
return 0;
}
}

aux1 = checa_casa(2,1);
aux2 = checa_casa(3,2);
aux3 = checa_casa(1,2);
if ((aux1 == 1) && (aux2 == 1))
{
aux = checa_casa(3,1);
if (aux == 0)
{
domina_casa(3,1,2);
return 0;
}
}
if ((aux1 == 1) && (aux3 == 1))
{
aux = checa_casa(1,1);
if (aux == 0)
{
domina_casa(1,1,2);
return 0;
}
}
if ((aux3 == 1) && (aux2 == 1))
{
aux = checa_casa(1,1);
if (aux == 0)
{
domina_casa(1,1,2);
return 0;
}
}

aux1 = checa_casa(2,3);
if ((aux1 == 1) && (aux2 == 1))
{
aux = checa_casa(3,3);
if (aux == 0)
{
domina_casa(3,3,2);
return 0;
}
}
if ((aux1 == 1) && (aux3 == 1))
{
aux = checa_casa(1,3);
if (aux == 0)
{
domina_casa(1,3,2);
return 0;
}
}

aux1 = checa_casa(1,1);
aux2 = checa_casa(2,2);
aux3 = checa_casa(3,3);
if ((aux1 == 2) && (aux2 == 1) && (aux3 == 1))
{
aux = checa_casa(3,1);
if (aux == 0)
{
domina_casa(3,1,2);
return 0;
}
}

/* Ataque */
for (i = 1; i <= 3; i++)
{
aux1 = checa_casa(1,i);
aux2 = checa_casa(2,i);
aux3 = checa_casa(3,i);
if ((aux1 == 2) && (aux2 == 0) && (aux3 == 0))
{
aux = checa_casa(2,i);
if (aux == 0)
{
domina_casa(2,i,2);
return 0;
}
}
if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
{
aux = checa_casa(1,i);
if (aux == 0)
{
domina_casa(1,i,2);
return 0;
}
}
if ((aux3 == 2) && (aux1 == 0) && (aux2 == 0))
{
aux = checa_casa(1,i);
if (aux == 0)
{
domina_casa(1,i,2);
return 0;
}
}

aux1 = checa_casa(i,1);
aux2 = checa_casa(i,2);
aux3 = checa_casa(i,3);
if ((aux1 == 2) && (aux2 == 0) && (aux3 == 0))
{
aux = checa_casa(i,2);
if (aux == 0)
{
domina_casa(i,2,2);
return 0;
}
}
if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
{
aux = checa_casa(i,1);
if (aux == 0)
{
domina_casa(i,1,2);
return 0;
}
}
if ((aux3 == 2) && (aux1 == 0) && (aux2 == 0))
{
aux = checa_casa(i,1);
if (aux == 0)
{
domina_casa(i,1,2);
return 0;
}
}
}
aux1 = checa_casa(1,1);
aux2 = checa_casa(2,2);
aux3 = checa_casa(3,3);
if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
{
aux = checa_casa(1,1);
if (aux == 0)
{
domina_casa(1,1,2);
return 0;
}
}

aux1 = checa_casa(3,1);
aux3 = checa_casa(1,3);
if ((aux2 == 2) && (aux1 == 0) && (aux3 == 0))
{
aux = checa_casa(1,3);
if (aux == 0)
{
domina_casa(1,3,2);
return 0;
}
}

aux1 = checa_casa(1,1);
if (aux1 == 2)
{
aux2 = checa_casa(2,2);
aux3 = checa_casa(3,3);
if ((aux3 == 0) && (aux2 == 0))
{
aux1 = checa_casa(3,2);
aux2 = checa_casa(1,2);
if ((aux1 != 1) && (aux2 != 1))
{
aux1 = checa_casa(2,1);
aux2 = checa_casa(2,3);
if ((aux1 != 1) && (aux2 != 1))
{
aux = checa_casa(3,3);
if (aux == 0)
{
domina_casa(3,3,2);
return 0;
}
}
}
}
}

for (i = 1; i <= 3; i++)


{
aux1 = checa_casa(1,i);
aux2 = checa_casa(2,i);
aux3 = checa_casa(3,i);
if (aux1 == 0)
{
domina_casa(1,i,2);
return 0;
}
else if (aux2 == 0)
{
domina_casa(2,i,2);
return 0;
}
else if (aux3 == 0)
{
domina_casa(3,i,2);
return 0;
}

aux1 = checa_casa(i,1);
aux2 = checa_casa(i,2);
aux3 = checa_casa(i,3);
if (aux1 == 0)
{
domina_casa(i,1,2);
return 0;
}
else if (aux2 == 0)
{
domina_casa(i,2,2);
return 0;
}
else if (aux3 == 0)
{
domina_casa(i,3,2);
return 0;
}
}
}

int main()//Função MAIN


{
int i;
int tipo_de_jogo = 5;//Opcão
int jogador = 0;
int aux;//Variavel auxiliar

cout << "TIO DKL / Diego - Kleber - Leo\n";//Nosso titolo


system ("pause");
while ((tipo_de_jogo < 0) || (tipo_de_jogo > 2))//faça se for menor que 0 ou maior que
2
{
system(LIMPAR_TELA);

cout << "1 Jogador contra Jogador\n";//Menu


cout << "2 Jogador contra Computador\n";//Menu
cout << "0 Sair\n";//Menu

if ((scanf("%d",&tipo_de_jogo)) == 0)//Para entrar no Jogo


{
cout << "Huh?\n";//se for numeto desconhecido
getchar();//Capturar a tecla que foi digitado
}
}

if (tipo_de_jogo == 0)//Se for igual a zero


return 0;// Aqui sai do jogo, retornando a função main com !

else if (tipo_de_jogo == 1)//se for o menu igual a 1 , então faça o bloco de comando
{
for (i = 0; i < 9; i++)//Entra no Lop
{
jogador++;//Incrementa o jogador
if (jogador > 2)//se jogador for iguak
jogador = 1;//jogador igual a 1

loop_jogo(jogador);

aux = checa_win();//Busca a fução Vencedor e joga na variavel auxiliar


if (aux != 0)// Se auxiliar for diferente de 0 então
{
system(LIMPAR_TELA);//LImpar a tela
desenhar_jogo();//Busca a função desenho do jogo

cout << "Vencedor: Jogador " << aux << "!";//Mensagem jogador "vencedor"
getchar(); getchar();//pause
return 0;//sair do jogo
}
}
}
else if (tipo_de_jogo == 2)
{
for (i = 0; i < 9; i++)//Laço de repetição
{
jogador++;
if (jogador > 2)//se a variavel jogador for maior que 2
jogador = 1;//jogador recebe 1

if (jogador == 1)//se a variavel jogador for igual a 1, então faça


loop_jogo(jogador);
else if (jogador == 2)//se a variavel jogador for igual a 2, então faça
joga_computador();//busca a fução da inteligencia artificial

aux = checa_win();//Busca a fução


if (aux != 0)//SE TIPO for diferente de 0 então entra faça o bloco de comando
{
system(LIMPAR_TELA);// Limpar a Tela
desenhar_jogo();//Busca a Função desenhar o jogo

if (aux == 1)//Se o auxiliar for igla a 1, então jogador vencel


cout << "Vencedor: Jogador!";
else if (aux == 2)//se não o computador venceu
cout << "Vencedor: Computador!";

getchar(); getchar();//Para sair do jogo


return 0;//para retornar o valor do main
}
}
}

if (tipo_de_jogo != 0)//SE TIPO for diferente de 0 então entra faça o bloco de


comando
{
system(LIMPAR_TELA);
desenhar_jogo();//Busca a Função desenhar o jogo

cout << "Empate!";//Messagem de EMPATE


getchar(); getchar();//Para sair do jogo
return 0;//para retornar o valor do main
}
}

Você também pode gostar