Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lopez fer en 26 Enero 2021, 23:13 pm



Título: validar gato
Publicado por: lopez fer en 26 Enero 2021, 23:13 pm
Podrian ayuderme con estre problema, soy principiante y no logro entender que debo hacer.
Como en el juego del gato, en este problema se desea verificar si en un tablero se presenta el mismo VALOR en todas las celdas de un renglón, una columna, la diagonal principal o la diagonal secundaria, para determinar si un jugador ha ganado.

A continuación se muestra un tablero de 3x3, en la cual se tienen valores 1 y 0. Se observa que en el segundo renglón, la última columna o la diagonal principal todas las celdas tienen el valor 1. En el caso del juego del gato, esto representaría que el jugador asociado al valor 1, ha ganado.

En la primer línea el valor  entero a buscar en el tablero.

En la segunda línea separados por un espacio, la cantidad 3<=n<=10 de renglones y columnas para una matriz (tablero) de forma cuadrada.

A partir de la tercera línea, se presentan separadas por un espacio los números de cada renglón de la matriz, se inicia con el renglón 0 y se termina con el renglon n-1 , y en cada renglón se inicia con la columna 0  y se termina con la columna . n-1


Se debe imprimir el número entero 1, si el valor  a buscar, se encuentra en todas las celdas de cualquier renglón, columna, diagonal principal o en la diagonal secundaria. Retorna 0 en otro caso.

Ejemplo


Título: Re: validar gato
Publicado por: K-YreX en 27 Enero 2021, 09:12 am
Primero, para situarnos, vemos que se habla del juego del gato (conocido también como el 3 en raya si el tablero es de 3x3). Esto se juega entre dos jugadores que ponen sus fichas en el tablero y el primero que consigue completar una fila, columna o diagonal (principal o secundaria) con sus fichas, gana. Hasta aquí todo claro.

Lo que parece que pide es un algoritmo que determine si un jugador en concreto ha ganado. Para ello tienes que pasar una entrada al programa en el formato que te dicen:
Citar
En la primer línea el valor  entero a buscar en el tablero.

En la segunda línea separados por un espacio, la cantidad 3<=n<=10 de renglones y columnas para una matriz (tablero) de forma cuadrada.

A partir de la tercera línea, se presentan separadas por un espacio los números de cada renglón de la matriz, se inicia con el renglón 0 y se termina con el renglon n-1 , y en cada renglón se inicia con la columna 0  y se termina con la columna . n-1

Suponiendo que los valores pueden ser: {0, 1, 2} para representar: {casilla vacía, jugador1, jugador2}, respectivamente.
Un ejemplo de entrada podría ser:
Código:
1 // Vamos a ver si ha ganado el jugador 1
4 // En un tablero de 4x4 cuyos valores actuales son: (Y ahora escribimos la matriz que representa el tablero)
1 0 0 2
1 1 2 2
2 1 1 2
0 0 0 1
Como se puede ver, en este caso sí ha ganado el jugador 1 porque tiene la diagonal principal completa con sus fichas. Entonces tu algoritmo tiene que devolver 1 (lo que viene a traducirse como true). En caso de que el jugador 1 no hubiese ganado (bien porque ha ganado el jugador 2 o porque no ha ganado ninguno todavía), debería devolver un 0 (que equivale a false).

No sé si este programa tienes que hacerlo en C o C++ pero una idea para empezar (en C) puede ser:
Código
  1. #define MIN_SIZE 3
  2. #define MAX_SIZE 10
  3.  
  4. // Es obligatorio indicar todas las dimensiones de un array, excepto la primera
  5. // Esta funcion comprueba si el jugador indicado ha ganado segun la matriz (tablero) indicada
  6. int comprobarGanador(int, int[][MAX_SIZE], int);
  7.  
  8.  
  9. int main(){
  10.  // La forma mas sencilla para empezar es crear una matriz con el maximo valor posible y usar solo la parte necesaria
  11.  int matriz[MAX_SIZE][MAX_SIZE];
  12.  // Aqui ya depende del formato que utilices para la entrada de datos (fichero, teclado,...)
  13.  int jugador;
  14.  // Con este bucle sigues pidiendo un valor hasta que sea valido (1 o 2)
  15.  do {
  16.    printf("Introduce el jugador a comprobar (1/2): ");
  17.    scanf("%d", &jugador);
  18.  } while(jugador != 1 && jugador != 2);
  19.  
  20.  // Hacemos lo mismo para el orden de la matriz
  21.  int orden; // A partir de ahora tenemos que usar 'orden' para recorrer la matriz porque las posiciones restantes hasta MAX_SIZE contendran basura
  22.  do {
  23.    printf("Introduce el orden del tablero [%d, %d]: ", MIN_SIZE, MAX_SIZE);
  24.    scanf("%d", &orden);
  25.  } while(orden < MIN_SIZE || orden > MAX_SIZE);
  26.  
  27.  for(int i = 0; i < orden; ++i){
  28.    printf("Introduce los valores de la fila %d: ", i);
  29.    for(int j = 0; j < orden; ++j){
  30.      scanf("%d", &matriz[i][j]); // Aunque se escriban todos los valores en una fila, scanf() va separando por espacios
  31.    }
  32.  }
  33.  
  34.  printf("El jugador %d ha ganado la partida?: %d\n", jugador, comprobarGanador(jugador, matriz, orden));
  35.  // Si vas a ejecutarlo desde la consola hay que incluir la siguiente linea para que no se cierre hasta pulsar Enter:
  36.  getchar(); // cin.get() si se hace en C++
  37.  return 0; // El return se puede omitir y el compilador lo incluye implicitamente
  38. }
  39.  
  40. int comprobarGanador(int jugador, int matriz[][MAX_SIZE], int orden){
  41.  // Aqui queda tu tarea de comprobar si el jugador indicado ha ganado o no
  42.  // Recuerda recorrer la matriz hasta la fila/columna <orden-1> y no hasta <MAX_SIZE-1> (no es lo mismo)
  43. }

Tenía ganas de escribir algo en C así que creo que con eso ya te he dejado más que suficiente... :silbar: :silbar:
Con implementar la función comprobarGanador(), el código debería funcionar correctamente (si no he olvidado nada). Luego ya puedes cambiar lo que quieras o necesites.
Si lo pruebas con el ejemplo de entrada que puse antes el resultado debería ser:
Código:
El jugador 1 ha ganado la partida?: 1