Acceso método de clase base/madre

Iniciado por julianbesso1, 25 Agosto 2014, 23:16 PM

0 Miembros y 1 Visitante están viendo este tema.

julianbesso1

Volviendo al tema del post anterior, estoy a punto de terminar el ejercicio planteado (Insaniquarium).

El único problema es el siguiente:

Hay un método llamado Sentido_Pescado que es el que determina el rebote con los bordes y la conformación del cuerpo de los pescados para su posterior dibujo en pantalla. El método recibe un int como parametro que es la orientación (1=mira hacia la izq/2=mira hacia la derecha)

Lo correcto sería tener un método escrito de esta manera:


Código (cpp) [Seleccionar]
void Pescado::Sentido_Pescado(){

if(sentido==1) sentido=2;
if(sentido==2) sentido=1;

}


Pero al implementarlo, no lleva a cabo el cambio de sentido. Desconozco el motivo.

Este es el código completo:


Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <conio2.h>
#include <ctime>

using namespace std;

const int bizq=6;
const int bder=75;
const int bsup=6;
const int binf=19;

class Pescado{

protected:
int velocidad;
int color;
int sentido;

int pos_x;
int pos_y;

int prev_x;
int prev_y;

int dir_x;
int dir_y;

int mov_vertical;

clock_t t_inicial;              
clock_t t_final;

char array_b[6][12];
char array_s[10][4];

public:

void Mover_Pescado();
void Sentido_Pescado(int x);

};
class Pescado1 : public Pescado{

public:

Pescado1(int x, int y);
void Borrar_Pescado1();
void Cuerpo_Pescado1();
void Dibujar_Pescado1();

};

class Pescado2 : public Pescado{

public:

Pescado2(int x, int y);
void Borrar_Pescado2();
void Cuerpo_Pescado2();
void Dibujar_Pescado2();
void Color_Pescado2();

};

void Pescado::Mover_Pescado(){

prev_x = pos_x;
prev_y = pos_y;

t_final = clock();

if((velocidad + t_inicial) < t_final){

int mov_vertical = rand()%2+1;  // 1-arriba 2-abajo

if(sentido==1) pos_x-=dir_x;
if(sentido==2) pos_x+=dir_x;
if(mov_vertical==1) pos_y-=dir_y;
if(mov_vertical==2) pos_y+=dir_y;

if(pos_x < bizq){
Pescado::Sentido_Pescado(2);
dir_x = -dir_x;
pos_x = bizq;

}
if(pos_x > bder-12){
Pescado::Sentido_Pescado(1);
dir_x = -dir_x;
pos_x = bder-12;
}
if(pos_y < bsup){
dir_y = -dir_y;
pos_y = bsup;
}
if(pos_y > binf){
dir_y = -dir_y;
pos_y = binf;
}

t_inicial = t_final;

}
}

void Pescado::Sentido_Pescado(int x){

if(x==1) sentido=1;
if(x==2) sentido=2;

}

Pescado1::Pescado1(int x, int y){

velocidad=x;
color=y;

dir_x=1;
dir_y=1;

pos_x = rand()%61+10;
pos_y = rand()%6+10;

sentido = rand() % 2+1;  //  mira izq/ mira der   

t_inicial = clock();

}

void Pescado1::Borrar_Pescado1(){

for(int k=0;k<6;k++){
for(int p=0;p<12;p++){
putchxy(prev_x+p,prev_y+k,' ');
}
}

}

