Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] no puedo compilar el programa

Estas en el tema de no puedo compilar el programa en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 28/11/2014, 14:10
 
Fecha de Ingreso: noviembre-2014
Ubicación: facatativa
Mensajes: 4
Antigüedad: 9 años, 4 meses
Puntos: 0
Pregunta no puedo compilar el programa

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";
}
}
}
  #2 (permalink)  
Antiguo 28/11/2014, 15:17
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: no puedo compilar el programa

Por ahí hay un "tipoBarco" con t minúscula.
  #3 (permalink)  
Antiguo 28/11/2014, 15:44
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: no puedo compilar el programa

No he mirado todo el código pero el error es claro.
En la linea 38 en la estructura UBICARBARCOS creas un objeto llamado TipoBarco, del tipo BARCO. Luego en la linea 77 haces uso de ese objeto, pero lo llamas de forma equivocada: unBarco.tipoBarco.onGrid[0].X = -1;

Es: unBarco.TipoBarco.onGrid[0].X = -1;
No: unBarco.tipoBarco.onGrid[0].X = -1;

Ves la diferencia.

El error dice que no tienes ningun ningun miembro tipoBarco poro si tienes uno TipoBarco.

No he mirado a ver si tienes mas errores asi que de momento lo dejo ahi. XDD

Te lo dejo aqui por que es muy grande: http://codepad.org/bwj1MoTJ

Y otra cosa... use las etiquetas para que vean mejor el codigo.

Etiquetas: c++, juego, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:56.