Advertisement
nRikee

Buscaminas (Final version) v0.5

Apr 25th, 2012
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <math.h>
  5.  
  6. /* Constantes y variables */
  7. #define BLANCO 32
  8. #define MINA 1
  9. #define ACCENT_A 133
  10. #define ACCENT_O_OBERT 149
  11. #define ACCENT_O_TANCAT 162
  12. #define ACCENT_U_TANCAT 163
  13. #define INTERROGANTE 168
  14. #define EXCLAMACION 173
  15. #define EXPLOSION 'x'
  16. #define BANDERA 190
  17. char tabla[17][17];
  18. char tabla2[17][17];
  19. char idioma;
  20. int fila; // Para la funcion comprobar
  21. int columna; // Para la funcion comprobar
  22. int asterisco; // asterisco=1 para la bandera
  23. int banderas; // Para contabilizr el numero de banderas puestas.
  24. char posicionbanderas[8][2];
  25.  
  26. /* Declaración de funciones */
  27. void elegiridioma();
  28. void inicio();
  29. void menu();
  30. void definir_tabla();  // Crea el tablero (9+1 x 9+1) con espacios en BLANCO (32) // TAMBIEN sirve para limpiar el tablero
  31. void imprimir();  // Imprime en la pantalla el tablero2.
  32. void insertar_minas();  // Pone 9 minas aleatoriamente.
  33. void interfaz(); // "Menú" + imprimir()
  34. void filascolumnas(); // Convierte lo escaneado (A3) en columna=1 fila=3
  35. int comprobar(int f, int c);
  36.  
  37. main ()
  38. {
  39.     int x, banderascorrectas; // Para funciones FOR
  40.     srand (getpid());
  41.     char buffer[5];
  42.     elegiridioma();
  43.     inicio();
  44.  
  45.     /** 1- BUSCAMINAS **/
  46.     do
  47.     {
  48.         menu();
  49.         banderas=0;
  50.         definir_tabla();
  51.         definir_tabla2();
  52.         insertar_minas();
  53.  
  54.             /** 1.1-- MARCAR CASILLA **/
  55.             do
  56.             {
  57.                 system("cls");
  58.                 fflush(stdin);
  59.                 interfaz();
  60.                 switch(idioma)
  61.                     {
  62.                         case 'e':
  63.                         printf("\n\nType: ");
  64.                         break;
  65.  
  66.                         case 's':
  67.                         printf("\n\nTeclea: ");
  68.                         break;
  69.  
  70.                         case 'v':
  71.                         printf("\n\nTecleja: ");
  72.                         break;
  73.                     }
  74.                 scanf("%s",&buffer);
  75.                 filascolumnas(buffer);
  76.  
  77.                 if (columna==-1 || fila==-1) {continue;}
  78.  
  79.                 tabla2[fila][columna]= 0;
  80.                 tabla2[fila][columna]= comprobar(0,0)+48; //devuelve el numero de minas que rodean a la casilla
  81.  
  82.                 /* ¿PIERDES? */
  83.                 if(tabla2[fila][columna]==EXPLOSION)
  84.                 {
  85.                     system("cls");
  86.                     interfaz();
  87.                     break;
  88.                 }
  89.  
  90.                 /* ¿GANAS? */
  91.                 if (banderas==9)
  92.                 {
  93.                     banderascorrectas=0;
  94.                     for(x=0;x<9;x++)
  95.                     {
  96.                         if (tabla[posicionbanderas[x][0]][posicionbanderas[x][1]] == MINA)
  97.                             { banderascorrectas++; }
  98.                     }
  99.  
  100.                     if (banderascorrectas==9)
  101.                     {
  102.                         do
  103.                         {
  104.                             system("cls");
  105.                             interfaz();
  106.                             switch(idioma)
  107.                                 {
  108.                                     case 'e':
  109.                                     printf("\n\nYou win! Do you wanna play again? (s/n) ");
  110.                                     break;
  111.  
  112.                                     case 's':
  113.                                     printf("\n\n%cENHORABUENA, has ganado! %cQuieres jugar otra vez? (s/n)",EXCLAMACION,INTERROGANTE);
  114.                                     break;
  115.  
  116.                                     case 'v':
  117.                                     printf("\n\nENHORABONA, has guanyat! Vols jugar altra vegada? (s/n)");
  118.                                     break;
  119.                                 }
  120.                             fflush(stdin);
  121.                             scanf("%s",&buffer);
  122.                             system("cls");
  123.                         } while (buffer[0]!='s' && buffer[0]!='n' && (buffer[0]!='*' && buffer[0]!='*'));
  124.                         break;
  125.                     }
  126.                 }
  127.  
  128.                 /* EXPANDIR SI 0 */
  129.                     if(tabla2[fila][columna]=='0')
  130.                     {
  131.                         if (fila!=2)
  132.                         {
  133.                             tabla2[fila-1][columna] = comprobar(-1,0) + 48;
  134.                             tabla2[fila-1][columna+1] = comprobar(-1,+1) + 48;
  135.                         }
  136.                         if (columna!=2)
  137.                         {
  138.                             tabla2[fila+1][columna-1] = comprobar(+1,-1) + 48;
  139.                             tabla2[fila][columna-1] = comprobar(0,-1) + 48;
  140.                             if (fila!=0)
  141.                             {  tabla2[fila-1][columna-1] = comprobar(-1,-1) + 48;  }
  142.                         }
  143.                         tabla2[fila][columna+1] = comprobar(0,+1) + 48;
  144.                         tabla2[fila+1][columna+1] = comprobar(+1,+1) + 48;
  145.                         tabla2[fila+1][columna] = comprobar(+1,0) + 48;
  146.                     }
  147.                  /* FIN EXPANDIR */
  148.  
  149.                 /* Arreglo de titulos (A,B,C...) y (1,2,3...)    */
  150.                     for (fila=0;fila<10;fila++)
  151.                     {
  152.                         for (columna=0;columna<10;columna++)
  153.                         {
  154.                             if(fila==0)  // Poner columnas (A,B,C...) en la fila 0. Un espacio en blanco en las demas filas.
  155.                             {
  156.                                 if(columna!=0)
  157.                                 {
  158.                                     tabla2[fila][columna] = 64+columna;
  159.                                 }
  160.                             }
  161.                         }
  162.  
  163.                         if (fila!=0)
  164.                           {
  165.                             tabla2[fila][0]= 48+fila; // Poner las columnas (1,2,3...)
  166.                           }
  167.                     }
  168.                     tabla2[0][0]=BLANCO;
  169.  
  170.                 /* FIN Arreglo de titulos (A,B,C...) y (1,2,3...)    */
  171.  
  172.  
  173.                 system("cls");
  174.                 interfaz();
  175.             } while ( tabla2[fila][columna]!= EXPLOSION);
  176.  
  177.             /** FIN MARCAR CASILLA --1.1 **/
  178.         if(banderascorrectas!=9)
  179.             {
  180.                 do
  181.                 {
  182.                     switch(idioma)
  183.                         {
  184.                             case 'e':
  185.                             printf("\n\nYou have lost! Do you wanna play again? (s/n) ");
  186.                             break;
  187.  
  188.                             case 's':
  189.                             printf("\n\n%cHas perdido! %cQuieres intentarlo de nuevo? (s/n)",EXCLAMACION,INTERROGANTE);
  190.                             break;
  191.  
  192.                             case 'v':
  193.                             printf("\n\nHas perdut! Vols jugar altra vegada? (s/n)");
  194.                             break;
  195.                         }
  196.                     scanf("%s",&buffer);
  197.                     system("cls");
  198.                 } while (buffer[0]!='s' && buffer[0]!='n' && (buffer[0]!='*' && buffer[0]!='*'));
  199.             }
  200.  
  201.     } while(buffer[1]!= '*' && buffer[0]!='n');
  202.  
  203.     /** FIN BUSCAMINAS -1. **/
  204.  
  205.     return(0);
  206. }
  207.  
  208. void elegiridioma()
  209. {
  210.     do
  211.     {
  212.         system("cls");
  213.         printf("\n-Type 'e' for English.\n\n-Pulsa 's' para el castellano.\n\n-Prem 'v' per al valenci%c.\n\n",ACCENT_A);
  214.         scanf("%c",&idioma);
  215.         fflush(stdin);
  216.     } while (idioma!='e'&&idioma!='s'&&idioma!='v');
  217.     system("cls");
  218. }
  219.  
  220. void inicio()
  221. {
  222.     char inicio;
  223.     do
  224.     {
  225.         switch(idioma)
  226.         {
  227.             case 'e':
  228.             printf("\n MINESKEEPER\n\n Type 'c' to continue, 'a' for help, and 's' to finish the game.\n");
  229.             break;
  230.  
  231.             case 's':
  232.             printf("\n BUSCAMINAS\n\n Pulsa 'c' para continuar, 'a' para ayuda, y 's' para salir.\n");
  233.             break;
  234.  
  235.             case 'v':
  236.             printf("\n BUSCAMINES\n\n Prem 'c' per a continuar, 'a' per l'ajuda, i 's' per a eixir.\n");
  237.             break;
  238.         }
  239.         scanf("%c",&inicio);
  240.         if (inicio=='a')
  241.         {
  242.             system("cls");
  243.             switch(idioma)
  244.             {
  245.                 case 'e':
  246.                 printf("\n You can play this mineskeeper only with the keyboard.\n\n To mark a square, type a number following a letter,\n for example: 'B5' o 'D2'.\n\n - To mark where a mine is you can put an * before\n marking the square: '*C4'\n\n - To finish the game type '**'.\n\n\n Press any key to continue.");
  247.                 break;
  248.  
  249.                 case 's':
  250.                 printf("\n Este buscaminas se juega unicamente con el teclado.\n\n - Para marcar una casilla, introduzca una letra y un n%cmero,\n por ejemplo 'B5' o 'D2'.\n\n - Para marcar donde hay una mina puedes introducir un asterisco antes de\n marcar la casilla, por ejemplo: '*C4'\n\n - Para salir del juego introduzca dos asteriscos '**'.\n\n\n Pulse cualquier letra para continuar.",ACCENT_U_TANCAT);
  251.                 break;
  252.  
  253.                 case 'v':
  254.                 printf("\n Aquest buscamines es juga %cnicament amb el teclat.\n\n - Per a marcar una casella, introdueix una lletra i un n%cmero, \n per exemple 'B5' o 'D2'.\n\n - Per a marcar on hi ha una mina pots introduir un * abans de\n marcar la casella, per exemple: '*C4'\n\n - Per a eixir del joc introdueix '**'.\n\n\n Prem qualsevol bot%c per a continuar.",ACCENT_U_TANCAT,ACCENT_U_TANCAT,ACCENT_O_TANCAT);
  255.                 break;
  256.             }
  257.             getch();
  258.         }
  259.         if(inicio=='s')
  260.         {
  261.             exit(0);
  262.         }
  263.         fflush(stdin);
  264.         system("cls");
  265.     } while (inicio!='c');
  266. }
  267.  
  268. void menu()
  269. {
  270.     system("cls");
  271.     switch(idioma)
  272.         {
  273.             case 'e':
  274.             printf("\n MINESKEEPER\n\nMark every mines to win.\nTo do it, type the line and the column: 'A1', for example.\n\n Press any key to continue.\n");
  275.             break;
  276.  
  277.             case 's':
  278.             printf("\n BUSCAMINAS\n\nMarca todas las minas para ganar.\nPara hacerlo, teclea la fila y la columna: 'A1', por ejemplo.\n\n Pulsa una tecla para continuar.\n");
  279.             break;
  280.  
  281.             case 'v':
  282.             printf("\n BUSCAMINES\n\nMarque totes les mines per a guanyar.\nPer fer-ho, tecleja la fila i la columna; 'A1', per exemple.\n\n Prem qualsevol tecla per continuar.\n");
  283.             break;
  284.         }
  285.     getch();
  286. }
  287.  
  288. void definir_tabla()  // Crea el tablero (9+1 x 9+1) con espacios en BLANCO (32) // TAMBIEN sirve para limpiar el tablero
  289. {
  290.     int fila;
  291.     int columna;
  292.  
  293.     for (fila=0;fila<10;fila++)
  294.     {
  295.         for (columna=0;columna<10;columna++)
  296.         {
  297.             if(fila==0)  // Poner columnas (A,B,C...) en la fila 0. Un espacio en blanco en las demas filas.
  298.             {
  299.                 if(columna!=0)
  300.                 {
  301.                     tabla[fila][columna] = 64+columna;
  302.                 }
  303.             }
  304.             else
  305.             {
  306.                 tabla[fila][columna] = BLANCO;
  307.             }
  308.         }
  309.  
  310.         if (fila!=0)
  311.           {
  312.             tabla[fila][0]= 48+fila; // Poner las columnas (1,2,3...)
  313.           }
  314.     }
  315.  
  316. }
  317.  
  318. void definir_tabla2()  // Crea el tablero (9+1 x 9+1) con espacios en BLANCO (32) // TAMBIEN sirve para limpiar el tablero
  319. {
  320.     int fila;
  321.     int columna;
  322.  
  323.     for (fila=0;fila<10;fila++)
  324.     {
  325.         for (columna=0;columna<10;columna++)
  326.         {
  327.             if(fila==0)  // Poner columnas (A,B,C...) en la fila 0. Un espacio en blanco en las demas filas.
  328.             {
  329.                 if(columna!=0)
  330.                 {
  331.                     tabla2[fila][columna] = 64+columna;
  332.                 }
  333.             }
  334.             else
  335.             {
  336.                 tabla2[fila][columna] = BLANCO;
  337.             }
  338.         }
  339.  
  340.         if (fila!=0)
  341.           {
  342.             tabla2[fila][0]= 48+fila; // Poner las columnas (1,2,3...)
  343.           }
  344.     }
  345.  
  346. }
  347.  
  348. void imprimir()  // Imprime en la pantalla el tablero2.
  349. {
  350.     int fila,columna;
  351.     printf("\n");
  352.  
  353.     for (fila=0;fila<10;fila++)
  354.     {
  355.         for (columna=0;columna<10;columna++)
  356.         {
  357.             printf("%c |",tabla2[fila][columna]);
  358.         }
  359.         printf("\n");
  360.     }
  361. }
  362.  
  363. void imprimir1()  // Imprime en la pantalla el tablero2.
  364. {
  365.     int fila,columna;
  366.     printf("\n");
  367.  
  368.     for (fila=0;fila<10;fila++)
  369.     {
  370.         for (columna=0;columna<10;columna++)
  371.         {
  372.             printf("%c |",tabla[fila][columna]);
  373.         }
  374.         printf("\n");
  375.     }
  376. }
  377.  
  378. void insertar_minas()  // Pone 9 minas aleatoriamente.
  379. {
  380.  
  381.     int x, y, minas;
  382.     char col[8];
  383.     char fil[8];
  384.  
  385.     do
  386.     {
  387.         for(x=1;x<=9;x++)
  388.         {
  389.             for(y=1;y<=9;y++)
  390.             {
  391.                 tabla[x][y]= BLANCO;
  392.             }
  393.         }
  394.  
  395.         minas=0;
  396.  
  397.         for(x=0;x<9;x++)
  398.         {
  399.             col[x] = rand () % (9-1+1) + 1;
  400.             fil[x] = rand () % (9-1+1) + 1;
  401.         }
  402.  
  403.         for(x=0;x<9;x++)
  404.         {
  405.             tabla[col[x]][fil[x]] = MINA; // #DEFINE MINA 1
  406.         }
  407.  
  408.         for(x=1;x<=9;x++)
  409.         {
  410.             for(y=1;y<=9;y++)
  411.             {
  412.                 if (tabla[x][y]== MINA)
  413.                 {
  414.                     minas++;
  415.                 }
  416.             }
  417.         }
  418.     } while (minas<9);
  419.  
  420. }
  421.  
  422. void interfaz()
  423. {
  424.     switch(idioma)
  425.                 {
  426.                     case 'e':
  427.                     printf("\n MINESKEEPER\n\nMark every mines to win.\nTo do it, type the line and the column: '*A1', for example.\n");
  428.                     break;
  429.  
  430.                     case 's':
  431.                     printf("\n BUSCAMINAS\n\nMarca todas las minas para ganar.\nPara hacerlo, teclea la fila y la columna: '*A1', por ejemplo.\n");
  432.                     break;
  433.  
  434.                     case 'v':
  435.                     printf("\n BUSCAMINES\n\nMarque totes les mines per a guanyar.\nPer fer-ho, tecleja la fila i la columna; 'A1', per exemple.\n");
  436.                     break;
  437.                 }
  438.  
  439.             imprimir();
  440. }
  441.  
  442. void filascolumnas(char buffer_[])
  443. {
  444.     asterisco=0; // Simplemente es para cambiar la posicion de 0 a 1, si se comprueba un asterisco.
  445.     if(buffer_[0]=='*')
  446.     {
  447.         if(buffer_[1]=='*')
  448.         {
  449.             system("cls");
  450.             switch(idioma)
  451.                 {
  452.                     case 'e':
  453.                     printf("\n\nThanks for playing. See you! \n");
  454.                     break;
  455.  
  456.                     case 's':
  457.                     printf("\n\nGracias por jugar. %cHasta la vista! \n",EXCLAMACION);
  458.                     break;
  459.  
  460.                     case 'v':
  461.                     printf("\n\nGr%ccies per jugar. Fins la pr%cxima!\n",ACCENT_A,ACCENT_O_OBERT);
  462.                     break;
  463.                 }
  464.             getch();
  465.             exit(0);
  466.         }
  467.         asterisco=1;
  468.     }
  469.  
  470.     switch(buffer_[asterisco])
  471.     {
  472.         case 'A': columna=1;
  473.             break;
  474.         case 'a': columna=1;
  475.             break;
  476.         case 'B': columna=2;
  477.             break;
  478.         case 'b': columna=2;
  479.             break;
  480.         case 'C': columna=3;
  481.             break;
  482.         case 'c': columna=3;
  483.             break;
  484.         case 'D': columna=4;
  485.             break;
  486.         case 'd': columna=4;
  487.             break;
  488.         case 'E': columna=5;
  489.             break;
  490.         case 'e': columna=5;
  491.             break;
  492.         case 'F': columna=6;
  493.             break;
  494.         case 'f': columna=6;
  495.             break;
  496.         case 'G': columna=7;
  497.             break;
  498.         case 'g': columna=7;
  499.             break;
  500.         case 'H': columna=8;
  501.             break;
  502.         case 'h': columna=8;
  503.             break;
  504.         case 'I': columna=9;
  505.             break;
  506.         case 'i': columna=9;
  507.             break;
  508.         default:
  509.             columna=-1;
  510.     }
  511.  
  512.     if(fila>'9' && fila<'1')
  513.     {
  514.         fila=-1;
  515.     }
  516.     else{fila=buffer_[asterisco+1]-48;} // escaneo-49+1 (Porque lo escanea como letra) '1'=49}
  517. }
  518.  
  519. int comprobar(int f, int c) // Tanto f como c son modificadores de fila y columna
  520. {
  521.     int contador=0;
  522.  
  523.     if(asterisco==1)
  524.     {
  525.         posicionbanderas[banderas][0] = fila;
  526.         posicionbanderas[banderas][1] = columna;
  527.         banderas++;
  528.         return (BANDERA-48);
  529.     }
  530.  
  531.     if (tabla[fila+f][columna+c]==MINA)
  532.     {
  533.         return(EXPLOSION-48);
  534.     }
  535.     else
  536.     {
  537.         if (fila+f!=1)
  538.         {
  539.             if (tabla[fila+f-1][columna+c] == MINA) {contador++;}
  540.             if (tabla[fila+f-1][columna+c+1] == MINA) {contador++;}
  541.         }
  542.         if (columna+c!=1)
  543.         {
  544.             if (tabla[fila+f+1][columna+c-1] == MINA) {contador++;}
  545.             if (tabla[fila+f][columna+c-1] == MINA) {contador++;}
  546.             if (fila+f!=1)
  547.             {  if (tabla[fila+f-1][columna+c-1] == MINA) {contador++;}  }
  548.         }
  549.         if (tabla[fila+f][columna+c+1] == MINA) {contador++;}
  550.         if (tabla[fila+f+1][columna+c+1] == MINA) {contador++;}
  551.         if (tabla[fila+f+1][columna+c] == MINA) {contador++;}
  552.         return(contador);
  553.     }
  554. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement