Son algunos errores, mira por ahi le hice unos aumentos y correcciones a tu código y creo funciona perfectamente:
Código C++:
Ver original#include <stdio.h>
#define fila 3
#define columna 3
// "1" es el jugador humano, "2" el ordenador, "0" significa que esta vacia
int tablero [fila][columna], turno, jugadas=0;
void jugada_maquina() //pone la ficha del ordenador en un lugar cualquiera, intentando que sea la mejor posicion
{
int i=0,j=0,id2=2,si=0,ndiaguno=0,ndiagdos=0,ndiaguno1=0,ndiagdos1=0,cfila=0,ccol=0,cfila1=0,ccol1=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(tablero [i][j]==1)
cfila++;
if(tablero [j][i]==1)
ccol++;
if(tablero [i][j]==2)
cfila1++;
if(tablero [j][i]==2)
ccol1++;
}
if(tablero[i][i]==1)
ndiaguno++;
if(tablero [i][i+id2]==1)
ndiagdos++;
if(tablero[i][i]==2)
ndiaguno1++;
if(tablero [i][i+id2]==2)
ndiagdos1++;
id2=id2-2;
if(cfila==2||cfila1==2)
{
if(tablero[i][0]==0)
{
tablero[i][0]=2;
si=1;
}
else
{
if(tablero[i][1]==0)
{
tablero[i][1]=2;
si=1;
}
else
{
if(tablero[i][2]==0)
{
tablero[i][2]=2;
si=1;
}
}
}
}
if(si==0)
{
if(ccol==2||ccol1==2)
{
if(tablero[0][i]==0)
{
tablero[0][i]=2;
si=1;
}
else
{
if(tablero[1][i]==0)
{
tablero[1][i]=2;
si=1;
}
else
{
if(tablero[2][i]==0)
{
tablero[2][i]=2;
si=1;
}
}
}
}
}
if(si==1)
{
i=3;
j=3;
}
else
{
cfila=0;
ccol=0;
cfila1=0;
ccol1=0;
}
}
if(si==0)
{
if(ndiaguno==2||ndiaguno1==2)
{
if(tablero[0][0]==0)
{
tablero[0][0]=2;
si=1;
}
else
{
if(tablero[1][1]==0)
{
tablero[1][1]=2;
si=1;
}
else
{
if(tablero[2][2]==0)
{
tablero[2][2]=2;
si=1;
}
}
}
}
}
if(si==0)
{
if(ndiagdos==2||ndiagdos1==2)
{
if(tablero[0][2]==0)
{
tablero[0][2]=2;
si=1;
}
else
{
if(tablero[1][1]==0)
{
tablero[1][1]=2;
si=1;
}
else
{
if(tablero[2][0]==0)
{
tablero[2][0]=2;
si=1;
}
}
}
}
}
if(si==0)
{
for(i=0; i<3; i++)
for(j=0; j<3; j++)
if(tablero[i][j]==0)
{
tablero[i][j]=2;
i=3;
j=3;
}
}
}
//Inicializar el tablero todo blanco
void inicia_tablero()
{
int i, j;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
tablero[i] [j] = 0 ;
}
int jugada_valida(int f, int d) // comprueba si lo que se quiere hacer es valido o no
{
if(f<3 && d<3 && tablero[f][d]== 0)
return 1; // jugada valida
else
return 0; // jugada invalida
}
void jugada_usuario(int f, int d)
{
if(jugada_valida(f,d)==1)
tablero[f][d]=1;
}
void imprimir()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
if(tablero[i][j]!=0)
else
}
}
int ganar_perder_empatar()
{
int resultado=0,vacios=0,i,j,sumafila=0,sumacolumna=0,sumadiagonal1=0;
int sumadiagonal2=0; // tiene 0 si gana, 1 si pierde
if(tablero[0][0]!=0&&tablero[1][1]!=0&&tablero[2][2]!=0)
sumadiagonal1=tablero[0][0]+tablero[1][1]+tablero[2][2];
if(tablero[0][2]!=0&&tablero[1][1]!=0&&tablero[2][0]!=0)
sumadiagonal2=tablero[0][2]+tablero[1][1]+tablero[2][0];
if(sumadiagonal1==3||sumadiagonal2==3)
resultado=1;
else
{
if(sumadiagonal1==6||sumadiagonal2==6)
resultado=2;
else
{
for(i=0;i<3;i++)
{
if(tablero[i][0]!=0&&tablero[i][1]!=0&&tablero[i][2]!=0)
sumafila=tablero[i][0]+tablero[i][1]+tablero[i][2];
if(tablero[0][i]!=0&&tablero[1][i]!=0&&tablero[2][i]!=0)
sumacolumna=tablero[0][i]+tablero[1][i]+tablero[2][i];
if(sumafila==3||sumacolumna==3)
{
resultado=1;
i=3;
}
else
{
if(sumafila==6||sumacolumna==6)
{
resultado=2;
i=3;
}
else
resultado=-1;
}
}
}
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(tablero[i][j]==0)
vacios=1;
if(resultado==-1&&vacios==0)
resultado=0;
return resultado;
}
int main()
{
int f, c,resultado;
printf("elije quien empieza: 1. tu 2. cpu \n");
inicia_tablero();
do
{
jugadas++;
if(turno==1)
{
do
{
printf("\nIngresa la posicion (fila,columna): ");
if(jugada_valida(f,c)==0)
{
}
}while(jugada_valida(f, c)==0);
jugada_usuario(f, c);
}
else if(turno==2)
{
jugada_maquina();
}
imprimir();
resultado=ganar_perder_empatar();
if(resultado==1)
else
{
if(resultado==2)
else
if(resultado==0)
printf("\n\nPartida Empatada\n"); }
if(turno==1)
turno=2;
else
turno=1;
}while(resultado==-1);
printf("\n\nPulsa una tecla para salir...\n"); return 0;
}
Pruebalo, Estudialo, trata de entenderlo, y cualquier aclaración me la pides.
Indicacion extra:
las fila y colunmas van desde 0 - 2, es decir:
0,0 | 0,1 | 0,2
1,0 | 1,1 | 1,2
2,0 | 2,1 | 2,2