#include <stdio.h>
int enraya(int tab[][7], int j);
int mirarhoriz(int tab[][7], int f, int c, int j);
int mirarvert(int tab[][7], int f, int c, int j);
int mirardiagI(int tab[][7], int f, int c, int j);
int mirardiagD(int tab[][7], int f, int c, int j);
int esta_lleno(int tab[][7]);
void vaciar_tablero(int tab[][7]);
int pintar_tablero(int tab[][7]);
void poner_ficha(int tab[][7], int j);
void main(void)
{
int tablero[6][7];
int jugar;
int x;
int jugador;
jugar=1;
while(jugar==1)
{
//vaciamos el tablero
vaciar_tablero(tablero);
jugador=1;
//pintamos el tablero
pintar_tablero(tablero);
//si el tablero no está lleno ni hay 4 en raya se continúa la partida
while((!enraya(tablero,jugador)) && (!esta_lleno(tablero)))
{
poner_ficha(tablero,jugador);
if(jugador==1)jugador=2;
else jugador=1;
pintar_tablero(tablero);
}
//si hay 4 en raya se dice quien ganó y se pregunta si se quiere continuar jugando
if(enraya(tablero,jugador))
{
if(jugador==1)printf("gano 2");
else printf("gano 1");
}
else printf("\nempate");
printf("\notra?(s/n)");
scanf("%c", &x);
if(x=='n')jugar=0;
}
}
//función para comprobar si hay 4 en raya
int enraya(int tab[][7], int j)
{
int f;
int c;
int atopado;
atopado=0;
f=0;
while((atopado==0) || (f<=5))
{
c=0;
while((atopado==0) && (c<=6))
{
atopado=(mirarhoriz(tab,f,c,j) ||
mirarvert(tab,f,c,j) || mirardiagI(tab,f,c,j)
|| mirardiagD(tab,f,c,j));
c++;
}
f++;
}
return atopado;
}
//función para comprobar si hay 4 en raya en horizontal
int mirarhoriz(int tab[][7], int f, int c, int j)
{
int atopado=0;
if(c<4)
{
if((tab[f][c]==j) && (tab[f][c+1]==j) && (tab[f][c+2]==j) &&
(tab[f][c+3]==j))atopado=1;
else atopado=0;
}
else atopado=0;
return atopado;
}
//función para comprobar si hay 4 en raya en vertical
int mirarvert(int tab[][7], int f, int c, int j)
{
int atopado=0;
if(f<3)
{
if((tab[f][c]==j) && (tab[f+1][c]==j) && (tab[f+2][c]==j) &&
(tab[f+3][c]==j))atopado=1;
else atopado=0;
return atopado;
}
}
//función para comprobar si hay 4 en raya en diagonal izquierda
int mirardiagI(int tab[][7], int f, int c, int j)
{
int atopado=0;
if((c>2) && (f<3))
{
if((tab[f][c]==j) && (tab[f+1][c-1]==j) && (tab[f+2][c-2]==j) &&
(tab[f+3][c-3]==j))atopado=1;
else atopado=0;
}
else atopado=0;
return atopado;
}
//función para comprobar si hay 4 en raya en diagonal derecha (esta es la que falla)
int mirardiagD(int tab[][7], int f, int c, int j)
{
int atopado=0;
if((c>4) && (f<3))
{
if((tab[f][c]==j) && (tab[f+1][c+1]==j) && (tab[f+2][c+2]==j) &&
(tab[f+3][c+3]==j))atopado=1;
else atopado=0;
}
else atopado=0;
printf("%d", atopado);
return atopado;
}
//función para vaciar el tablero al principio de la partida
void vaciar_tablero(int tab[][7])
{
int c;
int f=0;
while(f<=5)
{
c=0;
while(c<=6)
{
tab[f][c]=0;
c++;
}
f++;
}
}
//función para pintar el tablero en pantalla
int pintar_tablero(int tab[][7])
{
int f;
int c;
f=0;
printf("\n");
while(f<=5)
{
c=0;
while(c<=6)
{
if(tab[f][c]!=0)
{
if(tab[f][c]==1)printf("A");
else printf("B");
}
else printf("O");
c++;
}
f++;
printf("\n");
}
}
//función para comprobar si el tablero está lleno
int esta_lleno(int tab[][7])
{
int lleno=1;
int f=0;
int c;
while((f<=5) && (lleno))
{
c=0;
while((c<=6) && (lleno))
{
if(tab[f][c]==0)lleno=0;
c++;
}
f++;
}
return lleno;
}
//función para poner fichas
void poner_ficha(int tab[][7], int j)
{
int c, f=5, jugada, turno=0;
printf("\nJugador %d, introduzca columna: ", j);
scanf("%d", &jugada);
while(turno==0)
{
if(f>=0)
{
if(tab[f][jugada-1]==0)
{
tab[f][jugada-1]=j;
turno=1;
}
}
f--;
}
}