mi problema es el siguiente llevo un tiempo tratando de compilar este codigo es de n juego de batalla naval, el problema es que siempre me sale un error D:\proyectos c++\batalla naval\main.cpp|79|error: 'struct UBICARBARCOS' has no member named 'tipoBarco'| y no sé como arreglarlo el codigo es el siguiente :
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
const int ancho_tablero = 10;
const int alto_tablero = 10;
const int tipos_barcos = 5;
const char esAGUA = 247; //codigo ASCII para un caracter con forma de agua
const char esIMPACTO = 'X';
const char esBARCO = 'B';
const char esFALLO = '0';
struct PUNTO {
//una localizacion definida en la cuadricula por las coordenadas X(horizontal) Y(vertical)
int X;
int Y;
};
struct BARCO {
//nombre del barco
string nombre;
//Total de puntos en la cuadricula
int longitud;
//Coordenadas de estos puntos
PUNTO onGrid[5]; //0-4 max longitud del barco mas largo
//un booleano para saber si los puntos son "impacto" o no
bool banderaImpacto[5];
}barco[tipos_barcos];
struct JUGADOR {
char grid[alto_tablero][ancho_tablero];
}jugador[3]; //solo se usan los jugadores 1 y 2
enum DIRECCION {HORIZONTAL,VERTICAL};
struct UBICARBARCOS {
DIRECCION direccion;
BARCO TipoBarco;
};
bool juegoenProgreso = false;
//Funciones
void CargarBarcos();
void ReiniciarTablero();
void DibujarTablero(int);
UBICARBARCOS EntradaUbicaciondeBarcos();
bool EntradaAtaqueJugador(int&,int&,int);
bool comprobarFinJuego(int);
int main()
{
CargarBarcos();
ReiniciarTablero();
//fase del juego de "UBICAR BARCOS"
//recorre a traves de cada jugador...
for (int unjugador=1; unjugador<3; ++unjugador)
{
//reccore a traves de cada tipo de barco a ubicar
for (int barcoActual=0; barcoActual<tipos_barcos; ++barcoActual)
{
//muestra el tablero de juego para jugador
system("cls");
DibujarTablero(unjugador);
//da las intrucciones
cout << "\n";
cout << "INSTRUCCIONES (Jugador " << unjugador << ")\n\n";
cout << "Estas apunto de colocar tus barcos. La manera de hacerlo:\n";
cout << "Mirando (0:Horizontal,1:Vertical), X (fila superior) coords, Y (lado izquierdo) coordenadas\n";
cout << "Ejemplo: 0 7 2 esto pondra un barco empezando en X:7 Y:2 en sentido horizontal\n\n";
cout << "barco a ubicar: " << barco[barcoActual].nombre << " que tiene una longitud de " << barco[barcoActual].longitud << "\n";
cout << "¿Donde quieres ubicarlo? ";
//obtiene la entrada del jugador y hace un bucle hasta que una buena entrada sea retornada
UBICARBARCOS unBarco;
unBarco.tipoBarco.onGrid[0].X = -1;
while (unBarco.TipoBarco.onGrid[0].X == -1)
{
unBarco = EntradaUbicaciondeBarcos();
}
//combina los datos del jugador con los datos del "barco actual"
unBarco.TipoBarco.longitud = barco[barcoActual].longitud;
unBarco.TipoBarco.nombre = barco[barcoActual].nombre;
//Agrega el PRIMER punto de cuadricula para el tablero de juego del jugador actual
jugador[unjugador].grid[unBarco.TipoBarco.onGrid[0].X][unBarco.TipoBarco.onGrid[0].Y] = esBARCO;
//determina TODOS los puntos de la cuadricula basado en la longitud y la direccion
for (int i=1; i<unBarco.TipoBarco.longitud; ++i)
{
if (unBarco.direccion == HORIZONTAL){
unBarco.TipoBarco.onGrid[i].X = unBarco.TipoBarco.onGrid[i-1].X+1;
unBarco.TipoBarco.onGrid[i].Y = unBarco.TipoBarco.onGrid[i-1].Y; }
if (unBarco.direccion == VERTICAL){
unBarco.TipoBarco.onGrid[i].Y = unBarco.TipoBarco.onGrid[i-1].Y+1;
unBarco.TipoBarco.onGrid[i].X = unBarco.TipoBarco.onGrid[i-1].X; }
//agrega los puntos de cuadricula restantes para el tablero de juego del jugador actual
jugador[unjugador].grid[unBarco.TipoBarco.onGrid[i].X][unBarco.TipoBarco.onGrid[i].Y] = esBARCO;
}
//recorre de vuelta a traves de cada tipo de barco
}
//recorre de vuelta a traves de cada jugador
}
//********* FINALIZAR CON LA FASE DE UBICAR BARCOS *********************************
//************************************************** ***************************
//listo para jugar
juegoenProgreso = true;
int jugadorActual = 1;
do {
//como estamos atacando ahora se muestra el tablero del jugador enemigo
int jugadorEnemigo;
if (jugadorActual == 1) jugadorEnemigo = 2;
if (jugadorActual == 2) jugadorEnemigo = 1;
system("cls");
DibujarTablero(jugadorEnemigo);
//Obtiene las coordenadas de ataque del jugador actual
bool buenaEntrada = false;
int x,y;
while (buenaEntrada == false) {
buenaEntrada = EntradaAtaqueJugador(x,y,jugadorActual);
}
//Revisa el tablero; si un barco esta ahi se coloca "impacto" de lo contrario "fallo"
if (jugador[jugadorEnemigo].grid[x][y] == esBARCO) jugador[jugadorEnemigo].grid[x][y] = esIMPACTO;
if (jugador[jugadorEnemigo].grid[x][y] == esAGUA) jugador[jugadorEnemigo].grid[x][y] = esFALLO;
//comprueba si el juego finalizo
//Si 0 es retornado nadie ha ganado aun
int unaVictoria = comprobarFinJuego(jugadorEnemigo);
if (unaVictoria != 0) {
juegoenProgreso = false;
break;
}
//alterna entre cada jugador haciendo el recorrido de vuelta
jugadorActual = (jugadorActual == 1) ? 2 : 1;
} while (juegoenProgreso);
system("cls");
cout << "\n\nFELICITACIONES!!! Jugador " << jugadorActual << " HA GANADO EL JUEGO!\n\n\n\n";
system("pause");
return 0;
}
bool comprobarFinJuego(int jugadorEnemigo)
{
bool ganador = true;
//recorre a traves del tablero enemigo
for (int w=0; w<ancho_tablero; ++w){
for (int h=0; h<alto_tablero; ++h){
//si quedan barcos el juego no termina aún
if ((jugador[jugadorEnemigo].grid[w][h] = esBARCO !=jugadorEnemigo))
// !=jugadorEnemigo esta parte del codigo me enviaba una advertencia, al usar esa asignación le aseguro al compilador que estoy usando una asignación a jugadorEnemigo y no una comparación
{
ganador = false;
return ganador;
}
}}
//al llegar aquí algun jugador ha ganado el juego
return ganador;
}
bool EntradaAtaqueJugador(int& x, int& y, int eljugador)
{
cout << "\nJUGADOR " << eljugador << ", INGRESA COORDENADAS PARA ATACAR: ";
bool buenaEntrada = false;
cin >> x >> y;
if (x<0 || x>=ancho_tablero) return buenaEntrada;
if (y<0 || y>=alto_tablero) return buenaEntrada;
buenaEntrada = true;
return buenaEntrada;
}
UBICARBARCOS EntradaUbicaciondeBarcos()
{
int d, x, y;
UBICARBARCOS tmp;
//Se usa para comprobar un mal retorno
tmp.TipoBarco.onGrid[0].X = -1;
//Obtiene tres enteros del usuario
cin >> d >> x >> y;
if (d!=0 && d!=1) return tmp;
if (x<0 || x>=ancho_tablero) return tmp;
if (y<0 || y>=alto_tablero) return tmp;
//buen ingreso
tmp.direccion = (DIRECCION)d;
tmp.TipoBarco.onGrid[0].X = x;
tmp.TipoBarco.onGrid[0].Y = y;
return tmp;
}
void CargarBarcos()
{
//establece el valor por defecto para los barcos que planeamos incluir en el juego
//IMPORTANTE!! > COMO SE VIO EN "TIPOS_BARCOS" -por defecto=5 (0-4)
barco[0].nombre = "Crucero"; barco[0].longitud = 2;
barco[1].nombre = "Fragata"; barco[1].longitud = 3;
barco[2].nombre = "Submarino"; barco[2].longitud = 3;
barco[3].nombre = "Escolta"; barco[3].longitud = 4;
barco[4].nombre = "Acorazado"; barco[4].longitud = 5;
}
void ReiniciarTablero()
{
//recorre a traves de cada jugador
for (int jgdr=1; jgdr<3; ++jgdr)
{
//Para cada punto de la cuadricula, coloca contenido como "agua"
for (int w=0; w<ancho_tablero; ++w){
for (int h=0; h<alto_tablero; ++h){
jugador[jgdr].grid[w][h] = esAGUA;
}}
//recorre de vuelta al siguiente jugador
}
}
void DibujarTablero(int jugadorActual)
{
//dibuja el tablero para un jugador ("jugador actual")
cout << "TABLERO DE JUEGO DEL JUGADOR " << jugadorActual << "\n";
cout << "----------------------\n";
//recorre a traves de la fila superior (ancho_tablero) y el numero de columnas
cout << " ";
for (int w=0; w<ancho_tablero; ++w) {
if (w < 10)
//Numera caracter de largo 1, agrega dos espacios despues
cout << w << " ";
else if (w >= 10)
//Numera dos caracteres de largo, agrega un solo espacio despues
cout << w << " ";
}
cout << "\n";
//recorre a traves de cada punto de la cuadricula y lo muestra en consola
for (int h=0; h<alto_tablero; ++h){
for (int w=0; w<ancho_tablero; ++w){
//Si este es el primer punto de cuadricula(a la izquierda), numera la cuadricula primero
if (w==0) cout << h << " ";
//si h tiene un solo caracter de largo agrega un espacio extra para mantener los numeros alineados
if (w<10 && w==0) cout << " ";
//muestra el contenido de la cuadricula (si el juego no ha comenzado aun , estamos colocando los barcos, entonces muestra los barcos
if (juegoenProgreso == false) cout << jugador[jugadorActual].grid[w][h] << " ";
//no muestra los barcos, pero muestra daño si es un impacto
if (juegoenProgreso == true && jugador[jugadorActual].grid[w][h] != esBARCO)
{cout << jugador[jugadorActual].grid[w][h] << " ";}
else if (juegoenProgreso == true && jugador[jugadorActual].grid[w][h] == esBARCO)
{cout << esAGUA << " ";}
//si llegamos al borde entonces empieza una nueva linea
if (w == ancho_tablero-1) cout << "\n";
}
}
}