Bueno, creo que sólo hace falta el ui_mainwindow.h o el *.ui para poder ejecutar tu programa.
Por otro lado releyendo el mensaje ya veo que lo que pides es cómo implementar la función Ganado() para que funcione y no se salga de los límites.
A ver si en pseudocódigo:
variables de partida:
int lineadecuatro =0;
//buscar horizontales
recorro el tablero por filas
fila 0:
Si columna 0 tiene mi ficha, incrementar variable lineadecuatro
Si la variable lineadecuatro==4 retornar true y salir de la función
si no es así, volver a poner lineadecuatro a 0, para no acumular "trues" no consecutivos
Seguir así con columna 1, columna 2, etc....
si la fila 0 no contenía ninguna poner lineadecuatro a 0 y repetir con la siguiente fila
//horizontales:
Sería lo mismo pero recorriendo el array en vertical
//diagonales
Aquí es menos automático.
Entiendo que hay que hacer el barrido de derecha-arriba, luego derecha-abajo, luego izquierda-arriba y luego izquierda-abajo
Para el primer caso (derecha-arriba)
Puedes partir de que no merece la pena leer hasta la fila 3 (la 4 del array) porque antes no hay posibilidad de 4 en raya, y que cuando llegues a la columna 4 tampoco por la misma cuestión
Y luego hay que ir probando por cada fila (o columna) y siguiendo la misma técnica, recorrer las casillas que tengan una fila menos y una columna mas.
Para el resto de recorridos, el planteamiento es parecido pero cambiando los límites de búsqueda y los incrementos/decrementos de fila/columna para que vayan en diagona izquierda/derecha arriba/abajo.
Bueno, y he hecho un poco de código.
Es un programa que crea un tablero. Lo he hecho con bool siendo false donde no hay ficha y true donde sí las hay.
He rellenado el tablero en los casos horizontales, verticales y uno de los casos de diagonal.
Creo que la búsqueda horizontal y vertical funcionan sin problemas.
La búsqueda diagonal, sólo está implementada en el caso de buscar en dirección derecha-superior. Además no la he comprobado mucho, así que no pongo la mano en el fuego por ella. Pero la idea es la que te comenté más arriba.
Código C++:
Ver original#include <iostream>
using namespace std;
const int FILAS=6;
const int COLUMNAS=7;
bool buscar (bool tablero[FILAS][COLUMNAS]);
void inicializarTablero (bool tablero[FILAS][COLUMNAS]);
int main()
{
bool tablero[FILAS][COLUMNAS];
inicializarTablero(tablero);
//pongo una linea de 4 horizontal en la fila 3 COLUMNAS 3 a 6
for (int i=3; i<7; i++)
{
tablero[3][i]=true;
}
//recorro el tablero buscando lineas
buscar (tablero);
//pongo el tablero a 0 y pongo una linea vertical
inicializarTablero(tablero);
//pongo una linea de 4 vertical en la columna 3 FILAS 2 a 5
for (int i=2; i<6; i++)
{
tablero[i][3]=true;
}
//recorro el tablero buscando lineas
buscar(tablero);
//pongo el tablero a 0 y pongo una diagonal en (3,0)-(2,1)-(1,2)-(0,3)
inicializarTablero(tablero);
tablero[3][0]=true;
tablero[2][1]=true;
tablero[1][2]=true;
tablero[0][3]=true;
//recorro el tablero buscando lineas
buscar(tablero);
return 0;
}
bool buscar (bool tablero[FILAS][COLUMNAS])
{
int lineadecuatro=0;
//busqueda horizontal
for (int i=0; i<FILAS; i++)
{
for (int j=0; j<COLUMNAS; j++)
{
if (tablero[i][j]==true)
{
lineadecuatro++;
if (lineadecuatro==4)
{
cout<<"Encontrada combinación en fila "<<i<<" y columnas "<<j-3<<","<<j<<endl;
return true;
}
}
else
{
lineadecuatro=0;
}
}
lineadecuatro=0;
}
lineadecuatro=0;
//busqueda vertical
for (int i=0; i<FILAS; i++)
{
for (int j=0; j<COLUMNAS; j++)
{
if (tablero[j][i]==true)
{
lineadecuatro++;
if (lineadecuatro==4)
{
cout<<"Encontrada combinación en columna "<<i<<" y filas "<<j-3<<","<<j<<endl;
return true;
}
}
else
{
lineadecuatro=0;
}
}
lineadecuatro=0;
}
lineadecuatro=0;
//diagonal
/********primer barrido diagonal hacia arriba****/
for (int j=0; j-COLUMNAS-3; j++)
{
for (int i=3; i<FILAS; i++)
{
int fila=i;
int columna=j;
while (fila>=0)
{
if (tablero[fila][columna]==true)
{
cout<<"True en: "<<fila<<" , "<<columna<<endl;
lineadecuatro++;
if (lineadecuatro==4)
{
cout<<"Encontrada diagonal"<<endl;
return true;
}
}
fila--;
columna++;
}
lineadecuatro=0;
}
lineadecuatro=0;
/*****siguiente barrido, por ejemplo diagonal hacia abajo*****/
}
//si llego hasta aqui es porque no había ninguna fila de 4
return false;
}
void inicializarTablero (bool tablero[FILAS][COLUMNAS])
{
for (int i=0; i<FILAS; i++)
{
for (int j=0; j<COLUMNAS; j++)
{
tablero[i][j]=false;
}
}
}
Creo que con una pocas adaptaciones lo puedes adaptar a tu función Ganado().