elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Acceso método de clase base/madre
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Acceso método de clase base/madre  (Leído 3,166 veces)
julianbesso1

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Acceso método de clase base/madre
« en: 25 Agosto 2014, 23:16 pm »

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
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. if(sentido==2) sentido=1;
  5.  
  6. }

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

Este es el código completo:


Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <conio2.h>
  4. #include <ctime>
  5.  
  6. using namespace std;
  7.  
  8. const int bizq=6;
  9. const int bder=75;
  10. const int bsup=6;
  11. const int binf=19;
  12.  
  13. class Pescado{
  14.  
  15. protected:
  16. int velocidad;
  17. int color;
  18. int sentido;
  19.  
  20. int pos_x;
  21. int pos_y;
  22.  
  23. int prev_x;
  24. int prev_y;
  25.  
  26. int dir_x;
  27. int dir_y;
  28.  
  29. int mov_vertical;
  30.  
  31. clock_t t_inicial;              
  32. clock_t t_final;
  33.  
  34. char array_b[6][12];
  35. char array_s[10][4];
  36.  
  37. public:
  38.  
  39. void Mover_Pescado();
  40. void Sentido_Pescado(int x);
  41.  
  42. };
  43. class Pescado1 : public Pescado{
  44.  
  45. public:
  46.  
  47. Pescado1(int x, int y);
  48. void Borrar_Pescado1();
  49. void Cuerpo_Pescado1();
  50. void Dibujar_Pescado1();
  51.  
  52. };
  53.  
  54. class Pescado2 : public Pescado{
  55.  
  56. public:
  57.  
  58. Pescado2(int x, int y);
  59. void Borrar_Pescado2();
  60. void Cuerpo_Pescado2();
  61. void Dibujar_Pescado2();
  62. void Color_Pescado2();
  63.  
  64. };
  65.  
  66. void Pescado::Mover_Pescado(){
  67.  
  68. prev_x = pos_x;
  69. prev_y = pos_y;
  70.  
  71. t_final = clock();
  72.  
  73. if((velocidad + t_inicial) < t_final){
  74.  
  75. int mov_vertical = rand()%2+1;  // 1-arriba 2-abajo
  76.  
  77. if(sentido==1) pos_x-=dir_x;
  78. if(sentido==2) pos_x+=dir_x;
  79. if(mov_vertical==1) pos_y-=dir_y;
  80. if(mov_vertical==2) pos_y+=dir_y;
  81.  
  82. if(pos_x < bizq){
  83. Pescado::Sentido_Pescado(2);
  84. dir_x = -dir_x;
  85. pos_x = bizq;
  86.  
  87. }
  88. if(pos_x > bder-12){
  89. Pescado::Sentido_Pescado(1);
  90. dir_x = -dir_x;
  91. pos_x = bder-12;
  92. }
  93. if(pos_y < bsup){
  94. dir_y = -dir_y;
  95. pos_y = bsup;
  96. }
  97. if(pos_y > binf){
  98. dir_y = -dir_y;
  99. pos_y = binf;
  100. }
  101.  
  102. t_inicial = t_final;
  103.  
  104. }
  105. }
  106.  
  107. void Pescado::Sentido_Pescado(int x){
  108.  
  109. if(x==1) sentido=1;
  110. if(x==2) sentido=2;
  111.  
  112. }
  113.  
  114. Pescado1::Pescado1(int x, int y){
  115.  
  116. velocidad=x;
  117. color=y;
  118.  
  119. dir_x=1;
  120. dir_y=1;
  121.  
  122. pos_x = rand()%61+10;
  123. pos_y = rand()%6+10;
  124.  
  125. sentido = rand() % 2+1;  //  mira izq/ mira der  
  126.  
  127. t_inicial = clock();
  128.  
  129. }
  130.  
  131. void Pescado1::Borrar_Pescado1(){
  132.  
  133. for(int k=0;k<6;k++){
  134. for(int p=0;p<12;p++){
  135. putchxy(prev_x+p,prev_y+k,' ');
  136. }
  137. }
  138.  
  139. }
  140.  
  141. void Pescado1::Cuerpo_Pescado1(){
  142.  
  143. if(sentido==1){  //pescado mirando izquierda
  144.  
  145. 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;
  146. 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;
  147. 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;
  148. 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;
  149. 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;
  150. 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;
  151.  
  152. }
  153. if(sentido==2){  //pescado mirando derecha
  154.  
  155. 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;
  156. 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;
  157. 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;
  158. 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;
  159. 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;
  160. 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;
  161.  
  162. }
  163.  
  164. }
  165.  
  166. void Pescado1::Dibujar_Pescado1(){
  167.  
  168. Pescado1::Borrar_Pescado1();
  169. Pescado1::Cuerpo_Pescado1();
  170.  
  171. for(int i=0; i<6; i++){
  172. for(int j=0; j<12; j++){
  173. textcolor(color);
  174. putchxy(pos_x+j,pos_y+i,array_b[i][j]);
  175. }
  176. }
  177.  
  178. }
  179.  
  180. Pescado2::Pescado2(int x, int y){
  181.  
  182. velocidad=x;
  183. color=y;
  184.  
  185. dir_x=1;
  186. dir_y=1;
  187.  
  188. pos_x = rand()%61+10;
  189. pos_y = rand()%6+10;
  190.  
  191. sentido = rand() % 2+1;  //  mira izq/ mira der  
  192.  
  193. t_inicial = clock();
  194.  
  195. }
  196.  
  197. void Pescado2::Borrar_Pescado2(){
  198.  
  199. for(int k=0;k<10;k++){
  200. for(int p=0;p<4;p++){
  201. putchxy(prev_x+k,prev_y+p,' ');
  202. }
  203. }
  204.  
  205. }
  206.  
  207. void Pescado2::Cuerpo_Pescado2(){
  208.  
  209. if(sentido==1){  //pescado mirando izquierda
  210.  
  211. array_s[0][0]=0;array_s[0][1]=0;array_s[0][2]=47;array_s[0][3]=39;
  212. array_s[1][0]=0;array_s[1][1]=46;array_s[1][2]=111;array_s[1][3]=45;
  213. array_s[2][0]=0;array_s[2][1]=45;array_s[2][2]=0;array_s[2][3]=45;
  214. array_s[3][0]=47;array_s[3][1]=0;array_s[3][2]=41;array_s[3][3]=39;
  215. array_s[4][0]=124;array_s[4][1]=0;array_s[4][2]=41;array_s[4][3]=39;
  216. array_s[5][0]=0;array_s[5][1]=45;array_s[5][2]=0;array_s[5][3]=39;
  217. array_s[6][0]=0;array_s[6][1]=46;array_s[6][2]=0;array_s[6][3]=39;
  218. array_s[7][0]=0;array_s[7][1]=0;array_s[7][2]=92;array_s[7][3]=39;
  219. array_s[8][0]=0;array_s[8][1]=0;array_s[8][2]=47;array_s[8][3]=92;
  220. array_s[9][0]=0;array_s[9][1]=0;array_s[9][2]=40;array_s[9][3]=40;
  221.  
  222. }
  223. if(sentido==2){  //pescado mirando derecha
  224.  
  225. array_s[0][0]=0;array_s[0][1]=0;array_s[0][2]=41;array_s[0][3]=41;
  226. array_s[1][0]=0;array_s[1][1]=0;array_s[1][2]=92;array_s[1][3]=47;
  227. array_s[2][0]=0;array_s[2][1]=0;array_s[2][2]=47;array_s[2][3]=39;
  228. array_s[3][0]=0;array_s[3][1]=46;array_s[3][2]=0;array_s[3][3]=39;
  229. array_s[4][0]=0;array_s[4][1]=45;array_s[4][2]=0;array_s[4][3]=39;
  230. array_s[5][0]=124;array_s[5][1]=0;array_s[5][2]=40;array_s[5][3]=39;
  231. array_s[6][0]=92;array_s[6][1]=0;array_s[6][2]=40;array_s[6][3]=39;
  232. array_s[7][0]=0;array_s[7][1]=45;array_s[7][2]=0;array_s[7][3]=45;
  233. array_s[8][0]=0;array_s[8][1]=46;array_s[8][2]=111;array_s[8][3]=45;
  234. array_s[9][0]=0;array_s[9][1]=0;array_s[9][2]=92;array_s[9][3]=39;
  235.  
  236. }
  237.  
  238.  
  239.  
  240. }
  241.  
  242. void Pescado2::Dibujar_Pescado2(){
  243.  
  244. Pescado2::Borrar_Pescado2();
  245. Pescado2::Cuerpo_Pescado2();
  246.  
  247. for(int i=0; i<10; i++){
  248. for(int j=0; j<4; j++){
  249. textcolor(color);
  250. putchxy(pos_x+i,pos_y+j,array_s[i][j]);
  251. }
  252. }
  253.  
  254.  
  255. }
  256.  
  257. void Pescado2::Color_Pescado2(){
  258.  
  259. if(color==15) color=1;
  260. else color+=1;
  261.  
  262. }
  263.  
  264. int main(int argc, char *argv[]){
  265.  
  266. _setcursortype(_NOCURSOR);
  267.  
  268. srand(time(NULL));
  269.  
  270. Pescado1 Rojo(50,12);
  271. Pescado1 Verde(80,10);
  272.  
  273. Pescado2 Amarillo(60,14);
  274. Pescado2 Cyan(125,11);
  275.  
  276. while(true){
  277.  
  278. if(kbhit()) {
  279. int tecla=getch();
  280. switch(tecla)
  281. {
  282.  
  283. case 49:
  284. Rojo.Sentido_Pescado(1);
  285. Verde.Sentido_Pescado(1);
  286. break;
  287. case 50:
  288. Rojo.Sentido_Pescado(2);
  289. Verde.Sentido_Pescado(2);
  290. break;
  291. case 51:
  292. Amarillo.Color_Pescado2();
  293. Cyan.Color_Pescado2();
  294. break;
  295.  
  296.  
  297. }
  298. }
  299.  
  300. Rojo.Mover_Pescado();
  301. Rojo.Dibujar_Pescado1();
  302. Verde.Mover_Pescado();
  303. Verde.Dibujar_Pescado1();
  304. Amarillo.Mover_Pescado();
  305. Amarillo.Dibujar_Pescado2();
  306. Cyan.Mover_Pescado();
  307. Cyan.Dibujar_Pescado2();
  308.  
  309. }
  310.  
  311. return 0;
  312.  
  313. }
  314.  

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


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Re: Acceso método de clase base/madre
« Respuesta #1 en: 25 Agosto 2014, 23:20 pm »

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

sentido = !sentido


En línea

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

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Acceso método de clase base/madre
« Respuesta #2 en: 26 Agosto 2014, 01:21 am »

Tu sugerencia me ayudó a resolver el problema. Gracias!!!
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Acceso método de clase base/madre
« Respuesta #3 en: 1 Septiembre 2014, 12:59 pm »

Lo correcto sería tener un método escrito de esta manera: [/b]

Código
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. if(sentido==2) sentido=1;
  5.  
  6. }

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
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. else if(sentido==2) sentido=1;
  5.  
  6. }

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

Código
  1. void Pescado::Sentido_Pescado(){
  2.  
  3. if(sentido==1) sentido=2;
  4. else sentido=1;
  5.  
  6. }

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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines