Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Perrito08 en 18 Noviembre 2012, 02:42 am



Título: Un pequeño regalo de un viejo conocido...
Publicado por: Perrito08 en 18 Noviembre 2012, 02:42 am
Aquí os dejo una cosita que he hecho esta noche ;) Llevaba tiempo sin programar absolutamente nada y he pensado que ya era hora...
Tan sólo comentadme si veis que le falta algo importante, si he puesto algún disparate, etc... Si os animáis hasta podéis seguir desarrollándolo un poquito ;) ¡Gracias!

Citar
Pastebin: http://pastebin.com/Gwq42z1u
Código
  1. // By ***** : 17-18.11.2012 : Lenguaje C
  2. // FALTA: - Mostrar casillas próximas a abierta que sean 0 - Implementar sistema de marcación por tiempo y menú
  3. // - Mejorar entrada datos - Implementar interfaz más intuitiva
  4. // - Mejorar algoritmo y simplificar el código
  5. // Made with NANO + GCC  -  Linux Ubuntu 3.5.0-17 i686  -  También funciona correctamente en plataforma Windows [PORTABLE]
  6.  
  7. #include <stdio.h>
  8. #define TAM2 6
  9. #define TAM (TAM2*TAM2)
  10. #define MINA TAM2*2
  11.  
  12. int main (int argc, char *argv [])
  13. { printf ("Buscaminas 1.0 : By ***** 2012\n"); if (TAM2<=2 || TAM2>9) { printf ("[!] Please change the TAM2 value [>2 min - <9 max]\n"); return 1; } printf ("\n");
  14. int tablero [TAM], tablero2 [TAM], a, b, x; srand (time (NULL)); for (a=0; a<TAM; a++) { tablero [a]=0; tablero2 [a]=0; }
  15. for (a=0; a<MINA; a++) { b=rand ()%TAM; while (tablero [b]==-1) b=rand()%TAM; tablero [b]=-1; }
  16. for (a=0, b=0; a<TAM; a++) {
  17. if (tablero [a-1]==-1 && (a+0)%TAM2!=0 && a>=1) b++; if (tablero [a+1]==-1 && (a+1)%TAM2!=0 && a<(TAM-1)) b++;
  18. if (tablero [a-TAM2]==-1 && a>=TAM2) b++; if (tablero [a+TAM2]==-1 && a<(TAM-TAM2)) b++;
  19. if (tablero [a-(TAM2+1)]==-1 && (a+0)%TAM2!=0 && a>=(TAM2+1)) b++; if (tablero [a+(TAM2+1)]==-1 && (a+1)%TAM2!=0 && a<(TAM-TAM2-1)) b++;
  20. if (tablero [a-(TAM2-1)]==-1 && (a+1)%TAM2!=0 && a>=(TAM2-1)) b++; if (tablero [a+(TAM2-1)]==-1 && (a+0)%TAM2!=0 && a<(TAM-TAM2+1)) b++;
  21. if (tablero [a]==-1) {b=0; continue;} else tablero [a]=b; b=0; }
  22.  
  23. while (1) { printf ("    "); for (x=1; x<=TAM2; x++) printf ("%d ", x); printf ("\n    "); for (x=1; x<=TAM2; x++) printf ("- ", x);
  24. for (a=0; a<TAM; a++) {
  25. if (a%TAM2==0) printf ("\n%d.  ", (a/TAM2)+1); if (tablero2 [a]==1) printf ("%d ", tablero [a]); else printf (". "); } printf ("\n");
  26. printf ("\nInsert X: "); scanf ("%d", &a); while (a<1 || a>TAM2) { printf ("[!] The inserted value is not OK. Please choose one value between 1 and %d...\n", TAM2); printf ("\nInsert X: "); scanf ("%d", &a); }
  27. printf ("Insert Y: "); scanf ("%d", &x); while (x<1 || x>TAM2) { printf ("[!] The inserted value is not OK. Please choose one value between 1 and %d...\n", TAM2); printf ("Insert Y: "); scanf ("%d", &x); } a=(a-1)*TAM2+(x-1);
  28. if (tablero [a]==-1) { printf ("---  You lost this time...  ---\n"); printf ("    "); for (x=1; x<=TAM2; x++) printf ("%d ", x); printf ("\n    "); for (x=1; x<=TAM2; x++) printf ("- ", x); for (a=0; a<TAM; a++) { if (a%TAM2==0) printf ("\n%d.  ", (a/TAM2)+1); if (tablero [a]==-1) printf ("* "); else printf ("%d ", tablero [a]); } printf ("\n\n"); return 0; }
  29. else {tablero2 [a]=1; b++;}
  30. if (b==TAM-MINA) { printf ("\nCongratulations! You won this time...\n"); return 0; } }
  31. }
  32.  


*** Modif 18/11/12 - 11:25 : He eliminado un bucle for innecesario


Título: Re: Un pequeño regalo de un viejo conocido...
Publicado por: zonahurbana en 20 Noviembre 2012, 21:45 pm
Código:
#define TAM2 6
#define TAM (TAM2*TAM2)
#define MINA TAM2*2
Sobre estas líneas, ¿se llaman macros?
Voy a referirme a la primera expresión que le sigue a #define como "abreviatura" y a lo que le sigue como "lo abreviado".
Me parece que cada vez que defines una abreviatura para cierta expresión, cuando uses de allí en adelante la abreviatura, es como si en el código se pegara "lo abreviado" como más código, justo antes de que el compilador convierta a lenguaje máquina las instrucciones.
Es como un comando más que una instrucción, de modo que cada vez que has usado MINA se ha realizado una multiplicación, y lo mismo con TAM.
Quizás en este caso no importe mucho, pero creo que podrías haber usado:
Código:
cons int TAM2=6;
cons int TAM = TAM2*TAM2;
const int MINA = TAM2*2;


Título: Re: Un pequeño regalo de un viejo conocido...
Publicado por: Perrito08 en 20 Noviembre 2012, 22:50 pm
Cierto, se ahorra mucho tiempo si declaro MINA y TAM como variables, pero TAM2 es básica, porque define el tamaño del tablero y está así para que se pueda modificar fácilmente...