void Pescado1::Cuerpo_Pescado1(){

if(sentido==1){  //pescado mirando izquierda

array_b[0][0]=32;array_b[0][1]=32;array_b[0][2]=32;array_b[0][3]=32;array_b[0][4]=32;array_b[0][5]=32;array_b[0][6]=95;array_b[0][7]=44;array_b[0][8]=32;array_b[0][9]=32;array_b[0][10]=32;array_b[0][11]=32;
array_b[1][0]=32;array_b[1][1]=32;array_b[1][2]=32;array_b[1][3]=32;array_b[1][4]=95;array_b[1][5]=47;array_b[1][6]=123;array_b[1][7]=95;array_b[1][8]=32;array_b[1][9]=32;array_b[1][10]=32;array_b[1][11]=32;
array_b[2][0]=32;array_b[2][1]=46;array_b[2][2]=39;array_b[2][3]=32;array_b[2][4]=32;array_b[2][5]=32;array_b[2][6]=32;array_b[2][7]=39;array_b[2][8]=46;array_b[2][9]=47;array_b[2][10]=180;array_b[2][11]=62;
array_b[3][0]=47;array_b[3][1]=32;array_b[3][2]=101;array_b[3][3]=32;array_b[3][4]=40;array_b[3][5]=40;array_b[3][6]=32;array_b[3][7]=32;array_b[3][8]=32;array_b[3][9]=61;array_b[3][10]=60;array_b[3][11]=32;
array_b[4][0]=32;array_b[4][1]=39;array_b[4][2]=46;array_b[4][3]=44;array_b[4][4]=95;array_b[4][5]=95;array_b[4][6]=44;array_b[4][7]=46;array_b[4][8]=39;array_b[4][9]=92;array_b[4][10]=95;array_b[4][11]=62;
array_b[5][0]=32;array_b[5][1]=32;array_b[5][2]=32;array_b[5][3]=32;array_b[5][4]=32;array_b[5][5]=32;array_b[5][6]=92;array_b[5][7]=41;array_b[5][8]=32;array_b[5][9]=32;array_b[5][10]=32;array_b[5][11]=32;

}
if(sentido==2){  //pescado mirando derecha

array_b[0][0]=32;array_b[0][1]=32;array_b[0][2]=32;array_b[0][3]=32;array_b[0][4]=44;array_b[0][5]=95;array_b[0][6]=32;array_b[0][7]=32;array_b[0][8]=32;array_b[0][9]=32;array_b[0][10]=32;array_b[0][11]=32;
array_b[1][0]=32;array_b[1][1]=32;array_b[1][2]=32;array_b[1][3]=32;array_b[1][4]=95;array_b[1][5]=125;array_b[1][6]=92;array_b[1][7]=95;array_b[1][8]=32;array_b[1][9]=32;array_b[1][10]=32;array_b[1][11]=32;
array_b[2][0]=60;array_b[2][1]=96;array_b[2][2]=92;array_b[2][3]=46;array_b[2][4]=39;array_b[2][5]=32;array_b[2][6]=32;array_b[2][7]=32;array_b[2][8]=32;array_b[2][9]=39;array_b[2][10]=46;array_b[2][11]=32;
array_b[3][0]=32;array_b[3][1]=62;array_b[3][2]=61;array_b[3][3]=32;array_b[3][4]=32;array_b[3][5]=32;array_b[3][6]=41;array_b[3][7]=41;array_b[3][8]=32;array_b[3][9]=101;array_b[3][10]=32;array_b[3][11]=92;
array_b[4][0]=60;array_b[4][1]=95;array_b[4][2]=47;array_b[4][3]=39;array_b[4][4]=46;array_b[4][5]=44;array_b[4][6]=95;array_b[4][7]=95;array_b[4][8]=44;array_b[4][9]=46;array_b[4][10]=39;array_b[4][11]=32;
array_b[5][0]=32;array_b[5][1]=32;array_b[5][2]=32;array_b[5][3]=32;array_b[5][4]=40;array_b[5][5]=47;array_b[5][6]=32;array_b[5][7]=32;array_b[5][8]=32;array_b[5][9]=32;array_b[5][10]=32;array_b[5][11]=32;

}

}

void Pescado1::Dibujar_Pescado1(){

Pescado1::Borrar_Pescado1();
Pescado1::Cuerpo_Pescado1();

for(int i=0; i<6; i++){
for(int j=0; j<12; j++){
textcolor(color);
putchxy(pos_x+j,pos_y+i,array_b[i][j]);
}
}

}

Pescado2::Pescado2(int x, int y){

velocidad=x;
color=y;

dir_x=1;
dir_y=1;

pos_x = rand()%61+10;
pos_y = rand()%6+10;

sentido = rand() % 2+1;  //  mira izq/ mira der   

t_inicial = clock();

}

void Pescado2::Borrar_Pescado2(){

for(int k=0;k<10;k++){
for(int p=0;p<4;p++){
putchxy(prev_x+k,prev_y+p,' ');
}
}

}

