View difference between Paste ID: tdiqwpSf and W7CvsVGL
SHOW: | | - or go back to the newest paste.
1
/*
2
 * Simulation water
3
 * main()
4
 * |
5
 * |--Room
6
 * |    |
7
 * |    |--setRoom() 
8
 * |
9
 * |--Water
10
 * |    |
11
 * |    |--setWater()
12
 * |    |
13
 * |    |--getWater()
14
 * |    |
15-
 * |    |--physix()--getWater()
15+
 * |    |--physix()--------|
16
 * |    |                  |--physix_if()
17
 * |    |--physix_if()     |
18
 * |    |                  |--getWater()
19
 * |    |
20
 * |
21
 * |--Display
22
 * |    |
23
 * |    |--menu()
24
 * |    |
25
 * |    |--menu_3()--error()
26
 * |    |
27
 * |    |--menu_4()--error()
28
 * |    |
29
 * |    |--error()
30
 * |    |
31
 * |    |--debug()
32
 * |
33
 * 
34
**/
35
36
#include <iostream>
37
#include <vector>
38
#include <stdlib.h>
39
#include <windows.h>
40
#include <conio.h>
41
42
using namespace std;
43
vector< vector<int> > water; 	//используется в: Water.
44
int room_size = 10;				//используется в: Water, Room;
45
bool debug_water = false;
46
bool debug_room = false;
47
48
class Room {
49
private:
50
	
51
public:	
52
	void setRoom() {
53
		star: ;
54
		system("cls");
55
		cout << "\n   set room size			>> ";	cin >> room_size;
56
		cout << endl;
57
		if (room_size > 20) {
58
			cout << "ERROR, parameter is very big. Please, set 1-20 room size \n";
59
			goto star;
60
		}
61
		else if (room_size <= 0) {
62
			cout << "ERROR, parameter < 0. Please, set 1-20 room size \n";
63
			goto star;
64
		}
65
		debug_room = true;	
66
	}
67
		
68
};
69
70
class Water {
71
private:
72
	vector<int> water_x;
73
	int water_level = 0;
74
public:
75
	void setWater() {
76
		system("cls");
77
		star: ; 
78
		
79
		cout << "\n   default water level in room	>> ";	cin >> water_level;
80
		cout << endl;
81
		if (water_level > 7) {
82
			cout << "\n   ERROR, parameter is very big. Please, set 0-7 water level \n";
83
			goto star;
84
		}
85
		else if (water_level < 0) {
86
			cout << "\n   ERROR, parameter < 0. Please, set 0-7 water level \n";
87
			goto star;
88
		}
89
		water_x.clear();
90
		water.clear();
91
		for (;water.size() < room_size; water.push_back(water_x)) 
92
			for (;water_x.size() < room_size; water_x.push_back(water_level)) ;	
93
		
94
		debug_water = true;
95
	}
96
	
97
	void getWater() {
98
		star: ; 
99
		system("cls");
100
		
101
		cout << "  ";
102
		for (int x = 0; x < room_size+1; x++) {
103
			cout << "##";
104
		}
105
		cout << "#";
106
		for (int x = 0; x < room_size; x++) {
107
			cout << "\n  # ";
108
			for (int y = 0; y < room_size; y++) {
109
				cout << water[x][y] << " "; 
110
			}
111
			cout << "#";
112
		}
113
		cout << "\n  ";
114
		for (int x = 0; x < room_size+1; x++) {
115
			cout << "##";
116
		}
117
		cout << "#\n";
118
		
119
	}
120
	
121
	void physix() {
122
		const int qX1[8] = {1, -1, 1, 0, -1, 1, 0, -1};
123
		const int qY1[8] = {0, 0, 1, -1, 1, -1, 1, -1};
124
		int qX;
125
		int qY;
126
		vector<int> free_block;
127
		int block;
128
		bool physix_debug; //debug
129
		for (int x = 0; x < room_size; x++) {
130
			for (int y = 0; y < room_size; y++) {
131
				free_block.clear();
132-
					if (water[x][y] != 1)
132+
133-
						if (qX >= 0 && qY >= 0)
133+
134
					qX = qX1[k] + x;
135-
								if (water[qX][qY] < water[x][y] && water[x][y] != 0) {	
135+
136
					if (water[x][y] > 1)
137
					if (physix_if(qX, qY, room_size) && water[qX][qY] < water[x][y]) {
138-
								}
138+
						free_block.push_back(k);
139
						physix_debug = true; //debug	
140
					}
141
						/*if (qX >= 0 && qY >= 0)
142
							if (qX < room_size && qY < room_size)
143
								if (water[qX][qY] < water[x][y]) {	
144
									free_block.push_back(k);
145
									physix_debug = true; //debug
146
								} */
147
				}
148
				
149
				if (physix_debug == true) {
150
					block = rand() % free_block.size();
151
					qX = x+qX1[free_block[block]];
152
					qY = y+qY1[free_block[block]];
153-
	}	
153+
154
					water[x][y] -= 1;
155
					water[qX][qY]	+= 1;
156
				}				
157
			}
158
		Water::getWater();
159
		Sleep(10);
160
		}
161
	}
162
	
163
	bool physix_if(int x, int y, int room) {
164
		if (x < 0) return false;
165
		if (y < 0) return false;
166
		if (x >= room) return false;
167
		if (y >= room) return false;
168
		
169
		return true;	
170
	}
171
172
173
};
174
175
class Display {
176
private:
177
public:
178
	void menu() {
179
		system("cls");
180
		cout << "\n  ####################################\n"
181
			 << "  ###################################\n"
182
			 << "  ##                              ##\n"
183
			 << "  ##       1 - new room           ##\n"
184
			 << "  ##       2 - start              ##\n"
185
			 << "  ##       3 - add block          ##\n"
186
			 << "  ##       4 - del block          ##\n"
187
			 << "  ##       5 - info               ##\n"
188
			 << "  ##       0 - quit               ##\n"
189
			 << "  ##                              ##\n"
190
			 << " ##################################\n"
191
			 << "##################################\n";
192
		cout << "\n\n\n\n"
193
			 << "Command	>> ";	
194
	}
195
	
196
	void menu_3() {
197
		int x = 0;
198
		int y = 0;
199
		//int type;
200
		star: ;
201
		system("cls");
202
		cout << "\n  ####################################\n"
203
			 << "  ###################################\n"
204
			 << "  ##                              ##\n"
205
			 << "  ##        ADD  BLOCK            ##\n"
206
			 << "  ##                              ##\n"
207
			 << " ##################################\n"
208
			 << "##################################\n";
209
		cout << "## room size = " << room_size << "x" << room_size << endl << endl;
210
		cout << "set coordinates X >> ";		cin >> x;
211
		if (x > room_size || x < 1) {
212
			error("ucorrect size");
213
			getch();
214
			goto star;	
215
		}
216
		cout << "\n"
217
			 << "set coordinates Y >> ";		cin >> y;
218
		if (y > room_size || y < 1) {
219
			error("ucorrect size");
220
			getch();
221
			goto star;	
222
		}
223
		x -= 1;
224
		y -= 1;
225
		water[x][y] = 7;
226
	}
227
	
228
	void menu_4() {
229
		int x = 0;
230
		int y = 0;
231
		//int type;
232
		star: ;
233
		system("cls");
234
		cout << "\n  ####################################\n"
235
			 << "  ###################################\n"
236
			 << "  ##                              ##\n"
237
			 << "  ##        DELETE BLOCK          ##\n"
238
			 << "  ##                              ##\n"
239
			 << " ##################################\n"
240
			 << "##################################\n";
241
		cout << "## room size = " << room_size << "x" << room_size << endl << endl;
242
		cout << "set coordinates X >> ";		cin >> x;
243
		if (x > room_size || x < 1) {
244
			error("ucorrect size");
245
			getch();
246
			goto star;	
247
		}
248
		cout << "\n"
249
			 << "set coordinates Y >> ";		cin >> y;
250
		if (y > room_size || y < 1) {
251
			error("ucorrect size");
252
			getch();
253
			goto star;	
254
		}
255
		x -= 1;
256
		y -= 1;
257
		water[x][y] = 0;
258
	}
259
	
260
	void error(string s) {
261
		system("cls");
262
		cout << "\n  ####################################\n"
263
			 << "  ###################################\n"
264
			 << "  ##                              ##\n"
265
			 << "  ##       ERROR ERROR            ##\n"
266
			 << "  ##                              ##\n"
267
			 << " ##################################\n"
268
			 << "##################################\n";
269
		cout << "# " << s << " #\n";
270
	}
271
	
272
	bool debug() {
273
		if (debug_water == false || debug_room == false) {
274
			error("ERROR! please, set parameters. Menu > 1 - new room.");
275
			return false;	
276
		}
277
		return true;
278
	}
279
};
280
281
int main() {
282
	Water objWater;
283
	Room objRoom;
284
	Display objDisplay;
285
	
286
	int command;
287
	
288
	star: ;
289
	objDisplay.menu();
290
	cin >> command;
291
	switch (command) {
292
		case 1:
293
			objRoom.setRoom();
294
			objWater.setWater();
295
			objWater.getWater();
296
			cout << "   Please, press button \n";
297
			getch();
298
			goto star;
299
		case 2:
300
			if (objDisplay.debug() == false) { getch(); goto star; }
301
			for (int x = 0; x < 10; x++)
302
				objWater.physix();
303
			objWater.getWater();
304
			cout << "   Please, press button \n";
305
			getch();
306
			goto star;
307
		case 3:
308
			if (objDisplay.debug() == false) { getch(); goto star; }
309
			objDisplay.menu_3();
310
			objWater.getWater();
311
			cout << "   Please, press button \n";
312
			getch();
313
			goto star;
314
		case 4:
315
			if (objDisplay.debug() == false) { getch(); goto star; }
316
			objDisplay.menu_4();
317
			objWater.getWater();
318
			cout << "   Please, press button \n";
319
			getch();
320
			goto star;
321
		case 5:
322
			if (objDisplay.debug() == false) { getch(); goto star; }
323
			objWater.getWater();
324
			cout << "   Please, press button \n";
325
			getch();
326
			goto star;
327
		case 0:
328
			break;
329
		default:
330
			objDisplay.error("ucorrect command");
331
			getch();
332
			goto star;
333
	}
334
}