Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <math.h>
- /* Constantes y variables */
- #define BLANCO 32
- #define MINA 1
- #define ACCENT_A 133
- #define ACCENT_O_OBERT 149
- #define ACCENT_O_TANCAT 162
- #define ACCENT_U_TANCAT 163
- #define INTERROGANTE 168
- #define EXCLAMACION 173
- #define EXPLOSION 'x'
- #define BANDERA 190
- char tabla[17][17];
- char tabla2[17][17];
- char idioma;
- int fila; // Para la funcion comprobar
- int columna; // Para la funcion comprobar
- int asterisco; // asterisco=1 para la bandera
- int banderas; // Para contabilizr el numero de banderas puestas.
- char posicionbanderas[8][2];
- /* Declaración de funciones */
- void elegiridioma();
- void inicio();
- void menu();
- void definir_tabla(); // Crea el tablero (9+1 x 9+1) con espacios en BLANCO (32) // TAMBIEN sirve para limpiar el tablero
- void imprimir(); // Imprime en la pantalla el tablero2.
- void insertar_minas(); // Pone 9 minas aleatoriamente.
- void interfaz(); // "Menú" + imprimir()
- void filascolumnas(); // Convierte lo escaneado (A3) en columna=1 fila=3
- int comprobar(int f, int c);
- main ()
- {
- int x, banderascorrectas; // Para funciones FOR
- srand (getpid());
- char buffer[5];
- elegiridioma();
- inicio();
- /** 1- BUSCAMINAS **/
- do
- {
- menu();
- banderas=0;
- definir_tabla();
- definir_tabla2();
- insertar_minas();
- /** 1.1-- MARCAR CASILLA **/
- do
- {
- system("cls");
- fflush(stdin);
- interfaz();
- switch(idioma)
- {
- case 'e':
- printf("\n\nType: ");
- break;
- case 's':
- printf("\n\nTeclea: ");
- break;
- case 'v':
- printf("\n\nTecleja: ");
- break;
- }
- scanf("%s",&buffer);
- filascolumnas(buffer);
- if (columna==-1 || fila==-1) {continue;}
- tabla2[fila][columna]= 0;
- tabla2[fila][columna]= comprobar(0,0)+48; //devuelve el numero de minas que rodean a la casilla
- /* ¿PIERDES? */
- if(tabla2[fila][columna]==EXPLOSION)
- {
- system("cls");
- interfaz();
- break;
- }
- /* ¿GANAS? */
- if (banderas==9)
- {
- banderascorrectas=0;
- for(x=0;x<9;x++)
- {
- if (tabla[posicionbanderas[x][0]][posicionbanderas[x][1]] == MINA)
- { banderascorrectas++; }
- }
- if (banderascorrectas==9)
- {
- do
- {
- system("cls");
- interfaz();
- switch(idioma)
- {
- case 'e':
- printf("\n\nYou win! Do you wanna play again? (s/n) ");
- break;
- case 's':
- printf("\n\n%cENHORABUENA, has ganado! %cQuieres jugar otra vez? (s/n)",EXCLAMACION,INTERROGANTE);
- break;
- case 'v':
- printf("\n\nENHORABONA, has guanyat! Vols jugar altra vegada? (s/n)");
- break;
- }
- fflush(stdin);
- scanf("%s",&buffer);
- system("cls");
- } while (buffer[0]!='s' && buffer[0]!='n' && (buffer[0]!='*' && buffer[0]!='*'));
- break;
- }
- }
- /* EXPANDIR SI 0 */
- if(tabla2[fila][columna]=='0')
- {
- if (fila!=2)
- {
- tabla2[fila-1][columna] = comprobar(-1,0) + 48;
- tabla2[fila-1][columna+1] = comprobar(-1,+1) + 48;
- }
- if (columna!=2)
- {
- tabla2[fila+1][columna-1] = comprobar(+1,-1) + 48;
- tabla2[fila][columna-1] = comprobar(0,-1) + 48;
- if (fila!=0)
- { tabla2[fila-1][columna-1] = comprobar(-1,-1) + 48; }
- }
- tabla2[fila][columna+1] = comprobar(0,+1) + 48;
- tabla2[fila+1][columna+1] = comprobar(+1,+1) + 48;
- tabla2[fila+1][columna] = comprobar(+1,0) + 48;
- }
- /* FIN EXPANDIR */
- /* Arreglo de titulos (A,B,C...) y (1,2,3...) */
- for (fila=0;fila<10;fila++)
- {
- for (columna=0;columna<10;columna++)
- {
- if(fila==0) // Poner columnas (A,B,C...) en la fila 0. Un espacio en blanco en las demas filas.
- {
- if(columna!=0)
- {
- tabla2[fila][columna] = 64+columna;
- }
- }
- }
- if (fila!=0)
- {
- tabla2[fila][0]= 48+fila; // Poner las columnas (1,2,3...)
- }
- }
- tabla2[0][0]=BLANCO;
- /* FIN Arreglo de titulos (A,B,C...) y (1,2,3...) */
- system("cls");
- interfaz();
- } while ( tabla2[fila][columna]!= EXPLOSION);
- /** FIN MARCAR CASILLA --1.1 **/
- if(banderascorrectas!=9)
- {
- do
- {
- switch(idioma)
- {
- case 'e':
- printf("\n\nYou have lost! Do you wanna play again? (s/n) ");
- break;
- case 's':
- printf("\n\n%cHas perdido! %cQuieres intentarlo de nuevo? (s/n)",EXCLAMACION,INTERROGANTE);
- break;
- case 'v':
- printf("\n\nHas perdut! Vols jugar altra vegada? (s/n)");
- break;
- }
- scanf("%s",&buffer);
- system("cls");
- } while (buffer[0]!='s' && buffer[0]!='n' && (buffer[0]!='*' && buffer[0]!='*'));
- }
- } while(buffer[1]!= '*' && buffer[0]!='n');
- /** FIN BUSCAMINAS -1. **/
- return(0);
- }
- void elegiridioma()
- {
- do
- {
- system("cls");
- 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);
- scanf("%c",&idioma);
- fflush(stdin);
- } while (idioma!='e'&&idioma!='s'&&idioma!='v');
- system("cls");
- }
- void inicio()
- {
- char inicio;
- do
- {
- switch(idioma)
- {
- case 'e':
- printf("\n MINESKEEPER\n\n Type 'c' to continue, 'a' for help, and 's' to finish the game.\n");
- break;
- case 's':
- printf("\n BUSCAMINAS\n\n Pulsa 'c' para continuar, 'a' para ayuda, y 's' para salir.\n");
- break;
- case 'v':
- printf("\n BUSCAMINES\n\n Prem 'c' per a continuar, 'a' per l'ajuda, i 's' per a eixir.\n");
- break;
- }
- scanf("%c",&inicio);
- if (inicio=='a')
- {
- system("cls");
- switch(idioma)
- {
- case 'e':
- 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.");
- break;
- case 's':
- 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);
- break;
- case 'v':
- 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);
- break;
- }
- getch();
- }
- if(inicio=='s')
- {
- exit(0);
- }
- fflush(stdin);
- system("cls");
- } while (inicio!='c');
- }
- void menu()
- {
- system("cls");
- switch(idioma)
- {
- case 'e':
- 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");
- break;
- case 's':
- 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");
- break;
- case 'v':
- 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");
- break;
- }
- getch();
- }
- void definir_tabla() // Crea el tablero (9+1 x 9+1) con espacios en BLANCO (32) // TAMBIEN sirve para limpiar el tablero
- {
- int fila;
- int columna;
- for (fila=0;fila<10;fila++)
- {
- for (columna=0;columna<10;columna++)
- {
- if(fila==0) // Poner columnas (A,B,C...) en la fila 0. Un espacio en blanco en las demas filas.
- {
- if(columna!=0)
- {
- tabla[fila][columna] = 64+columna;
- }
- }
- else
- {
- tabla[fila][columna] = BLANCO;
- }
- }
- if (fila!=0)
- {
- tabla[fila][0]= 48+fila; // Poner las columnas (1,2,3...)
- }
- }
- }
- void definir_tabla2() // Crea el tablero (9+1 x 9+1) con espacios en BLANCO (32) // TAMBIEN sirve para limpiar el tablero
- {
- int fila;
- int columna;
- for (fila=0;fila<10;fila++)
- {
- for (columna=0;columna<10;columna++)
- {
- if(fila==0) // Poner columnas (A,B,C...) en la fila 0. Un espacio en blanco en las demas filas.
- {
- if(columna!=0)
- {
- tabla2[fila][columna] = 64+columna;
- }
- }
- else
- {
- tabla2[fila][columna] = BLANCO;
- }
- }
- if (fila!=0)
- {
- tabla2[fila][0]= 48+fila; // Poner las columnas (1,2,3...)
- }
- }
- }
- void imprimir() // Imprime en la pantalla el tablero2.
- {
- int fila,columna;
- printf("\n");
- for (fila=0;fila<10;fila++)
- {
- for (columna=0;columna<10;columna++)
- {
- printf("%c |",tabla2[fila][columna]);
- }
- printf("\n");
- }
- }
- void imprimir1() // Imprime en la pantalla el tablero2.
- {
- int fila,columna;
- printf("\n");
- for (fila=0;fila<10;fila++)
- {
- for (columna=0;columna<10;columna++)
- {
- printf("%c |",tabla[fila][columna]);
- }
- printf("\n");
- }
- }
- void insertar_minas() // Pone 9 minas aleatoriamente.
- {
- int x, y, minas;
- char col[8];
- char fil[8];
- do
- {
- for(x=1;x<=9;x++)
- {
- for(y=1;y<=9;y++)
- {
- tabla[x][y]= BLANCO;
- }
- }
- minas=0;
- for(x=0;x<9;x++)
- {
- col[x] = rand () % (9-1+1) + 1;
- fil[x] = rand () % (9-1+1) + 1;
- }
- for(x=0;x<9;x++)
- {
- tabla[col[x]][fil[x]] = MINA; // #DEFINE MINA 1
- }
- for(x=1;x<=9;x++)
- {
- for(y=1;y<=9;y++)
- {
- if (tabla[x][y]== MINA)
- {
- minas++;
- }
- }
- }
- } while (minas<9);
- }
- void interfaz()
- {
- switch(idioma)
- {
- case 'e':
- printf("\n MINESKEEPER\n\nMark every mines to win.\nTo do it, type the line and the column: '*A1', for example.\n");
- break;
- case 's':
- printf("\n BUSCAMINAS\n\nMarca todas las minas para ganar.\nPara hacerlo, teclea la fila y la columna: '*A1', por ejemplo.\n");
- break;
- case 'v':
- printf("\n BUSCAMINES\n\nMarque totes les mines per a guanyar.\nPer fer-ho, tecleja la fila i la columna; 'A1', per exemple.\n");
- break;
- }
- imprimir();
- }
- void filascolumnas(char buffer_[])
- {
- asterisco=0; // Simplemente es para cambiar la posicion de 0 a 1, si se comprueba un asterisco.
- if(buffer_[0]=='*')
- {
- if(buffer_[1]=='*')
- {
- system("cls");
- switch(idioma)
- {
- case 'e':
- printf("\n\nThanks for playing. See you! \n");
- break;
- case 's':
- printf("\n\nGracias por jugar. %cHasta la vista! \n",EXCLAMACION);
- break;
- case 'v':
- printf("\n\nGr%ccies per jugar. Fins la pr%cxima!\n",ACCENT_A,ACCENT_O_OBERT);
- break;
- }
- getch();
- exit(0);
- }
- asterisco=1;
- }
- switch(buffer_[asterisco])
- {
- case 'A': columna=1;
- break;
- case 'a': columna=1;
- break;
- case 'B': columna=2;
- break;
- case 'b': columna=2;
- break;
- case 'C': columna=3;
- break;
- case 'c': columna=3;
- break;
- case 'D': columna=4;
- break;
- case 'd': columna=4;
- break;
- case 'E': columna=5;
- break;
- case 'e': columna=5;
- break;
- case 'F': columna=6;
- break;
- case 'f': columna=6;
- break;
- case 'G': columna=7;
- break;
- case 'g': columna=7;
- break;
- case 'H': columna=8;
- break;
- case 'h': columna=8;
- break;
- case 'I': columna=9;
- break;
- case 'i': columna=9;
- break;
- default:
- columna=-1;
- }
- if(fila>'9' && fila<'1')
- {
- fila=-1;
- }
- else{fila=buffer_[asterisco+1]-48;} // escaneo-49+1 (Porque lo escanea como letra) '1'=49}
- }
- int comprobar(int f, int c) // Tanto f como c son modificadores de fila y columna
- {
- int contador=0;
- if(asterisco==1)
- {
- posicionbanderas[banderas][0] = fila;
- posicionbanderas[banderas][1] = columna;
- banderas++;
- return (BANDERA-48);
- }
- if (tabla[fila+f][columna+c]==MINA)
- {
- return(EXPLOSION-48);
- }
- else
- {
- if (fila+f!=1)
- {
- if (tabla[fila+f-1][columna+c] == MINA) {contador++;}
- if (tabla[fila+f-1][columna+c+1] == MINA) {contador++;}
- }
- if (columna+c!=1)
- {
- if (tabla[fila+f+1][columna+c-1] == MINA) {contador++;}
- if (tabla[fila+f][columna+c-1] == MINA) {contador++;}
- if (fila+f!=1)
- { if (tabla[fila+f-1][columna+c-1] == MINA) {contador++;} }
- }
- if (tabla[fila+f][columna+c+1] == MINA) {contador++;}
- if (tabla[fila+f+1][columna+c+1] == MINA) {contador++;}
- if (tabla[fila+f+1][columna+c] == MINA) {contador++;}
- return(contador);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement