1 | /*
|
2 | ============================================================================
|
3 | Name : Pool3_Minesweeper_V2.c
|
4 | ============================================================================
|
5 | */
|
6 |
|
7 | #include <stdio.h>
|
8 | #include <stdlib.h>
|
9 | #include <time.h>
|
10 |
|
11 | #define TRUE 1
|
12 | #define FALSE 0
|
13 |
|
14 | int **board;
|
15 | int n, m;
|
16 | FILE *datei;
|
17 |
|
18 |
|
19 | void build_board(char *argv[]);
|
20 | void build_mines(int anzahl);
|
21 | void write_board(char *argv[]);
|
22 | int check_mines(int x, int y);
|
23 | void refresh_board(char *argv[]);
|
24 |
|
25 | int main(int argc, char *argv[]) {
|
26 | if(argc == 4){// Kontrolle ob die richtige anzahl an werten übergeben wurde
|
27 | int groese = 0, min = 0, max = 0, anzahl = 0, i, j;
|
28 |
|
29 | n = atoi(argv[1]); //n aus Konsolenparameter auslesen
|
30 | m = atoi(argv[2]); //m aus Konsolenparameter auslesen
|
31 |
|
32 | /*n = 20;
|
33 | m = 20;*/
|
34 | if(10 <= n && n <= 26 && 10 <= m && m <= 26){ // Kontrolle ob n und m im richtigen bereich liegen
|
35 |
|
36 | groese = n * m; // größe des Feldes
|
37 |
|
38 | //Minimale und Maximale anzahl der bomben
|
39 | min = (groese * 10) / 100;
|
40 | max = (groese * 25) / 100;
|
41 |
|
42 | srand (time (NULL)); //zufallszahl beginnen
|
43 | anzahl = (rand () % ((max + 1) - min)) + min; // Zufällige anzahl der bomben bestimmen
|
44 |
|
45 | //Speicherzuweißung
|
46 | board = (int **)malloc(n * sizeof(int *));
|
47 | for(i = 0; i < n; i++){
|
48 | board[i] = (int *)malloc(m * sizeof(int));
|
49 | }
|
50 |
|
51 | //Board mit 0 füllen, 0 ist die anzeige falls noch nicht aufgedeckt
|
52 | for(i = 0; i < n; i++){
|
53 | for(j = 0; j < m; j++){
|
54 | board[j][i] = 0;
|
55 | }
|
56 | }
|
57 | build_board(argv);
|
58 | build_mines(anzahl);
|
59 |
|
60 | refresh_board(argv);
|
61 | write_board(argv);
|
62 | }
|
63 | else{ printf("Ihre Eingabe Daten sind falsch\n");}
|
64 |
|
65 | }
|
66 |
|
67 | else{printf("Ihre Eingabe Daten sind falsch\n");}
|
68 |
|
69 | return EXIT_SUCCESS;
|
70 | }
|
71 |
|
72 | void build_board(char *argv[]){
|
73 | int i, j;
|
74 | datei = fopen(argv[3], "w+");
|
75 | //datei = fopen("test", "w+");
|
76 | for(j = 0; j < m; j++){
|
77 | for(i = 0; i < n; i++){
|
78 | fputc(48, datei);
|
79 | fputc(32, datei);
|
80 | }
|
81 | fputc(10, datei);
|
82 | }
|
83 |
|
84 | fclose(datei);
|
85 | }
|
86 |
|
87 | void build_mines(int anzahl){
|
88 | int i = anzahl;
|
89 | srand (time (NULL));
|
90 | while(i > 0){
|
91 | board[rand() % n ][rand() % m ] = 9;
|
92 | i -=1;
|
93 | }
|
94 |
|
95 | }
|
96 |
|
97 | int check_mines(int x, int y){
|
98 | int zahl = 0, i, j;
|
99 |
|
100 | for(i = x - 1; i < 4; i++){
|
101 | for(j = y - 1; j < 4; j++){
|
102 | if(board[i][j] == 1) zahl++;
|
103 | }
|
104 | }
|
105 |
|
106 | return zahl;
|
107 | }
|
108 |
|
109 | void write_board(char *argv[]){
|
110 | int temp;
|
111 | datei = fopen(argv[3], "r");
|
112 |
|
113 | //Hier sollte der bisherige Ausgabe gelöscht werden um das Aktuelle Feld auszugeben
|
114 | //system("clear");
|
115 | printf("\033[2J\033[1;1H");
|
116 |
|
117 | while((temp = fgetc(datei))!=EOF) {
|
118 | printf("%c", temp);
|
119 | }
|
120 | fclose(datei);
|
121 |
|
122 | }
|
123 |
|
124 | void refresh_board(char *argv[]){
|
125 | int i, j;
|
126 | datei = fopen(argv[3], "r+");
|
127 | for(i = 0; i < n; i++){
|
128 | for(j = 0; j < m; j++){
|
129 | if(board[j][i] == 9){
|
130 | fputc(48, datei);
|
131 | fputc(32, datei);
|
132 | }
|
133 | else{
|
134 | fputc(board[j][i] + 48, datei);
|
135 | fputc(32, datei);
|
136 | }
|
137 | }
|
138 | fputc(10, datei);
|
139 | }
|
140 | fclose(datei);
|
141 | }
|
142 |
|
143 | int uncover(int x, int y){
|
144 | int mine = FALSE;
|
145 | if(board[x][y] == 9) mine = TRUE;
|
146 | else{
|
147 | board[x][y] = check_mines(x, y);
|
148 | }
|
149 |
|
150 | return mine;
|
151 | }
|