0

tengo que hacer el 3 en raya en C++. Mi problema es que se puede jugar bien y todo eso pero no consigo que tome esa forma cuadrada el tablero. También cuando voy jugando se repiten los mensajes. Me sale todo plano pero a la hora de jugar funciona correctamente solo que el "tablero" está en linea recta.

Se ha de tener una estructura para representar los jugadores con el número de partidas ganadas, perdidas, empatadas y el nombre. Otra estructura que represente el juego, es decir una matriz de celdas, a su vez una celda es una estructura que indica si esta ocupada o no, y a que jugador pertenece.

Agradecería mucho la ayuda.


#include <cstdio>

using namespace std;

//funciones
void loop(char c[3][3]);

void Primera_Intro(char c[3][3]);

void Primera_Intro(char c[3][3]);

void tablero(char c[3][3]);

void Init_J1(char c[3][3]);

void Init_J2(char c[3][3]);

int ganador(char c[3][3]);

int
main() {

  char c[3][3];

  loop(c);

  return 0;

}

void
loop(char c[3][3]) {

  int i, j;

  i = 0;

  Primera_Intro(c);

  tablero(c);

  do {

    system("clear");

    tablero(c);

    if (i % 2 == 0) {

      Init_J1(c);

    } else {

      Init_J2(c);

    }

    j = ganador(c);

    i++;

  }
  while (i < 9);

  if (j == 0) {

    cout << "Ha ganado el jugador 1.";

  } else if (j == 1) {

    cout << "Ha ganado el juagdor 2.";

  } else {

    cout << "Empate.";

  }

}

// espacio
void
Primera_Intro(char c[3][3]) {

  char a;

  a = '1';

  for (int i = 0; i < 3; i++) {

    for (int j = 0; j < 3; j++) {

      c[i][j] = a++;

    }
  }
}

// jugador 1
void
Init_J1(char c[3][3]) {

  char a;

  int i, j, k;

  do {

    do {

      cout << "Juega jugador 1: "; // Jugador 1 juega

      scanf(" %c", & a); // Se guarda la posicion
    }
    while (a < '1' || a > '9');

    k = 0;

    switch (a) { // posicion ocupada
    case '1': {

      i = 0;

      j = 0;

      if (c[i][j] == 'X' || c[i][j] == 'O') { // no repetir posicion
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '2': {

      i = 0;

      j = 1;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //lo mismo de arriba
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '3': {

      i = 0;

      j = 2;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //lo mismo de arriba
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '4': {

      i = 1;

      j = 0;

      if (c[i][j] == 'X' || c[i][j] == 'O') { // bis
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '5': {

      i = 1;

      j = 1;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //bis
        k = 1;

        cout << "\"Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '6': {

      i = 1;

      j = 2;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //bis
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '7': {

      i = 2;

      j = 0;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //bis
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '8': {

      i = 2;

      j = 1;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //bis
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '9': {

      i = 2;

      j = 2;

      if (c[i][j] == 'X' || c[i][j] == 'O') { //bis
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    }

  }
  while (k == 1); //repeticion por ser igual a 1

  c[i][j] = 'X';

}

// jugador 2
void
Init_J2(char c[3][3]) {

  char a;

  int i, j, k;

  do {

    do {

      cout << ("Juega jugador 2: "); // juega jugador 2
      scanf(" %c", & a); // guardar posicion
    }
    while (a < '1' || a > '9');

    k = 0;

    switch (a) { // posiciones ocupadas jugador 2
    case '1': {

      i = 0;

      j = 0;

      if (c[i][j] == 'X' || c[i][j] == 'O') { // no repetir posicion
        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '2': {

      i = 0;

      j = 1;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '3': {

      i = 0;

      j = 2;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '4': {

      i = 1;
      j = 0;
      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '5': {

      i = 1;

      j = 1;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '6': {

      i = 1;

      j = 2;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '7': {

      i = 2;

      j = 0;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '8': {

      i = 2;

      j = 1;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    case '9': {

      i = 2;

      j = 2;

      if (c[i][j] == 'X' || c[i][j] == 'O') {

        k = 1;

        cout << "Casilla ocupada. Intentalo de nuevo.";

      }

      break;

    }

    }

  }
  while (k == 1);

  c[i][j] = 'O';

}

// el tablero vacio
void
tablero(char c[3][3]) {

  for (int i = 0; i < 3; i++) {

    for (int j = 0; j < 3; j++) {

      if (j < 2) {

        printf(" %c ", c[i][j]);

      } else {

        printf(" %c ", c[i][j]);

      }

    }

    if (i < 2) {

      cout << "\n---------\n";

    }

  }

  cout << "\n\n";

}

//ganador
int
ganador(char c[3][3]) {

  if (c[0][0] == 'X' || c[0][0] == 'O') {

    if (c[0][0] == c[0][1] && c[0][0] == c[0][2]) {

      if (c[0][0] == 'X') {

        return 0; // 1 gana
      } else {

        return 1; // 2 gana
      }

    } else if (c[0][0] == c[1][0] && c[0][0] == c[2][0]) {

      if (c[0][0] == 'X') {

        return 0;
      } else {

        return 1;
      }

    }

  } else if (c[1][1] == 'X' || c[1][1] == 'O') {

    if (c[1][1] == c[0][0] && c[1][1] == c[2][2]) {

      if (c[1][1] == 'X') {

        return 0;
      } else {

        return 1;
      }

    } else if (c[1][1] == c[1][0] && c[1][1] == c[1][2]) {

      if (c[1][1] == 'X') {

        return 0;
      } else {

        return 1;
      }

    } else if (c[1][1] == c[2][0] && c[1][1] == c[0][2]) {

      if (c[1][1] == 'X') {

        return 0;
      } else {

        return 1;
      }

    } else if (c[1][1] == c[0][1] && c[1][1] == c[2][1]) {

      if (c[1][1] == 'X') {

        return 0;
      } else {

        return 1;
      }

    }

  } else if (c[2][2] == 'X' || c[2][2] == 'O') {

    if (c[2][2] == c[2][0] && c[2][2] == c[2][1]) {

      if (c[2][2] == 'X') {

        return 0;
      } else {

        return 1;
      }

    } else if (c[2][2] == c[0][2] && c[2][2] == c[1][2]) {

      if (c[2][2] == 'X') {

        return 0;
      } else {

        return 1;
      }

    }

  }

  return 2;

}

´´´
Gonzalo
  • 1
  • 3
  • Me encanta cuando os mandan hacer un ejercicio en la escuela/universidad, porque venís todos a la vez con dudas muy similares sobre el mismo ejercicio. Revisa las preguntas realizadas ayer en el foro porque se contestó una pregunta similar sobre el "3 en raya". – Londo Dec 03 '21 at 06:31
  • 1
    Has compartido **casi 750 líneas de código** y ni en el código ni en tu publicación he conseguido entender qué estás preguntando. ¿Podrías aclararlo, por favor? – PaperBirdMaster Dec 03 '21 at 07:37
  • Si copias todo el código en Visual Studio Code (por ejemplo, vale cualquier IDE) y usas la opción de *auto-formatear el código*, se volverá **mucho** más legible – Pablo Lozano Dec 03 '21 at 08:26

1 Answers1

3

tengo que hacer el 3 en raya en C++

Pues tienes un muy mal comienzo: la cabecera <stdio.h> es del lenguaje C y no debe ser usada en C++. Si realmente fuese necesario (que no es tu caso) deberías usar la versión adaptada a C++ incluyendo la cabecera <cstdio>, lee este hilo para saber más del tema.

Me es tremendamente difícil y enervante leer y entender el galimatías que has publicado carente de indentación y con espaciados ilógicos, pero entiendo que entre las 745 LÍNEAS DE CÓDIGO que has compartido, lo único relevante es esto:

   void
tablero (char c[3][3])
{
  
for (int i = 0; i < 3; i++)
    {
      
for (int j = 0; j < 3; j++)
    {
      
if (j < 2)
        {
          
cout << (" %c ", c[i][j]);
        
}
      else
        {
          
cout << (" %c ", c[i][j]);
        
}
    
}
      
if (i < 2)
    {
      
cout << "____________";
    
}
    
}
  
cout << "\n";

}

Pues es de lo único que manifiestas dudas:

el "tablero" está en linea recta.

Es normal que se te muestre el "tablero" en línea recta pues es exactamente lo que estás pidiendo. Si quieres que se muestre en diferentes líneas deberías insertar saltos de línea en algún punto, cosa que no haces:

cout << (" %c ", c[i][j]); // Dónde está el salto de línea?

Además, std::cout no funciona con marcas de formato (" %c ") la instrucción anterior es un disparate que compila de casualidad. Todo tu código es un sinsentido que denota una falta de conocimiento del lenguaje, te aconsejo repasar las bases antes de seguir intentando programar.

Respecto a imprimir el tablero, basta con este código:

// Definimos el tipo del tablero: una matriz de 3x3 caracteres.
using tablero_t = char[3][3];

/* Pasamos el tablero por referencia (para evitar copias)
   constante (pues no vamos a modificar su contenido). */
void tablero(const tablero_t &tablero)
{
    for (const auto &fila : tablero)
    {
        for (const auto &valor: fila)
            std::cout << valor << ' '; // Imprimimos cada fila
        std::cout << '\n';             // Después de cada fila, un salto de línea
    }
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • El codigo está solucionado pero la duda es como hago que cuando se hagan en linea automáticamente diga que he ganado, porque me hace seguir hasta el final – Gonzalo Dec 03 '21 at 16:16
  • @Gonzalo ¿Qué has intentado para detectar la condición de victoria? Lo digo porque no me queda claro en las 745 líneas de código que compartes. – PaperBirdMaster Dec 03 '21 at 18:02