Ver Mensaje Individual
  #4 (permalink)  
Antiguo 06/06/2014, 05:15
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Juego 4 en raya

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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const int FILAS=6;
  5. const int COLUMNAS=7;
  6. bool buscar (bool tablero[FILAS][COLUMNAS]);
  7. void inicializarTablero (bool tablero[FILAS][COLUMNAS]);
  8. int main()
  9. {
  10.  
  11.     bool tablero[FILAS][COLUMNAS];
  12.     inicializarTablero(tablero);
  13.  
  14.     //pongo una linea de 4 horizontal en la fila 3 COLUMNAS 3 a 6
  15.     for (int i=3; i<7; i++)
  16.         {
  17.             tablero[3][i]=true;
  18.         }
  19.  
  20.     //recorro el tablero buscando lineas
  21.     buscar (tablero);
  22.  
  23.     //pongo el tablero a 0 y pongo una linea vertical
  24.     inicializarTablero(tablero);
  25.     //pongo una linea de 4 vertical en la columna 3 FILAS 2 a 5
  26.     for (int i=2; i<6; i++)
  27.         {
  28.             tablero[i][3]=true;
  29.         }
  30.     //recorro el tablero buscando lineas
  31.     buscar(tablero);
  32.  
  33.     //pongo el tablero a 0 y pongo una diagonal en (3,0)-(2,1)-(1,2)-(0,3)
  34.     inicializarTablero(tablero);
  35.     tablero[3][0]=true;
  36.     tablero[2][1]=true;
  37.     tablero[1][2]=true;
  38.     tablero[0][3]=true;
  39.     //recorro el tablero buscando lineas
  40.     buscar(tablero);
  41.  
  42.  
  43.  
  44.  
  45.     return 0;
  46. }
  47.  
  48. bool buscar (bool tablero[FILAS][COLUMNAS])
  49. {
  50.     int lineadecuatro=0;
  51.     //busqueda horizontal
  52.     for (int i=0; i<FILAS; i++)
  53.         {
  54.             for (int j=0; j<COLUMNAS; j++)
  55.                 {
  56.                     if (tablero[i][j]==true)
  57.                         {
  58.                             lineadecuatro++;
  59.                             if (lineadecuatro==4)
  60.                                 {
  61.                                     cout<<"Encontrada combinación en fila "<<i<<" y columnas "<<j-3<<","<<j<<endl;
  62.                                     return true;
  63.                                 }
  64.                         }
  65.                     else
  66.                     {
  67.                         lineadecuatro=0;
  68.                     }
  69.                 }
  70.             lineadecuatro=0;
  71.         }
  72.     lineadecuatro=0;
  73.     //busqueda vertical
  74.     for (int i=0; i<FILAS; i++)
  75.         {
  76.             for (int j=0; j<COLUMNAS; j++)
  77.                 {
  78.                     if (tablero[j][i]==true)
  79.                         {
  80.                             lineadecuatro++;
  81.                             if (lineadecuatro==4)
  82.                                 {
  83.                                     cout<<"Encontrada combinación en columna "<<i<<" y filas "<<j-3<<","<<j<<endl;
  84.                                     return true;
  85.                                 }
  86.                         }
  87.                     else
  88.                     {
  89.                         lineadecuatro=0;
  90.                     }
  91.                 }
  92.             lineadecuatro=0;
  93.         }
  94.     lineadecuatro=0;
  95.     //diagonal
  96.     /********primer barrido diagonal hacia arriba****/
  97.     for (int j=0; j-COLUMNAS-3; j++)
  98.         {
  99.             for (int i=3; i<FILAS; i++)
  100.                 {
  101.                     int fila=i;
  102.                     int columna=j;
  103.                     while (fila>=0)
  104.                         {
  105.                             if (tablero[fila][columna]==true)
  106.                                 {
  107.                                     cout<<"True en: "<<fila<<" , "<<columna<<endl;
  108.                                     lineadecuatro++;
  109.                                     if (lineadecuatro==4)
  110.                                         {
  111.                                             cout<<"Encontrada diagonal"<<endl;
  112.                                             return true;
  113.                                         }
  114.                                 }
  115.                             fila--;
  116.                             columna++;
  117.                         }
  118.                     lineadecuatro=0;
  119.                 }
  120.             lineadecuatro=0;
  121.             /*****siguiente barrido, por ejemplo diagonal hacia abajo*****/
  122.         }
  123.  
  124.     //si llego hasta aqui es porque no había ninguna fila de 4
  125.     return false;
  126. }
  127.  
  128. void inicializarTablero (bool tablero[FILAS][COLUMNAS])
  129. {
  130.     for (int i=0; i<FILAS; i++)
  131.         {
  132.             for (int j=0; j<COLUMNAS; j++)
  133.                 {
  134.                     tablero[i][j]=false;
  135.                 }
  136.         }
  137. }

Creo que con una pocas adaptaciones lo puedes adaptar a tu función Ganado().