void Pescado2::Cuerpo_Pescado2(){

if(sentido==1){  //pescado mirando izquierda

array_s[0][0]=0;array_s[0][1]=0;array_s[0][2]=47;array_s[0][3]=39;
array_s[1][0]=0;array_s[1][1]=46;array_s[1][2]=111;array_s[1][3]=45;
array_s[2][0]=0;array_s[2][1]=45;array_s[2][2]=0;array_s[2][3]=45;
array_s[3][0]=47;array_s[3][1]=0;array_s[3][2]=41;array_s[3][3]=39;
array_s[4][0]=124;array_s[4][1]=0;array_s[4][2]=41;array_s[4][3]=39;
array_s[5][0]=0;array_s[5][1]=45;array_s[5][2]=0;array_s[5][3]=39;
array_s[6][0]=0;array_s[6][1]=46;array_s[6][2]=0;array_s[6][3]=39;
array_s[7][0]=0;array_s[7][1]=0;array_s[7][2]=92;array_s[7][3]=39;
array_s[8][0]=0;array_s[8][1]=0;array_s[8][2]=47;array_s[8][3]=92;
array_s[9][0]=0;array_s[9][1]=0;array_s[9][2]=40;array_s[9][3]=40;

}
if(sentido==2){  //pescado mirando derecha

array_s[0][0]=0;array_s[0][1]=0;array_s[0][2]=41;array_s[0][3]=41;
array_s[1][0]=0;array_s[1][1]=0;array_s[1][2]=92;array_s[1][3]=47;
array_s[2][0]=0;array_s[2][1]=0;array_s[2][2]=47;array_s[2][3]=39;
array_s[3][0]=0;array_s[3][1]=46;array_s[3][2]=0;array_s[3][3]=39;
array_s[4][0]=0;array_s[4][1]=45;array_s[4][2]=0;array_s[4][3]=39;
array_s[5][0]=124;array_s[5][1]=0;array_s[5][2]=40;array_s[5][3]=39;
array_s[6][0]=92;array_s[6][1]=0;array_s[6][2]=40;array_s[6][3]=39;
array_s[7][0]=0;array_s[7][1]=45;array_s[7][2]=0;array_s[7][3]=45;
array_s[8][0]=0;array_s[8][1]=46;array_s[8][2]=111;array_s[8][3]=45;
array_s[9][0]=0;array_s[9][1]=0;array_s[9][2]=92;array_s[9][3]=39;

}



}

void Pescado2::Dibujar_Pescado2(){

Pescado2::Borrar_Pescado2();
Pescado2::Cuerpo_Pescado2();

for(int i=0; i<10; i++){
for(int j=0; j<4; j++){
textcolor(color);
putchxy(pos_x+i,pos_y+j,array_s[i][j]);
}
}


}

void Pescado2::Color_Pescado2(){

if(color==15) color=1;
else color+=1;

}

int main(int argc, char *argv[]){

_setcursortype(_NOCURSOR);

srand(time(NULL));

Pescado1 Rojo(50,12);
Pescado1 Verde(80,10);

Pescado2 Amarillo(60,14);
Pescado2 Cyan(125,11);

while(true){

if(kbhit()) {
int tecla=getch();
switch(tecla)
{

case 49:
Rojo.Sentido_Pescado(1);
Verde.Sentido_Pescado(1);
break;
case 50:
Rojo.Sentido_Pescado(2);
Verde.Sentido_Pescado(2);
break;
case 51:
Amarillo.Color_Pescado2();
Cyan.Color_Pescado2();
break;


}
}

Rojo.Mover_Pescado();
Rojo.Dibujar_Pescado1();
Verde.Mover_Pescado();
Verde.Dibujar_Pescado1();
Amarillo.Mover_Pescado();
Amarillo.Dibujar_Pescado2();
Cyan.Mover_Pescado();
Cyan.Dibujar_Pescado2();

}

return 0;

}


Son mis primeras clases acerca de Clases, Herencia y otros, así que tendré en cuenta cualquier tipo de sugerencias. Gracias!

engel lex

Por simplificar el código, recomiendo usar para el sentido un booleano y solo usas

sentido = !sentido
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

julianbesso1

Tu sugerencia me ayudó a resolver el problema. Gracias!!!

eferion

Cita de: julianbesso1 en 25 Agosto 2014, 23:16 PM
Lo correcto sería tener un método escrito de esta manera: [/b]

Código (cpp) [Seleccionar]
void Pescado::Sentido_Pescado(){

if(sentido==1) sentido=2;
if(sentido==2) sentido=1;

}


Pero al implementarlo, no lleva a cabo el cambio de sentido. Desconozco el motivo.

Es fácil.

Caso 1: sentido = 2. El primer if se lo salta y en el segundo se cambia a sentido = 1
Caso 2: sentido = 1. Entra en el primer if, que cambia su valor( sentido = 2 ). Después entra en el segundo if que vuelve a cambiar su valor ( sentido = 1 )... has vuelto a tus orígenes.

El origen del problema es que el segundo if tendría que ir asociado a un else:

Código (cpp) [Seleccionar]
void Pescado::Sentido_Pescado(){

if(sentido==1) sentido=2;
else if(sentido==2) sentido=1;

}


Sin embargo, dado que "sentido" únicamente tiene dos posibles valores, se puede simplificar aún más:

Código (cpp) [Seleccionar]
void Pescado::Sentido_Pescado(){

if(sentido==1) sentido=2;
else sentido=1;

}


En cualquier caso, lo ideal para almacenar estados binarios si-no, verdadero-falso, avanzar-parar, lo mejor es, como te han comentado, usar la variable bool o, si la claridad del código lo requiere, enumerados (caso, por ejemplo, de derecha-izquierda, asignarle un 1 a derecha y 0 a izquierda o viceversa no parece algo demasiado obvio como para recordarlo durante la fase de implementación del código).

Un saludo.