212
>
//#################################################################
// ##
// X si 0 metoda 3 ##
// ##
//#################################################################
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
int tabla[9], muta, mutare, nrlist, meritmaxim, iesire=0;
typedef struct lista
{
int cc[9];
int mc;
};
struct lista urm[20];
int castig()
{
if(tabla[0]*tabla[1]*tabla[2]==27) return 1; //castiga X
else if(tabla[0]*tabla[1]*tabla[2]==125) return 2; //castiga 0
else if(tabla[3]*tabla[4]*tabla[5]==27) return 1;
else if(tabla[3]*tabla[4]*tabla[5]==125) return 2;
else if(tabla[6]*tabla[7]*tabla[8]==27) return 1;
else if(tabla[6]*tabla[7]*tabla[8]==125) return 2;
else if(tabla[0]*tabla[3]*tabla[6]==27) return 1;
else if(tabla[0]*tabla[3]*tabla[6]==125) return 2;
else if(tabla[1]*tabla[4]*tabla[7]==27) return 1;
else if(tabla[1]*tabla[4]*tabla[7]==125) return 2;
else if(tabla[2]*tabla[5]*tabla[8]==27) return 1;
else if(tabla[2]*tabla[5]*tabla[8]==125) return 2;
else if(tabla[0]*tabla[4]*tabla[8]==27) return 1;
else if(tabla[0]*tabla[4]*tabla[8]==125) return 2;
else if(tabla[2]*tabla[4]*tabla[6]==27) return 1;
else if(tabla[2]*tabla[4]*tabla[6]==125) return 2;
else return 0;
}
void init()
{
for(int i=0;i<9;i++) tabla[i]=2;
nrlist=-1;
muta=0;
meritmaxim=0;
}
char tabaf(int as)
{
if(as==2) return ' ';
else if(as==3) return 'X';
else if(as==5) return 'O';
else return ' ';
}
void afis()
{
cout<<"_______n";
cout<<"|"<<tabaf(tabla[0])<<"|"<<tabaf(tabla[1])<<"|"<<tabaf(tabla[2])<<"|";
cout<<"n|"<<tabaf(tabla[3])<<"|"<<tabaf(tabla[4])<<"|"<<tabaf(tabla[5])<<"|";
cout<<"n|"<<tabaf(tabla[6])<<"|"<<tabaf(tabla[7])<<"|"<<tabaf(tabla[8])<<"|";
cout<<"n-------n";
}
int mut_valid(int cemut)
{
if(tabla[cemut]!=2)
{
cout<<"nMutare invalida! mai incearca!n";
return 1;
}
else return 0;
}
int citeste_mutare()
{
cout<<"Muta: ";
cin>>muta;
while(mut_valid(muta-1))
{
cout<<"Muta: ";
cin>>muta;
}
return muta-1;
}
void move(int ce)
{
tabla[ce]=3;
}
void clear_list()
{
for(int i=0;i<=nrlist;i++)
for(int j=0;j<=8;j++)
urm[i].cc[j]=-1;
nrlist=-1;
}
int valid_move(int cemut)
{
if(tabla[cemut]!=2) return 0;
else return 1;
}
//copiaza pe a in b
void copyvec(int a[9],int b[9])
{
for(int i=0;i<=8;i++)
b[i]=a[i];
}
int posibilitate_castig_om(int tabla[9])
{
if(tabla[0]*tabla[1]*tabla[2]==18) return 2;
else if(tabla[3]*tabla[4]*tabla[5]==18) return 2;
else if(tabla[6]*tabla[7]*tabla[8]==18) return 2;
else if(tabla[0]*tabla[3]*tabla[6]==18) return 2;
else if(tabla[1]*tabla[4]*tabla[7]==18) return 2;
else if(tabla[2]*tabla[5]*tabla[8]==18) return 2;
else if(tabla[0]*tabla[4]*tabla[8]==18) return 2;
else if(tabla[2]*tabla[4]*tabla[6]==18) return 2;
else return 0;
}
int posibil_castig_calc_prima_mutare(int tabla[9])
{
if(tabla[0]*tabla[1]*tabla[2]==125) return 4;
else if(tabla[3]*tabla[4]*tabla[5]==125) return 4;
else if(tabla[6]*tabla[7]*tabla[8]==125) return 4;
else if(tabla[0]*tabla[3]*tabla[6]==125) return 4;
else if(tabla[1]*tabla[4]*tabla[7]==125) return 4;
else if(tabla[2]*tabla[5]*tabla[8]==125) return 4;
else if(tabla[0]*tabla[4]*tabla[8]==125) return 4;
else if(tabla[2]*tabla[4]*tabla[6]==125) return 4;
else return 0;
}
int posibil_castig_calc_doua_mutare(int tabla[9])
{
if(tabla[0]*tabla[1]*tabla[2]==50) return 6;
else if(tabla[3]*tabla[4]*tabla[5]==50) return 6;
else if(tabla[6]*tabla[7]*tabla[8]==50) return 6;
else if(tabla[0]*tabla[3]*tabla[6]==50) return 6;
else if(tabla[1]*tabla[4]*tabla[7]==50) return 6;
else if(tabla[2]*tabla[5]*tabla[8]==50) return 6;
else if(tabla[0]*tabla[4]*tabla[8]==50) return 6;
else if(tabla[2]*tabla[4]*tabla[6]==50) return 6;
else return 0;
}
int determina_merit(int config[9])
{
//merit=0 - mutare irelevanta
//merit=1 - castiga calculatorul din a doua mutare
//merit=2 - calc poate muta in mijloc si il avantajeaza
//merit=3 - omul poate castiga, iar calc ii poate bara mutarea
//merit=4 - calc castiga din a doua mutare
int merit=0;
if( posibilitate_castig_om(tabla)==2 && posibilitate_castig_om(config)==0) merit=3;
else if(tabla[4]==2 && config[4]==5) merit=2;
else if(posibil_castig_calc_prima_mutare(config)==4) merit=4;
else if(posibil_castig_calc_doua_mutare(config)==6) merit=1;
return merit;
}
void move_calc()
{
int aux_move[9], contor=0;
meritmaxim=0;
clear_list(); //goleste lista ptr a insera noi valori
//Stabileste care sunt urmatoarele mutari posibile si memoreaza-le in urm
for(int i=0;i<=8;i++)
if(valid_move(i))
{
contor++;
copyvec(tabla,aux_move); //copiaza tabla in aux_move
aux_move[i]=5;
nrlist++;
copyvec(aux_move,urm[nrlist].cc);
urm[nrlist].mc=determina_merit(aux_move);
if(urm[nrlist].mc>meritmaxim) meritmaxim=urm[nrlist].mc;
}
if(contor==0) iesire=1;
//parcurge urm, sel prima mutare cu merit maxim, rescrie noua tabla
if(contor!=0) for(i=0;i<=nrlist;i++)
if(urm[i].mc==meritmaxim) { copyvec(urm[i].cc,tabla); break; }
}
void main()
{
clrscr();
init();
mutare=1;
while( (mutare<10) && (castig()==0) )
{
move(citeste_mutare());
afis();
if(castig()!=0) break;
move_calc();
afis();
if(castig()!=0) break;
if(iesire==1) break;
mutare++;
if( mutare>6 && posibilitate_castig_om(tabla)==0 && posibil_castig_calc_prima_mutare(tabla)==0 && posibil_castig_calc_doua_mutare(tabla)==0) break;
}
cout<<"nGame Over!";
getch();
clrscr();
afis();
if(castig()==0) cout<<"Egalitate!!!";
else cout<<"A castigat jucatorul "<<castig()<<"!";
getch();
}