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