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;
}
´´´