Dev - C++ - juego conecta4

 
Vista:

juego conecta4

Publicado por samoli (2 intervenciones) el 21/11/2020 03:10:37
Estoy haciendo el juego connect four y pues estoy quedadoen la parte de verificación si el jugador ha ganado. Mas adelante adjunto las funciones y las llamadas de estas para que me ayuden para ver donde está mi error. Gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
void inicio_juego(int pizarra[][MAXCOLUM])
{
   int colum = 0, jugada;
   char tecla, jugador, computadora;
 
   jugador = 'X';
   computadora = 'O';
   _setcursortype(0);
   do{
      imprimir_pizarra(pizarra,colum);
      do{
         tecla = getch();
      } while (tecla != IZQUIERDA && tecla != DERECHA && tecla != ENTER && tecla != ESPACE);
 
      if (tecla == IZQUIERDA)
      {
         if (colum > 0)
            colum --;
            else{
               colum = MAXCOLUM - 1;
            }
      }
      if (tecla == DERECHA)
      {
         if (colum < MAXCOLUM - 1)
            colum++;
            else{
               colum = 0;
            }
      }
      if (tecla == ENTER)
      {
         jugada = colum;
         jugador_juega(pizarra,jugada);
      }
   }while (tecla != ESPACE && verif_ganador(pizarra,jugador) == 0 && verif_ganador(pizarra,computadora) == 0 );
 
   if (verif_ganador(pizarra,jugador) == 1)
   {
      printf("Wooow! Felicidadesss, le ganaste a la computadora!\n");
      return ;
   }
 
 
int verif_ganador(int pizarra[][MAXCOLUM], char jugada)
{
   int ind, i;
 
   for(ind=MAXFIL;ind>=0;ind--)
   {
      for( i=0;i<MAXCOLUM;i++)
      {
         if (pizarra[ind][i] == jugada)
         {
            if (pizarra[ind-1][i] == jugada && pizarra[ind-2][i] == jugada && pizarra[ind-3][i] == jugada) //Verifica si se ganó verticalmente.
            {
               return 1;
            }
            if (pizarra[ind][i+1] == jugada && pizarra[ind][i+2] == jugada && pizarra[ind][i+3] == jugada) //Verifica si se ganó horizontalmente.
            {
               return 1;
            }
         }
      }
   }
   return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

juego conecta4

Publicado por Rodrigo (539 intervenciones) el 21/11/2020 07:59:05
Intuyo, sin mayor informacion que puedas tener un problema al visitar lugares de la memoria fuera del arreglo.
El ciclo de la linea 49 hace que ind parta en MAXFILA y luego en la linea 53 se usa ese indice.

Si ese arreglo fue definido con tamano MAXFILA, el indice maximo es MAXFILA-1 no MAXFILA. Sugiero que restes 1 en la primera expresion del ciclo for.

Lo mismo va a ocurrir con las columnas, por ejemplo en la linea 59 se intenta leer la columna i+1, i+2, i+3 y el ciclo de la linea 51 llega hasta MAXCOLUM-1, por lo que todos los indices que consultes van a estar fuera del arreglo cuando i llegue a MAXCOLUM-1, y va a tambien a fallar en las 2 vueltas anteriores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

juego conecta4

Publicado por samoli (2 intervenciones) el 22/11/2020 02:53:48
Ya arreglé lo que me dijiste pero aun no se soluciona el problema.

MAXFIL esta definida con el valor de 7
MAXCOLUM por igual tiene el valor de 7

Creo que el problema se encuentra en el arreglo, ya que está definido como un arreglo 'int', y a la hora de imprimirlo dependiendo el entero que tenga la pizarra va a imprimir un caracter. Entonces qué deberia hacer en ese caso?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int verif_ganador(int pizarra[][MAXCOLUM], char jugada)
{
   int ind, i;
 
   for(ind=MAXFIL-1;ind>=3;ind--)
   {
      for( i=0;i<=MAXCOLUM-3;i++)
      {
         if (pizarra[ind][i] == jugada)
         {
            if (pizarra[ind-1][i] == jugada && pizarra[ind-2][i] == jugada && pizarra[ind-3][i] == jugada) //Verifica si se ganó verticalmente.
            {
               return 1;
            }
            if (pizarra[ind][i+1] == jugada && pizarra[ind][i+2] == jugada && pizarra[ind][i+3] == jugada) //Verifica si se ganó horizontalmente.
            {
               return 1;
            }
         }
      }
   }
   return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

juego conecta4

Publicado por Rodrigo (539 intervenciones) el 22/11/2020 06:39:00
No has explicitado cual es el problema. Solo has dicho que tienes uno.
Cual es el problema? Podrias indicar cual es la entrada que produce el problema, cual es el resultado que esperas? cual es el que obtienes?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar