Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: caos en 3 Marzo 2014, 21:05 pm



Título: encontrar el ultimo valor de la matriz recorrida
Publicado por: caos en 3 Marzo 2014, 21:05 pm
Buenos dias, yo soy nuevo en el ámbito de C, he empezado a programar hace relativamente poco, he visto en otro tema algo similar a esto, pero no consigo que el programa me diga el ultimo valor de la tabla que ha recorrido  una bola.

El programa quiero que conste de una matriz de ceros y unos, donde los ceros son espacios en blanco y los unos obstáculos.

Código
  1.  int matriz[10][10]={
  2.  {0,0,0,0,0,0,0,0,0,0},
  3.  {0,1,0,0,1,0,0,0,1,0},
  4.  {0,1,0,1,0,0,0,1,0,0},
  5.  {0,1,0,0,0,0,1,0,0,0},
  6.  {0,0,0,0,0,0,0,0,0,1},
  7.  {0,1,1,1,1,0,0,0,1,0},
  8.  {0,0,0,0,0,0,0,1,0,0},
  9.  {0,0,0,0,0,0,1,0,0,0},
  10.  {0,0,0,0,0,1,0,0,0,0},
  11.  {0,0,0,0,0,0,0,0,0,0},
  12.  };
  13.  
una vez tenemos esto se tiene que tirar una "bola" desde la parte superior de la tabla y que llegue a la parte inferior de la misma, evadiendo los obstáculos según se ha declarado anteriormente si es derecha o izquierda. Tengo este texto:

Código
  1.                         while(i<49){
  2.                            if (matriu[i+1][j]==0)
  3.      matriz[++i][j]=cont++;
  4.    else if (direccion=='D' || direccion=='d' && matriu[i][j+1]==0 )
  5.      matriz[i][++j];
  6.    else if (direccion=='D' || direccion=='d' && matriu[i][j+1]==1 )
  7.      matriz[i][--j];
  8.    else if (direccion=='I' || direccion=='i' && matriu[i][j-1]==0)
  9.      matriz[i][--j];
  10.    else if (direccion=='I' || direccion=='i' && matriu[i][j-1]==1)
  11.      matriz[i][++j];[/table]

A partir de aqui no encuentro la forma de que el programa me diga cual es la ultima coordenada de la matriz conde llega una "bola" que ha sido lanzada desde la parte superior.

Agradezco sus comentarios :)



Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: People95 en 3 Marzo 2014, 21:20 pm
Jordiiii te pillé jajajaja, suerte con esto!


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 3 Marzo 2014, 21:56 pm
Jordiiii te pillé jajajaja, suerte con esto!

Pues parece que si va a tener suerte.

Añades justo la línea del printf que te indico en el código e incluyes la nueva variable "colum_final" en la función pelota:


Código
  1.   void pelota (int matriu[50][50]){
  2.  
  3. int inicio,i,j,cont=0,colum_final;   /** NUEVA VARIABLE **/
  4. .....................................
  5.    else if (direccion=='I' || direccion=='i' && matriu[i][j-1]==1)
  6.      matriu[i][++j]=cont++;
  7.  }
  8.  colum_final=j+1; /** ESTA VARIABLE **/
  9.  for(i=0;i<50;i++)
  10.  {
  11.     printf("\t\t");
  12.     for(j=0;j<50;j++)
  13.      {
  14.         if(matriu[i][j]==1)
  15.            printf("X ");
  16.         else if(matriu[i][j]==0 )
  17.            printf(". ");
  18.         else
  19.            printf("%d ",matriu[i][j]-2);
  20.     }
  21.     printf("\n");
  22.  }
  23.  printf ("\n\t\tColumna Final= %d\n",colum_final); /** <==ESTA LINEA **/
  24. }
  25.  
  26. void cambiartabla (int matriu[50][50]){
  27.  

Por cierto, mirar donde salen los errores y warnings y veréis que os sobran multitud de variables no usadas y falta el return 0 de la función main, entre otras lindeces.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: caos en 3 Marzo 2014, 23:23 pm
leosansan, te agradezco la aportación, me ha ayudado en cantidad, muchas gracias   ;D


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 4 Marzo 2014, 04:36 am
leosansan, te agradezco la aportación, me ha ayudado en cantidad, muchas gracias   ;D

De nada amigo Jordi, aquí estamos para eso, ayudar dentro de nuestras posibilidades y más cuando se ha currado previamente.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: Yoel Alejandro en 5 Marzo 2014, 21:24 pm
Sería muy interesante hacer la animación de la pelota rebotando (refrescamiento de pantalla cuadro a cuadro y con pausa entre ellos), al estilo de un videojuego  :laugh:

¿alguien se atreve?


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 6 Marzo 2014, 00:05 am
Sería muy interesante hacer la animación de la pelota rebotando (refrescamiento de pantalla cuadro a cuadro y con pausa entre ellos), al estilo de un videojuego  :laugh:

¿alguien se atreve?

¿Me estas llamando gallina?.

Es una broma, ¡¡¡Ehhh...!!!.

Algo rápido que esto cada vez se parece más a una competición de partidas de ajedrez contra reloj.
Insisto, rápido y hecho a bote pronto sin tan siquiera analizar en profundidad el código:

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. void imprimir (int matriu[50][50]);
  5. void pelota (int matriu[50][50]);
  6. void cambiartabla (int matriu[50][50]);
  7.  
  8. int main()
  9. {
  10. //system( "MODE 110,150");
  11. int num;
  12. int matriu[50][50]={
  13. {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  14. {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
  15. {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
  16. {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
  17. {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
  18. {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  19. {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  20. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  21. {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  22. {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  23. {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  24. {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  25. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  26. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  27. {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  28. {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  29. {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  30. {0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  31. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  32. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  33. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  34. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
  35. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  36. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  37. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  38. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  39. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  40. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  41. {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  42. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  43. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  44. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  45. {0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  46. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  47. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  48. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  49. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  50. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  51. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  52. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  53. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  54. {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  55. {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  56. {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  57. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  58. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  59. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  60. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  61. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  62. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  63. };
  64.  
  65. while(num!=5)
  66. {
  67. printf("\n");
  68.    printf("Que acci\xa2n desea realizar:\n");
  69. printf("\t1.- Mostrar la tabla.\n");
  70. printf("\t2.- Tirar una bola.\n");
  71. printf("\t3.- Tirar 20 bolas.\n");
  72. printf("\t4.- Cambiar la tabla.\n");
  73. printf("\t5.- Salida.\n");
  74. scanf("%d",&num);
  75. switch(num)
  76. {
  77. case 1:
  78.        imprimir (matriu);
  79. break;
  80. case 2:
  81. pelota (matriu);
  82. break;
  83. case 3:
  84. printf("caso 3\n");
  85. break;
  86. case 4:
  87. cambiartabla (matriu);
  88. break;
  89. case 5:
  90. printf("Adios.\n");
  91. printf("\n");
  92. break;
  93. default:
  94. printf("El n\xA3mero introducido no pertenece al menos, int\x82ntelo de nuevo.\n");
  95. }
  96. }
  97. return 0;
  98. }
  99.  
  100.  
  101. void imprimir (int matriu[50][50]){
  102. int i,j;
  103. for (i = 0; i < 50; i++){
  104. for (j = 0; j < 50; j++){
  105.      if(matriu[i][j]==1)
  106.        printf("X");
  107.      else
  108.        printf(".");
  109.    }
  110. printf ("\n");
  111. }
  112. }
  113.  
  114. void pelota (int matriu[50][50]){
  115.  
  116. int inicio,i,j,cont=0,colum_final;
  117. char direccion;
  118.  
  119. do{
  120.    printf("\nIntroducir el n\xA3mero de columna por el cual desea lanzar la primera bola (1-50): ");
  121.    scanf("%d",&inicio);
  122.  }while(inicio>=51);
  123.  inicio--;
  124.  
  125.  do{
  126.    printf("\nEn caso de encontrarse con un obst\xAculo, en que direcci\xA2n\nquiere que se dirija la bola, derecha (D-d) o izquierda (I-i): ");
  127.    scanf(" %c", &direccion);
  128.  }while(direccion!='D' && direccion!='d' && direccion!='I' && direccion!='i');
  129.  
  130.  i=0,j=inicio,cont=2;
  131.  matriu[i][j]=cont++;
  132.  
  133.  while(i<49){
  134.    if (j==-1)
  135.    matriu[i][++j]=cont++;
  136.    else if (j==50)
  137.  matriu[i][--j]=cont++;
  138.    else if (matriu[i+1][j]==0)
  139.      matriu[++i][j]=cont++;
  140.    else if ((direccion=='D' || direccion=='d') && matriu[i][j+1]==0 )
  141.      matriu[i][++j]=cont++;
  142.    else if ((direccion=='D' || direccion=='d') && matriu[i][j+1]==1 )
  143.      matriu[i][--j]=cont++;
  144.    else if ((direccion=='I' || direccion=='i') && matriu[i][j-1]==0)
  145.      matriu[i][--j]=cont++;
  146.    else if ((direccion=='I' || direccion=='i') && matriu[i][j-1]==1)
  147.      matriu[i][++j]=cont++;
  148.  }
  149.  colum_final=j+1;
  150.  system ("cls");
  151.  gotoxy (0,0);
  152.  for(i=0;i<50;i++)
  153.  {
  154.     for(j=0;j<50;j++)
  155.      {
  156.         if(matriu[i][j]==1){
  157.           color (191);
  158.           gotoxy (j,i);
  159.           printf("X");
  160.           color (7);
  161.         }
  162.  
  163.         else {
  164.           color (114);
  165.           gotoxy (j,i);
  166.           printf(".");
  167.           color (7);
  168.         }
  169.     }
  170.     printf("\n");
  171.  }
  172.  gotoxy (0,0);
  173.  for(i=0;i<50;i++)
  174.  {
  175.     for(j=0;j<50;j++)
  176.      {
  177.        if(matriu[i][j]!=1  && matriu[i][j]!=0){
  178.           color (206);
  179.           gotoxy (j,i);
  180.           printf("%d",0);
  181.           color (7);
  182.           Sleep (750);
  183.         }
  184.     }
  185.     printf("\n");
  186.  }
  187.  printf ("\n\t\tColumna Final= %d\n",colum_final);
  188. }
  189.  
  190.  
  191. void cambiartabla (int matriu[50][50]){
  192.  
  193. int i,j,fila,columna;
  194. char seguir;
  195. while(seguir!=2)
  196. {
  197. printf("\n");
  198.    printf("Presiona 1 si quieres seguir cambiando valores.\n");
  199. printf("Presiona 2 si quieres ver la tabla.\n");
  200. scanf("%c",&seguir);
  201. switch(seguir)
  202. {
  203. case '1':
  204.  
  205. do{
  206.              printf("\nIntroducir la fila del valor que quieres cambiar (1-50): ");
  207.              scanf("%d",&columna);
  208.              printf("\nIntroducir la columna del valor que quieres cambiar (1-50): ");
  209.              scanf("%d",&fila);
  210.  
  211. }while(columna>=51 && fila>=51 );
  212.          i=columna,j=fila;
  213.          if (matriu[i][j] == 0)
  214.            matriu[i][j] = 1;
  215.          break;
  216.  
  217. case '2':
  218.  
  219.          for(i=0;i<49;i++)
  220.            for(j=0;j<48;j++)
  221.              if (matriu[i][j]==1 && matriu[i+1][j+1]==1 && matriu[i][j+2]==1)
  222.            puts("ERROR NO SE HA HECHO NINGUN CAMBIO");
  223.            matriu[columna][fila] = 0;
  224.  
  225.        for(i=0;i<50;i++)
  226.        {
  227.           ///printf("\t\t");
  228.            for(j=0;j<50;j++)
  229.            {
  230.               if(matriu[i][j]==1)
  231.                  printf("X  ");
  232.               else if(matriu[i][j]==0 )
  233.                  printf(".  ");
  234.           }
  235.           printf("\n");
  236.        }
  237.        break;
  238.      default:
  239. printf("El n\xA3mero introducido es incorrecto.\n");
  240.  
  241. }
  242. }
  243. }
  244.  
  245. /***********************************************/
  246.            /***   FUNCION COLOR   ***/
  247.  /***********************************************/
  248.  
  249. void color (int n)
  250. {
  251.        SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  252. }
  253.  
  254. /***********************************************/
  255.            /***   FUNCION GOTOXY   ***/
  256.  /***********************************************/
  257.  
  258. int gotoxy(int x, int y)
  259. {
  260.   COORD coord;
  261.   HANDLE h_stdout;
  262.   coord.X = x;
  263.   coord.Y = y;
  264.   if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  265.      return 0;
  266.   if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  267.      return 0;
  268.   return 1;
  269. }
  270.  
  271.  

Elegid 2=partida y ahí introducir los datos, columna de lanzamiento y desvío derecha o izquierda, a no ser que se cierre y tiende al otro lado.

El resultado, para verlo en movimiento,es  ejecutando el programa:


(http://i1280.photobucket.com/albums/a497/leosansan/pinball2_zps41e0af02.jpg)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: Yoel Alejandro en 6 Marzo 2014, 16:38 pm
COOL !!!!!!!!!!!

Mira, tengo que hacerle unos ajustes para correrlo en Linux pues como sabes no sirve windows.h. En particular, cambiar los métodos color() y gotoxy() que controlan aspectos de la terminal, para que funcionen en base a secuencias de escape.

Por cierto una curiosidad, ¿por qué no codificaste esos métodos basados en servicios de BIOS, que es como creo están implementados en conio (hasta donde tengo recuerdo, con los viejos compiladores de Borland 16bits y 32bits que usé alguna vez para Windows)?

Leo, se me ocurre que una forma de ampliar el programa, sería habilitar las teclas de flecha, para uno poder conducir la pelota por en medio de los obstáculos, algo como mini-pinball. Me ofrecería a hacer algo de esa parte, puesto que ya tú ya hiciste lo primero, jeje (complementarnos en vez de competir) ....


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 9 Marzo 2014, 08:18 am
COOL !!!!!!!!!!!
...................................................
Leo, se me ocurre que una forma de ampliar el programa, sería habilitar las teclas de flecha, para uno poder conducir la pelota por en medio de los obstáculos, algo como mini-pinball. Me ofrecería a hacer algo de esa parte, puesto que ya tú ya hiciste lo primero, jeje (complementarnos en vez de competir) ....


¡¡¡Eso es hacer trampas!!!

Desde que encuentre un hueco me pongo a ello. Lo que pasa es que las API de Windows son muy .... muy ...oscuras.

Podía haber usado conio2.h, que tengo instalada y en alguna que otra ocasión uso,  para el color y el gotoxy ......pero paso de regresar al pasado.

Perdona que no ponga nada en Linux pero ya pase por el MS-DOS y paso de dar ni un pasito atrás, con perdón para sus seguidores.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: Yoel Alejandro en 9 Marzo 2014, 16:55 pm
Jajaja, ¿MS-DOS?. De buena intención te digo que deberías aventurarte a conocer el Linux, cuando lo domines no querrás dejarlo. Te voy a poner un ejemplo, quieres inspeccionar en el directorio actual todos los ficheros cuyo nombre empieza con "abc" y hayan sido modificados hace menos de 10m. Con una simple orden bash (la consola de Linux):

find . -name "abc*" -mmin -10

¿y cómo lo harías así de rápido en Win?

Bueno pero volviendo al tema, al final quedé un poco frustrado porque no logré el comportamiento deseado. Me hubiera gustado que la bola siguiera un movimiento continuo en una dirección dada y al pulsar una tecla de flecha cambiara la dirección. Pero esto tiene un inconveniente, y es que la pulsación de dichas flechas sería asíncrona, es decir, no sabes cuándo va a suceder. Si haces algo como:

Sleep(500);
c = getch();

sería un error porque se quedaría "colgado" tras cada movimiento pidiendo tecla.

Lo ideal aquí sería un "servicio" o "demonio", es decir un programa que corre paralelo al principal, en segundo  plano, y su labor sería inspeccionar si hay caracteres no leídos en el búfer de teclado. En ese caso, los extrae e interpreta: si es un carácter de flecha, cambia la dirección de la bola. Si no hay caracteres disponibles no hacer nada.

Hasta lo que tengo entendido la función getch() no funciona de este modo porque es "bloqueante", es decir bloquea el programa llamador hasta que se reciba un carácter. En los sistemas conformes a POSIX este comportamiento se puede modificar para que espere un tiempo dado y de no recibir carácter en ese lapso, devuelva al programa principal. En Windows realmente no se cómo se pude imitar este comportamiento (aunque de seguro se puede), imagino que un manera sería crear un "servicio" que inspeccione continuamente el teclado y deposite los caracteres en un búfer virtual. De esta manera al no recibir tecla se bloquearía el programa servicio y no el programa principal.

Finalmente, y para curar en salud, elegí quitar la pausa y pedir tecla siempre  :rolleyes:
O sea, la pelotita se mueve sólo un paso a la vez. Tienes que teclear y teclear para moverla por todo el tablero. Por otro lado, y como no recuerdo la codificación de la teclas de flecha en Windows, decidí hacerlo con las teclas del teclado numérico:

8:  arriba
2:  abajo
4:  izq
6:  der

Si sabes los códigos de las teclas de flecha en Win, modifica el programa en la parte de getch(). En Linux (como es conforme al estándar ECMA) estas teclas se codifican de manera diferente, como "secuencias de escape". De hecho, es bueno saber que supuestamente el único sistema que no acepta secuencias de escape es Windows (?!), o sea, Win es la excepción y no la regla (aunque esa "excepción" copa el 90% del mercado!)

Volviendo al tema, el juego termina cuando hayas alcanzado la fila inferior del tablero, o te hayas excedido del máximo posible de movimientos (le puse un límite de 100, jeje). Sería bueno modificar el tablero para hacer una especie de laberinto ...

El código es multiplataforma, se puede compilar en Linux y en Windows. Para el primer caso debes definir la macro _LINUX, y para el segundo define _WIN. Lo más cómodo es por supuesto en la orden de compilación:

Windows: gcc -o tablero tablero.c -D_WIN
Linux:   gcc -o tablero tablero.c -D_LINUX


Pruébalo y me comentas si le añadimos o quitamos algo (sólo modifiqué la opción 2 del programa, no toqué ni la 3 ni la 4).

NOTA. El parámetro blocked parece redundante (no hace nada) pero está porque en un principio quería hacer que al quedarse bloqueado pidiera tecla para cambiar la dirección, pero como comenté anteriormente no pude al menos en este primer intento.

Aquí el código fuente (pastebin): http://pastebin.com/fDweNAsf (http://pastebin.com/fDweNAsf)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 9 Marzo 2014, 18:37 pm
Me quito el sombreo "maestro", pequeño saltamontes se descubre ante ti.

...Y no, no estoy por la labor de aprender comandos y más comandos tipo MS.DOS. Como te dije, ya pasé por esa etapa y, al fin y al cabo, seguimos teniendo la consola en Windows. Pero no dejo de reconocer que es más rápido el sistema de comandos, una vez que te aprendes los cientos de órdenes posibles ......

Por cierto, ¿por qué usar pastebin y no colgarlo directamente?. Así permanece por los tiempos de los tiempos. Ya sé que es un pelín largo, al menos para mi gusto, pero tampoco tanto.

Un fuerte abrazo campeón.


(http://i1280.photobucket.com/albums/a497/leosansan/Bandera_de_Venezuela_zpsf4a3b906.png)

(http://i1280.photobucket.com/albums/a497/leosansan/CANARIASLIBRE_zps59976185.jpg)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: Yoel Alejandro en 9 Marzo 2014, 23:30 pm
Igualmente un gran abrazo hermano, aprecio tu solidaridad !!!!!!!!!  ;D

Ah, el pastebin es porque como es un código largo, para no embasurar el foro, pero también se puede poner aquí ...

Mira, pero me pusiste la bandera "izquierdista", con 8 estrellas y el caballo andando a la izquierda, jaja. Tienes que poner ésta  :laugh:

(http://enciclopedia.us.es/images/7/7d/Bandera_de_Venezuela.png)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 9 Marzo 2014, 23:39 pm
Puesta está.

GAMA DE COLORES (http://foro.elhacker.net/programacion_cc/pequenita_aportacion_gama_de_colores_y_gran_duda_al_respecto-t391209.0.html)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: Yoel Alejandro en 12 Marzo 2014, 01:29 am
Leo, acabo de leer tu artículo sobre los colores en la consola de Windows y lo entendí perfecto.

Yo creo que para ese propósito estaría bien preparar un pequeño fichero .h con nmemónicos para los colores, haciéndolos más fácil de recordar y utilizar. Porque la verdad cuando vi como color(7), color(191), etc .... no entendí nada, sólo que obviamente era un cierto color  :rolleyes:

Aunque aquél tema es viejo, vi la pregunta sobre ingeniársela para producir más de 255 colores. Sabes que soy un "minimalista", pero ese hecho no implica que nuestros trabajos deban ser limitados. Steve Jobs también era "minimalista", y mira a lo que llegó !!!. Si somos creativos, aunque tengamos una pequeña paleta de colores podríamos hacer programas funcionales y muy buenos. Por otra parte, irse a las API's tiene la desventaja de hacer el programa altamente dependiente de sistema, y tratándose de Windows hasta es posible que funcione en una determinada versión y no en otra.

En definitiva, si es una aplicación de consola yo no buscaría más colores, con los que muestras me parece suficiente, aunque no se qué opines tú ....


Título: Re: encontrar el ultimo valor de la matriz recorrida
Publicado por: leosansan en 12 Marzo 2014, 06:16 am

He llegado a comprender que para trabajos de consola con los colores que están son más que suficientes.

Y respecto a cómo recordarlos todo es tener a mano la tablita:


Citar
PARA LA CONSOLA: system ("color numero(fondo)letra(letras)")

Otra forma es coger una combinación de fondo y letra:

n=16*fondo+letra

Color fondo de consola :

0 = Negro
1 = Azul
2 = Verde
3 = Aguamarina
4 = Rojo
5 = Purpura
6 = Amarillo
7 = Blanco
8 = Gris
9 = Azul claro

Color de texto:

A=10 = Verde claro
B=11 = Aguamarina claro
C=12 = Rojo claro
D=13 = Purpura claro
E=14 = Amarillo claro
F=15 = Blanco brillante

y aplicar el resultado "n" a:
        
    color( n );


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)