-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlib_a.h
368 lines (355 loc) · 15.2 KB
/
lib_a.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
const int DIM=16; //Dimensione del campo da gioco
const int NMINE=40; //Numero di mine
void benvenuto(){
//system("color 3");
cout<<" _ __ _____ "<<endl;
//Sleep(100);
cout<<"' ) ) _/_ / ' _/_ "<<endl;
//Sleep(100);
cout<<" /--'__ __. / __ ,-/-,o __ __ o / __"<<endl;
//Sleep(100);
cout<<"/ / (_(_/|_<__(_) (_/ <_(_)/ (_<_<__(_)"<<endl<<endl<<endl;
//Sleep(100);
cout<<"Inserisci l'opzione desiderata: "<<endl<<endl;
//Sleep(100);
cout<<"1- Regole"<<endl;
cout<<"2- Gioca"<<endl;
}
void regole(){
cout<<"Regole prato fiorito: \n"<<endl;
cout<<"Il campo e' composto da 256 posizioni. In modo randomico vengono posizionate 40 mine. \nAll'inzio del gioco, inserisci una posizione, tramite riga e colonna. Verrano indicate le distanze tra i vari punti scoperti delle bombe vicine. \nDopo aver selezionato la posizione, potrai scegliere se scoprire la casella o inserire una bandiera, in presenza di una bomba. \n\nLo scopo del gioco e' scoprire tutto il campo senza scoprire le mine."<<endl;
}
bool confronto(int v[], int pos){ //Funzione che verifica che il nuovo numero dell'array non sia gi� comparso
if(pos==0) return true; //Se la posizione vale 0 viene ritornato il valore true
else{ //Se no parte un ciclo for che va a confrontare tutti i precedenti numeri con l'ultimo
for(int i=pos-1; i>=0; i--){
if(v[i]==v[pos]) return false;
}
return true;
}
}
void riempimento(int campo[][DIM], int riga, int col){ //Funzione di assegnazione dei numeri alle caselle
if(riga==0){ //Caso in cui la casella sia nella prima riga
if(col==0){ //Caso dell'angolo in alto a sinistra
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga][col+1]!=9) campo[riga][col+1]++;
if(campo[riga+1][col+1]!=9) campo[riga+1][col+1]++;
if(campo[riga+1][col]!=9) campo[riga+1][col]++;
}
}
else if(col==DIM-1){ //Caso dell'angolo in alto a destra
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga+1][col]!=9) campo[riga+1][col]++;
if(campo[riga+1][col-1]!=9) campo[riga+1][col-1]++;
if(campo[riga][col-1]!=9) campo[riga][col-1]++;
}
}
else{
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga][col+1]!=9) campo[riga][col+1]++;
if(campo[riga+1][col+1]!=9) campo[riga+1][col+1]++;
if(campo[riga+1][col]!=9) campo[riga+1][col]++;
if(campo[riga+1][col-1]!=9) campo[riga+1][col-1]++;
if(campo[riga][col-1]!=9) campo[riga][col-1]++;
}
}
}
else if(riga==DIM-1){ //Caso in cui la riga sia l'ultima
if(col==0){ //Caso dell'angolo in basso a sinistra
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga-1][col]!=9) campo[riga-1][col]++;
if(campo[riga-1][col+1]!=9) campo[riga-1][col+1]++;
if(campo[riga][col+1]!=9) campo[riga][col+1]++;
}
}
else if(col==DIM-1){ //Caso dell'angolo in basso a destra
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga-1][col]!=9) campo[riga-1][col]++;
if(campo[riga][col-1]!=9) campo[riga][col-1]++;
if(campo[riga-1][col-1]!=9) campo[riga-1][col-1]++;
}
}
else{
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga-1][col]!=9) campo[riga-1][col]++;
if(campo[riga-1][col+1]!=9) campo[riga-1][col+1]++;
if(campo[riga][col+1]!=9) campo[riga][col+1]++;
if(campo[riga][col-1]!=9) campo[riga][col-1]++;
if(campo[riga-1][col-1]!=9) campo[riga-1][col-1]++;
}
}
}
else if(col==0){ //Caso in cui la colonna sia la prima
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga-1][col]!=9) campo[riga-1][col]++;
if(campo[riga-1][col+1]!=9) campo[riga-1][col+1]++;
if(campo[riga][col+1]!=9) campo[riga][col+1]++;
if(campo[riga+1][col+1]!=9) campo[riga+1][col+1]++;
if(campo[riga+1][col]!=9) campo[riga+1][col]++;
}
}
else if(col==DIM-1){ //Caso in cui la colonna sia l'ultima
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga-1][col]!=9) campo[riga-1][col]++;
if(campo[riga+1][col]!=9) campo[riga+1][col]++;
if(campo[riga+1][col-1]!=9) campo[riga+1][col-1]++;
if(campo[riga][col-1]!=9) campo[riga][col-1]++;
if(campo[riga-1][col-1]!=9) campo[riga-1][col-1]++;
}
}
else{ //Caso in cui la casella sia centrale
if(campo[riga][col]==9){ //Se su una casella c'� una mina(9) viene incrementato di 1 il valore di tutte le caselle adiacenti non mine
if(campo[riga-1][col]!=9) campo[riga-1][col]++;
if(campo[riga-1][col+1]!=9) campo[riga-1][col+1]++;
if(campo[riga][col+1]!=9) campo[riga][col+1]++;
if(campo[riga+1][col+1]!=9) campo[riga+1][col+1]++;
if(campo[riga+1][col]!=9) campo[riga+1][col]++;
if(campo[riga+1][col-1]!=9) campo[riga+1][col-1]++;
if(campo[riga][col-1]!=9) campo[riga][col-1]++;
if(campo[riga-1][col-1]!=9) campo[riga-1][col-1]++;
}
}
}
void inizCampo(int campo[][DIM], int casScoperte[][DIM]){ //Funzione che genera il campo iniziale
int mine[NMINE];
for(int i=0; i<DIM; i++){ //Inizializzazione di tutte le caselle al valore 0
for(int j=0; j<DIM; j++) campo[i][j]=0;
}
for(int i=0; i<NMINE; i++){ //Generazione delle posizioni delle mine
do{
mine[i]=rand()%(DIM*DIM);
}while(confronto(mine,i)==false || casScoperte[mine[i]/DIM][mine[i]%16]==3);
}
for(int i=0; i<NMINE; i++) campo[mine[i]/DIM][mine[i]%DIM]=9; //Assegnazione delle mine(9) nelle relative posizioni
for(int i=0; i<DIM; i++){ //Ciclo che ripete la funzione di riempimento su tutte le caselle
for(int j=0; j<DIM; j++) riempimento(campo,i,j);
}
for(int i=0; i<DIM; i++){ //Ciclo che inizializza tutte le caselle della matrice casScoperte a 0(casella coperta)
for(int j=0; j<DIM; j++) casScoperte[i][j]=0;
}
}
void stampaCampo(int campo[][DIM], int casScoperte[][DIM]){ //Funzione che stampa il campo
cout<<" ";
for(int i=1;i<=DIM;i++) cout<<setw(4)<<i;
cout<<endl;
for(int i=0; i<DIM; i++){ //Stampa del campo
cout<<setw(4)<<i+1;
for(int j=0; j<DIM; j++){
cout<<" | ";
if(casScoperte[i][j]==2) cout<<"F"; //Se lamatrice casScoperte nelle relative coordinate vale 2(bandiera) stampa la bandiera
else if(casScoperte[i][j] == 1 && campo[i][j] == 0) cout<<"X"; //se casScoperte è 1 (casella scoperta) e campo è 0 (nessuna bomba vicina) stampa X
else if((casScoperte[i][j]==1) && campo[i][j]!=0) cout<<campo[i][j]; //Altrimenti se vale 1(casella scoperta) e nella casella in campo non c'� 0
else if(casScoperte[i][j]==9) cout<<"B";
else cout<<" "; //Altrimenti stampa una casella vuota
}
cout<<" | "<<endl<<endl;
}
}
void scopri(int casScoperte[][DIM], int riga, int col){
if(riga==0){ //Caso in cui la casella sia nella prima riga
if(col==0){ //Caso dell'angolo in alto a sinistra
casScoperte[riga][col+1]=1;
casScoperte[riga+1][col+1]=1;
casScoperte[riga+1][col]=1;
}
else if(col==DIM-1){ //Caso dell'angolo in alto a destra
casScoperte[riga+1][col]=1;
casScoperte[riga+1][col-1]=1;
casScoperte[riga][col-1]=1;
}
else{
casScoperte[riga][col+1]=1;
casScoperte[riga+1][col+1]=1;
casScoperte[riga+1][col]=1;
casScoperte[riga+1][col-1]=1;
casScoperte[riga][col-1]=1;
}
}
else if(riga==DIM-1){ //Caso in cui la riga sia l'ultima
if(col==0){ //Caso dell'angolo in basso a sinistra
casScoperte[riga-1][col]=1;
casScoperte[riga-1][col+1]=1;
casScoperte[riga][col+1]=1;
}
else if(col==DIM-1){ //Caso dell'angolo in basso a destra
casScoperte[riga-1][col]=1;
casScoperte[riga][col-1]=1;
casScoperte[riga-1][col-1]=1;
}
else{
casScoperte[riga-1][col]=1;
casScoperte[riga-1][col+1]=1;
casScoperte[riga][col+1]=1;
casScoperte[riga][col-1]=1;
casScoperte[riga-1][col-1]=1;
}
}
else if(col==0){ //Caso in cui la colonna sia la prima
casScoperte[riga-1][col]=1;
casScoperte[riga-1][col+1]=1;
casScoperte[riga][col+1]=1;
casScoperte[riga+1][col+1]=1;
casScoperte[riga+1][col]=1;
}
else if(col==DIM-1){ //Caso in cui la colonna sia l'ultima
casScoperte[riga-1][col]=1;
casScoperte[riga+1][col]=1;
casScoperte[riga+1][col-1]=1;
casScoperte[riga][col-1]=1;
casScoperte[riga-1][col-1]=1;
}
else{ //Caso in cui la casella sia centrale
casScoperte[riga-1][col]=1;
casScoperte[riga-1][col+1]=1;
casScoperte[riga][col+1]=1;
casScoperte[riga+1][col+1]=1;
casScoperte[riga+1][col]=1;
casScoperte[riga+1][col-1]=1;
casScoperte[riga][col-1]=1;
casScoperte[riga-1][col-1]=1;
}
}
bool cond(int casScoperte[][DIM], int riga, int col){
if(casScoperte[riga][col]==1 || casScoperte[riga][col]==3){
if(riga==0){ //Caso in cui la casella sia nella prima riga
if(col==0){ //Caso dell'angolo in alto a sinistra
if(casScoperte[riga][col+1]!=1 && casScoperte[riga][col+1]!=3) return true;
if(casScoperte[riga+1][col+1]!=1 && casScoperte[riga+1][col+1]!=3) return true;
if(casScoperte[riga+1][col]!=1 && casScoperte[riga+1][col]!=3) return true;
}
else if(col==DIM-1){ //Caso dell'angolo in alto a destra
if(casScoperte[riga+1][col]!=1 && casScoperte[riga+1][col]!=3) return true;
if(casScoperte[riga+1][col-1]!=1 && casScoperte[riga+1][col-1]!=3) return true;
if(casScoperte[riga][col-1]!=1 && casScoperte[riga][col-1]!=3) return true;
}
else{
if(casScoperte[riga][col+1]!=1 && casScoperte[riga][col+1]!=3) return true;
if(casScoperte[riga+1][col+1]!=1 && casScoperte[riga+1][col+1]!=3) return true;
if(casScoperte[riga+1][col]!=1 && casScoperte[riga+1][col]!=3) return true;
if(casScoperte[riga+1][col-1]!=1 && casScoperte[riga+1][col-1]!=3) return true;
if(casScoperte[riga][col-1]!=1 && casScoperte[riga][col-1]!=3) return true;
}
}
else if(riga==DIM-1){ //Caso in cui la riga sia l'ultima
if(col==0){ //Caso dell'angolo in basso a sinistra
if(casScoperte[riga-1][col]!=1 && casScoperte[riga-1][col]!=3) return true;
if(casScoperte[riga-1][col+1]!=1 && casScoperte[riga-1][col+1]!=3) return true;
if(casScoperte[riga][col+1]!=1 && casScoperte[riga][col+1]!=3) return true;
}
else if(col==DIM-1){ //Caso dell'angolo in basso a destra
if(casScoperte[riga-1][col]!=1 && casScoperte[riga-1][col]!=3) return true;
if(casScoperte[riga][col-1]!=1 && casScoperte[riga][col-1]!=3) return true;
if(casScoperte[riga-1][col-1]!=1 && casScoperte[riga-1][col-1]!=3) return true;
}
else{
if(casScoperte[riga-1][col]!=1 && casScoperte[riga-1][col]!=3) return true;
if(casScoperte[riga-1][col+1]!=1 && casScoperte[riga-1][col+1]!=3) return true;
if(casScoperte[riga][col+1]!=1 && casScoperte[riga][col+1]!=3) return true;
if(casScoperte[riga][col-1]!=1 && casScoperte[riga][col-1]!=3) return true;
if(casScoperte[riga-1][col-1]!=1 && casScoperte[riga-1][col-1]!=3) return true;
}
}
else if(col==0){ //Caso in cui la colonna sia la prima
if(casScoperte[riga-1][col]!=1 && casScoperte[riga-1][col]!=3) return true;
if(casScoperte[riga-1][col+1]!=1 && casScoperte[riga-1][col+1]!=3) return true;
if(casScoperte[riga][col+1]!=1 && casScoperte[riga][col+1]!=3) return true;
if(casScoperte[riga+1][col+1]!=1 && casScoperte[riga+1][col+1]!=3) return true;
if(casScoperte[riga+1][col]!=1 && casScoperte[riga+1][col]!=3) return true;
}
else if(col==DIM-1){ //Caso in cui la colonna sia l'ultima
if(casScoperte[riga-1][col]!=1 && casScoperte[riga-1][col]!=3) return true;
if(casScoperte[riga+1][col]!=1 && casScoperte[riga+1][col]!=3) return true;
if(casScoperte[riga+1][col-1]!=1 && casScoperte[riga+1][col-1]!=3) return true;
if(casScoperte[riga][col-1]!=1 && casScoperte[riga][col-1]!=3) return true;
if(casScoperte[riga-1][col-1]!=1 && casScoperte[riga-1][col-1]!=3) return true;
}
else{ //Caso in cui la casella sia centrale
if(casScoperte[riga-1][col]!=1 && casScoperte[riga-1][col]!=3) return true;
if(casScoperte[riga-1][col+1]!=1 && casScoperte[riga-1][col+1]!=3) return true;
if(casScoperte[riga][col+1]!=1 && casScoperte[riga][col+1]!=3) return true;
if(casScoperte[riga+1][col+1]!=1 && casScoperte[riga+1][col+1]!=3) return true;
if(casScoperte[riga+1][col]!=1 && casScoperte[riga+1][col]!=3) return true;
if(casScoperte[riga+1][col-1]!=1 && casScoperte[riga+1][col-1]!=3) return true;
if(casScoperte[riga][col-1]!=1 && casScoperte[riga][col-1]!=3) return true;
if(casScoperte[riga-1][col-1]!=1 && casScoperte[riga-1][col-1]!=3) return true;
}
}
return false;
}
void selScopri(int campo[][DIM], int casScoperte[][DIM]){
for(int i=0; i<DIM; i++){
for(int j=0; j<DIM; j++){
if(campo[i][j]==0 && cond(casScoperte,i,j)==true){
scopri(casScoperte,i,j);
selScopri(campo,casScoperte);
}
}
}
}
void stampa(int matrice[][16]){ //funzione usata per debug
for(int i=0;i<16;i++){
for(int c=0;c<16;c++){
cout<<matrice[i][c]<<" ";
}
cout<<endl;
}
}
void iniziale(int &riga, int &colonna,int campo[][16],int casScoperte[][16]){ //definisce quadrato inziale
while(riga <0 || riga>16 || colonna<0 || colonna>16){
cout<<"Selezione non valida, inserisci riga: ";
cin>>riga;
cout<<"Inserisci colonna: ";
cin>>colonna;
}
riga--;
colonna--;
if(riga-3<0) riga=2;
if(colonna-3<0) colonna=2;
for(int i=0;i<4;i++){
for(int c=0;c<4;c++){
casScoperte[riga-i+1][colonna-c+1]=3;
}
}
}
void posiziona(int riga,int colonna,int sel,int campo[][16],bool &gioco,int casScoperte[][16],int &contaB){ //funzione per assegnare, secondo la selezione fatta, la bandiera o una casella scoperta nella posizione indicata
riga--;
colonna--;
if(sel==1){
if(casScoperte[riga][colonna]==3 || casScoperte[riga][colonna]==1){
cout<<"Impossibile scoprire."<<endl;
}
else if(campo[riga][colonna]==9){ //se nella casella c'� una mina giocatore perde
system("clear");
//perso(casScoperte,campo);
gioco=false;
}
else{
cout<<"La posizione e' stata scoperta."<<endl; //altrimenti posizione scoperta
casScoperte[riga][colonna]=1;
selScopri(campo,casScoperte); //da sistemare
}
}
else if(sel==2){
if(contaB<40){
casScoperte[riga][colonna]=2; //se possibile, aggiungo bandiera
contaB++;
}else cout<<"Numero massimo bandiere raggiunto."<<endl;
}
else if(sel==3){
casScoperte[riga][colonna]=0; //se possibile, rimuovo bandiera
contaB--;
}
}
void perso(int casScoperte[][16],int campo[][16]){ //messaggio finale se gioc perde
system("clear");
cout<<"Hai perso."<<endl;
for(int i=0;i<16;i++){
for(int c=0;c<16;c++){
if(campo[i][c]==9) casScoperte[i][c]=9;
}
}
}