Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <ctype.h>
- #define SPALTEN 26
- #define ZEILEN 26
- #define GROSS_A 65
- void feldAnzeigen(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten);
- void feldAnzeigenEnde(int feld[], size_t zeilen, size_t spalten);
- void feldFuellen(int feld[], size_t zeilen, size_t spalten, int bomben);
- void feldBerechnen(int feld[], size_t zeilen, size_t spalten);
- void eingabefeld(int *xkord, int *ykord, size_t zeilen, size_t spalten);
- int pruefBombe(int feld[], size_t xkord, size_t ykord, size_t spalten);
- void feldAufdecken(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten, size_t ykord, size_t xkord);
- void feldAufdeckenNullen(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten, size_t xkord, size_t ykord);
- void feldUeberpruefen(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten);
- int pruefGewinn(int feld[], size_t zeilen, size_t spalten, int bomben);
- int nochEinmal(void);
- int main() {
- do{
- char eingabe[300], dummy1, dummy2;
- int ok, zeilen = 25, spalten = 25, bomben = 1;
- printf("\nWillkommen beim Domi - Minesweeper!\n"
- "Wieviele Spalten soll das Feld beinhalten? (max: %d)\n", SPALTEN);
- do {
- printf("--->");
- fgets(eingabe, 300, stdin);
- ok = sscanf(eingabe, "%d%c%c", &spalten, &dummy1, &dummy2);
- ok != 2 ? printf("Falsche Eingabe!\n") : ok;
- spalten > SPALTEN ? printf("Spaltenanzahl zu hoch!\n"): ok;
- spalten <= 1 ? printf("Spaltenanzahl zu gering!\n"): ok;
- }while(ok != 2 || spalten > SPALTEN || spalten <= 1);
- printf("Wieviele Zeilen soll das Feld beinhalten ? (max: %d)\n", ZEILEN);
- do {
- printf("--->");
- fgets(eingabe, 300, stdin);
- ok = sscanf(eingabe, "%d%c%c", &zeilen, &dummy1, &dummy2);
- ok != 2 ? printf("Falsche Eingabe!\n") : ok;
- zeilen > ZEILEN ? printf("Zeilenanzahl zu hoch!\n"): ok;
- zeilen <= 1 ? printf("Zeilenanzahl zu gering!\n"): ok;
- }while(ok != 2 || zeilen > ZEILEN || zeilen <= 1);
- printf("Wieviele Bomben soll das Feld beinhalten? (max: %d)\n", zeilen*spalten - 1);
- do {
- printf("--->");
- fgets(eingabe, 300, stdin);
- ok = sscanf(eingabe, "%d%c%c", &bomben, &dummy1, &dummy2);
- ok != 2 ? printf("Falsche Eingabe!\n") : ok;
- bomben > zeilen*spalten - 1 ? printf("Bombenanzahl zu hoch!\n") : ok;
- bomben < 1 ? printf("Bombenanzahl zu gering!\n") : ok;
- } while (bomben > zeilen*spalten - 1 || bomben < 1 || ok != 2);
- int *bombenfeld, i, j;
- bombenfeld = malloc(sizeof(int) * zeilen * spalten);
- for (j = 0; j < zeilen; j++) {
- for ( i = 0; i < spalten; i++){
- bombenfeld[j * spalten + i] = 0;
- }
- }
- feldFuellen(bombenfeld, zeilen, spalten, bomben);
- feldBerechnen(bombenfeld, zeilen, spalten);
- int *feldaufgedeckt;
- feldaufgedeckt = malloc(sizeof(int) * spalten * zeilen);
- for (j = 0; j < zeilen; j++) {
- for (i = 0; i < spalten; i++) {
- feldaufgedeckt[j * spalten + i] = 0;
- }
- }
- int xkord, ykord;
- do {
- feldAnzeigen(bombenfeld, feldaufgedeckt, zeilen, spalten);
- eingabefeld(&xkord, &ykord, zeilen, spalten);
- if(pruefBombe(bombenfeld, xkord, ykord, spalten)){
- break;
- }
- feldAufdecken(bombenfeld, feldaufgedeckt, zeilen, spalten, ykord, xkord);
- if(pruefGewinn(feldaufgedeckt, zeilen, spalten, bomben)){
- break;
- }
- } while (1);
- if(pruefGewinn(feldaufgedeckt, zeilen, spalten, bomben)){
- printf("\nGratuliere du hast Minesweeper durchgespielt :D\n");
- }
- else {
- printf("\nBOOM!\n");
- }
- feldAnzeigenEnde(bombenfeld, zeilen, spalten);
- putchar('\n');
- free(bombenfeld);
- free(feldaufgedeckt);
- }while (nochEinmal());
- return 0;
- }
- void feldAnzeigenEnde(int feld[], size_t zeilen, size_t spalten){
- unsigned int i, j;
- printf("\n ");
- for (i = 0; i < spalten; i++) {
- printf(" %c", GROSS_A + i);
- }
- putchar('\n');
- for (i = 0; i < spalten + spalten + 4; i++) {
- putchar('*');
- }
- putchar('\n');
- for (j = 0; j < zeilen; j++) {
- printf("%2d ", j + 1);
- putchar('|');
- for (i = 0; i < spalten; i++) {
- if(feld[j * spalten + i] == -1){
- printf("X|");
- }
- else if(feld[j * spalten + i] == 0){
- printf(" |");
- }
- else{
- printf("%d|", feld[j * spalten + i]);
- }
- }
- putchar('\n');
- }
- for (i = 0; i < spalten + spalten + 4; i++) {
- putchar('*');
- }
- }
- void feldFuellen(int feld[], size_t zeilen, size_t spalten, int bomben){
- srand(time(NULL));
- int i, bombenzeile, bombenspalte;
- for (i = 0; i < bomben;) {
- bombenzeile = rand() % zeilen;
- bombenspalte = rand() % spalten;
- if(feld[bombenzeile * spalten + bombenspalte] == -1){
- continue;
- }
- else if(feld[bombenzeile * spalten + bombenspalte] != -1){
- feld[bombenzeile * spalten + bombenspalte] = -1;
- i++;
- }
- }
- }
- void feldBerechnen(int feld[], size_t zeilen, size_t spalten){
- int i, j, anzahl = 0;
- for (j = 0;(unsigned) j < zeilen; j++) {
- for (i = 0;(unsigned) i < spalten; i++) {
- if(feld[j * spalten + i] == -1){
- continue;
- }
- if(i - 1 >= 0 && j - 1 >= 0){
- if(feld[j * spalten + i - 1 - spalten] == -1){
- anzahl++;
- }
- }
- if(j - 1 >= 0){
- if(feld[j * spalten + i - spalten] == -1){
- anzahl++;
- }
- }
- if(j - 1 >= 0 && (unsigned) i + 1 < spalten){
- if(feld[j * spalten + i + 1 - spalten] == -1){
- anzahl++;
- }
- }
- if(i - 1 >= 0){
- if(feld[j * spalten + i - 1] == -1){
- anzahl++;
- }
- }
- if((unsigned)i + 1 < spalten){
- if(feld[j * spalten + i + 1] == -1){
- anzahl++;
- }
- }
- if((unsigned)j + 1 < zeilen && i - 1 >= 0){
- if(feld[j * spalten + i - 1 + spalten] == -1){
- anzahl++;
- }
- }
- if((unsigned)j + 1 < zeilen){
- if(feld[j * spalten + i + spalten] == -1){
- anzahl++;
- }
- }
- if((unsigned)j + 1 < zeilen && (unsigned)i + 1 < spalten){
- if(feld[j * spalten + i + 1 + spalten] == -1){
- anzahl++;
- }
- }
- feld[j * spalten + i] = anzahl;
- anzahl = 0;
- }
- }
- }
- void eingabefeld(int *xkord, int *ykord, size_t zeilen, size_t spalten){
- printf("\n\nGeben Sie das gewuenschte Feld ein (zB. A5)\n");
- int ok;
- char eingabe[300], dummy1, dummy2, kordx;
- spalten = spalten + GROSS_A;
- do {
- printf("--->");
- fgets(eingabe, 300, stdin);
- ok = sscanf(eingabe, "%c%d%c%c", &kordx, ykord, &dummy1, &dummy2);
- kordx = toupper(kordx);
- if(ok != 3){
- printf("Falsche Eingabe!\n");
- }
- else {
- !isupper(kordx) ? printf("Kein Spaltenbuchstabe angegeben!\n") : ok;
- (unsigned)kordx >= spalten ? printf("Zu grosse Spalte angegeben!\n") : ok;
- (unsigned)*ykord > zeilen ? printf("Zu grosse Zeile angegeben!\n") : ok;
- }
- } while (ok != 3 || !isupper(kordx) || (unsigned)kordx >= spalten || (unsigned)*ykord > zeilen);
- *xkord = kordx - GROSS_A;
- (*ykord)--;
- }
- int pruefBombe(int feld[], size_t xkord, size_t ykord, size_t spalten){
- if(feld[ykord * spalten + xkord] == -1){
- return 1;
- }
- return 0;
- }
- void feldAnzeigen(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten){
- unsigned int i, j;
- printf("\n ");
- for (i = 0; i < spalten; i++) {
- printf(" %c", GROSS_A + i);
- }
- putchar('\n');
- for (i = 0; i < spalten + spalten + 4; i++) {
- putchar('*');
- }
- putchar('\n');
- for (j = 0; j < zeilen; j++) {
- printf("%2d ", j + 1);
- putchar('|');
- for (i = 0; i < spalten; i++) {
- if(feldwerte[j * spalten + i] == 1){
- printf("%d|", feldberechnet[j * spalten + i]);
- }
- else{
- printf(" |");
- }
- }
- putchar('\n');
- }
- for (i = 0; i < spalten + spalten + 4; i++) {
- putchar('*');
- }
- }
- void feldAufdecken(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten, size_t ykord, size_t xkord){
- if(feldberechnet[ykord * spalten + xkord] == 0){
- feldwerte[ykord * spalten + xkord] = 1;
- feldAufdeckenNullen(feldberechnet, feldwerte, zeilen, spalten, xkord, ykord);
- feldUeberpruefen(feldberechnet, feldwerte, zeilen, spalten);
- }else {
- feldwerte[ykord * spalten + xkord] = 1;
- }
- }
- void feldAufdeckenNullen(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten, size_t xkord, size_t ykord){
- int i = xkord, j = ykord;
- if(i - 1 >= 0 && j - 1 >= 0){
- if(feldberechnet[j * spalten + i - 1 - spalten] != 0){
- feldwerte[j * spalten + i - 1 - spalten] = 1;
- }
- }
- if(j - 1 >= 0){
- feldwerte[j * spalten + i - spalten] = 1;
- }
- if(j - 1 >= 0 && (unsigned)i + 1 < spalten){
- if(feldberechnet[j * spalten + i + 1 - spalten] != 0){
- feldwerte[j * spalten + i + 1 - spalten] = 1;
- }
- }
- if(i - 1 >= 0){
- feldwerte[j * spalten + i - 1] = 1;
- }
- if((unsigned)i + 1 < spalten){
- feldwerte[j * spalten + i + 1] = 1;
- }
- if((unsigned)j + 1 < zeilen && i - 1 >= 0){
- if(feldberechnet[j * spalten + i - 1 + spalten] != 0){
- feldwerte[j * spalten + i - 1 + spalten] = 1;
- }
- }
- if((unsigned)j + 1 < zeilen){
- feldwerte[j * spalten + i + spalten] = 1;
- }
- if((unsigned)j + 1 < zeilen && (unsigned)i + 1 < spalten){
- if(feldberechnet[j * spalten + i + 1 + spalten] != 0){
- feldwerte[j * spalten + i + 1 + spalten] = 1;
- }
- }
- }
- void feldUeberpruefen(int feldberechnet[], int feldwerte[], size_t zeilen, size_t spalten){
- int test = 0, i, j, anzahl;
- for (j = 0;(unsigned) j < zeilen; j++) {
- for (i = 0;(unsigned) i < spalten; i++) {
- if(feldwerte[j * spalten + i] == 1 && feldberechnet[j * spalten + i] == 0){
- test++;
- feldAufdeckenNullen(feldberechnet, feldwerte, zeilen, spalten, i, j);
- }
- }
- }
- do {
- anzahl = 0;
- for (j = 0;(unsigned) j < zeilen; j++) {
- for (i = 0;(unsigned) i < spalten; i++) {
- if(feldwerte[j * spalten + i] == 1 && feldberechnet[j * spalten + i] == 0){
- anzahl++;
- feldAufdeckenNullen(feldberechnet, feldwerte, zeilen, spalten, i, j);
- }
- }
- }
- if(anzahl == test){
- break;
- }
- else {
- test = anzahl;
- }
- } while (1);
- }
- int pruefGewinn(int feld[], size_t zeilen, size_t spalten, int bomben){
- size_t i, j, anzahl = 0;
- for (j = 0; j < zeilen; j++) {
- for (i = 0; i < spalten; i++) {
- if(feld[j * spalten + i] == 0){
- anzahl++;
- }
- }
- }
- if(anzahl == (unsigned)bomben){
- return 1;
- }
- return 0;
- }
- int nochEinmal(void){
- char eingabe[300], befehl, dummy1, dummy2;
- int ok;
- printf("\nWollen sie nocheinmal spielen? (j/n)");
- do {
- printf("\n--->");
- fgets(eingabe, 300, stdin);
- ok = sscanf(eingabe, "%c%c%c", &befehl, &dummy1, &dummy2);
- } while (ok != 2 || dummy1 != '\n' || !(befehl == 'j' || befehl == 'n'));
- return befehl == 'j' ? 1 : 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement