Subversion Repositories Kolibri OS

Rev

Rev 2281 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2276 leency 1
//Leency 06.10.2011, Flood-it! v2.0, GPL
2
 
3
#include "lib\kolibri.h"
4
#include "lib\random.h"
5
 
6
#ifndef AUTOBUILD
7
#include "lang.h--"
8
#endif
9
 
10
system_colors sc;
11
proc_info Form;
12
dword stak[100]; //окно помощи
13
 
14
//уровни сложности
15
int DIFFICULTY_LEV_PARAMS[]={ 28, 14, 25,  //легко
16
                              17, 28, 50}; //тяжело
17
 
18
//по-умолчанию "легко"
19
int BLOCK_SIZE = 28; //размер квадратика
20
int BLOCKS_NUM = 14; //количество квадратиков по Х и по Y
21
int MAX_CLICKS = 25; //максимальное количество кликов до выигрыша
22
 
23
int CLICKS = 0;      //сколько ходов уже сделал игрок
24
 
25
#define USER_PANEL_WIDTH 119
26
 
27
//шесть цветов используется в игре для квадратиков, седьмой же (последний) для того,
28
//чтобы отметить квадратики в процессе заливки
29
dword FIELD_COLORS[]= {0xf18db6, 0x605ca8, 0xfddc80, 0xdc4a20, 0x46b1e2, 0x7e9d1e,   0x232323, 0};
30
char *BOARD_SIZES[]={ "S", "L", 0 };
31
 
32
 
33
#ifdef LANG_RUS
34
	char *BUTTON_CAPTIONS[]={ " Ќ®ў п  [F2]", " Џ®¬®йм [F1]", " ‚л室 [Esc]", 0};
35
	char CLICKS_TEXT[]=" Љ«ЁЄЁ:   /";
36
	char LEVELS_TEXT[]="Џ®«Ґ:";
37
 
38
	char HELP_WINDOW_CAPTION[]="Џ®¬®йм";
39
	char *HELP_TEXT[]={	"Љ Є ЁЈа вм ў® Flood-it?",
40
	"",
41
	"‡ Ї®«­ЁвҐ Ї®«Ґ ®¤­Ё¬ 梥⮬ §  ®Ја ­ЁзҐ­­®Ґ зЁб«® 室®ў.",
42
	"€Ја  ­ зЁ­ Ґвбп б ўҐае­Ґ© «Ґў®© Є«ҐвЄЁ. ‚лЎҐаЁвҐ 梥в, ­ ¦ ў ­  ®¤Ё­ Ё§",
43
	"Єў ¤а вЁЄ®ў б«Ґў , Ё Є«ҐвЄЁ ®Єа бпвбп нвЁ¬ 梥⮬ - в Є ўл ЇаЁб®Ґ¤Ё­ЁвҐ",
44
	"б®бҐ¤­ЁҐ Є«ҐвЄЁ в®© ¦Ґ ®Єа бЄЁ. ‡ еў вЁвм Ї®«Ґ ­г¦­® §  ¬Ё­Ё¬ «м­®Ґ",
45
	"зЁб«® 室®ў. Џ®и Ј®ў п бва вҐЈЁп б Ё­вҐаҐб­л¬ ЇаЁ­жЁЇ®¬ - Ё§¬Ґ­Ёбм,",
46
	"зв®Ўл Ї®ЎҐ¤Ёвм!", 0};
47
#else
48
	char *BUTTON_CAPTIONS[]={ "New Game [F2]", "Help     [F1]", "Exit    [Esc]", 0};
49
	char CLICKS_TEXT[]="Clicks:   /";
50
	char LEVELS_TEXT[]="Board:";
51
 
52
	char HELP_WINDOW_CAPTION[]="Help";
53
	char *HELP_TEXT[]={	"How to play Flood-it?",
54
	"",
55
	"Flood the whole board with one color within the allowed steps.",
56
	"You start from the top left corner and progress by selecting one",
57
	"of the colored balls on the left. When you change your current area",
58
	"color, every adjacent square with the same color also changes, that",
59
	"way you can flood other areas of the board. Select from 3 sizes of",
60
	"the board and try to flood-it in the least amount of steps!",
61
	"Addictive and Fun!", 0};
62
#endif
63
 
64
 
65
int color_matrix[28*28]; //цвета для поля с квадратиками
66
 
67
int loose_matrix[14*14]={
68
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
69
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
70
2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2,
71
2, 3, 2, 2, 2, 3, 2, 3, 2, 2, 2, 3, 2, 2,
72
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
73
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
74
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
75
2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2,
76
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
77
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
78
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
79
2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2,
80
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
82
};
83
 
84
int win_matrix[14*14]={
85
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
86
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
87
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
88
4, 1, 4, 1, 4, 1, 4, 4, 4, 1, 4, 4, 1, 4,
89
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 4, 1, 4,
90
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 4,
91
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
92
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
93
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
94
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
95
4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
96
4, 4, 1, 4, 1, 4, 4, 1, 4, 1, 4, 4, 1, 4,
97
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
98
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
99
};
100
 
101
void main()
102
{
103
	int key, id;
104
 
105
	new_game();
106
 
107
	loop()
108
	{
109
		switch(WaitEvent())
110
		{
111
			case evButton:
112
				id = GetButtonID();
113
				if (id==1) || (id==4) ExitProcess();
114
				if (id==2) goto _NEW_GAME_MARK;
115
				if (id==3) goto _HELP_MARK;
116
				if (id>=100)
117
				{
118
					if (color_matrix[0]==id-100) break; //если цвет первой фишки такой же, игнорируем бессмысленный ход
119
					if (CLICKS>=MAX_CLICKS) break; //если игра закончена
120
 
121
					CLICKS++;
122
					draw_clicks_num();
123
 
124
					fill_field(id-100);
125
					draw_field();
126
					check_for_end(); //если игра закончена
127
					break;
128
				}
129
				if (id>=10)
130
				{
131
					id=id-10*3;
132
 
133
					if (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[id]) break; //выбран тот же размер
134
 
135
					BLOCK_SIZE = DIFFICULTY_LEV_PARAMS[id]; //размер квадратика
136
					BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[id+1]; //количество квадратиков по Х и по Y
137
					MAX_CLICKS = DIFFICULTY_LEV_PARAMS[id+2]; //максимальное количество кликов до выигрыша
138
 
139
					new_game();
140
 
141
					MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14);
142
					break;
143
				}
144
				break;
145
			case evKey:
146
				key = GetKey();
147
				if (key==027) //Escape
148
					 ExitProcess();
149
				if (key==050) //F1
150
				{
151
					_HELP_MARK:
152
						CreateThread(#help,#stak);
153
				}
154
				if (key==051) //F2
155
				{
156
					_NEW_GAME_MARK:
157
						new_game();
158
						draw_clicks_num();
159
						draw_field();
160
				}
161
				break;
162
			case evReDraw:
163
				draw_window();
164
		}
165
	}
166
}
167
 
168
 
169
void draw_window()
170
{
171
	int i, j;
172
	#define BUTTON_SIZE 28
173
 
174
	sc.get();
175
 
176
	DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14, 0x74,sc.work,0,0,"Flood-it!");
177
 
178
	//проверяем не схлопнуто ли окно в заголовок
179
	GetProcessInfo(#Form, SelfInfo);
180
	if (Form.height==GetSkinWidth()+3) return;
181
 
182
	//закрашиваем фон -> уменьшает перерисовку
183
	for (i=0;i<=4;i++)
184
	{
185
		if (i<>4)
186
			DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work);
187
		else
188
			DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work_graph); //ободок
189
	}
190
	DrawBar(0,0, USER_PANEL_WIDTH-5, BLOCK_SIZE*BLOCKS_NUM+10, sc.work);
191
 
192
	//кнопочки заливки
193
	for (i=0;i<2;i++)
194
		for (j=0;j<3;j++)
195
			DefineButton(j*BUTTON_SIZE+17,i*BUTTON_SIZE+15,BUTTON_SIZE,BUTTON_SIZE, i*3+j+100,FIELD_COLORS[i*3+j]);
196
 
197
	//кнопочки действий
198
	for (j=0;j<3;j++)
199
	{
200
		DefineButton(17,j*25+120, 13*6+6, 20, j+2,sc.work_button);
201
		WriteText(17+4,j*25+127,0x80,sc.work_button_text,BUTTON_CAPTIONS[j],0);
202
	}
203
 
204
	//кнопочки выбора уровня сложности
205
	WriteText(17,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,sc.work_text,#LEVELS_TEXT,0);
206
	for (j=0;j<2;j++)
207
	{
208
		DefineButton(j*25+56,BLOCKS_NUM*BLOCK_SIZE-20, 20,20, j+10,sc.work_button);
209
 
210
		if (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[j*3]) EDI=0x800080;
211
			else EDI=sc.work_button_text;
212
 
213
		WriteText(j*25+56+8,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0);
214
		WriteText(j*25+56+9,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0);
215
	}
216
 
217
	draw_clicks_num();
218
 
219
	draw_field();
220
 
221
}
222
 
223
 
224
void new_game()
225
{
226
	int i, j;
227
 
228
	//randomize();
229
 
230
	CLICKS = 0;
231
 
232
	for (i=0;i
233
		for (j=0;j
234
			color_matrix[i*BLOCKS_NUM+j] = random(6);
235
}
236
 
237
 
238
void fill_field(int new_color_id)
239
{
240
	int i=0, j=0,
241
	old_color_id=color_matrix[0],
242
	restart;
243
	#define MARKED 6
244
 
245
	color_matrix[0]=MARKED;
246
 
247
	_RESTART_MARK:
248
 
249
	restart=0;
250
 
251
	for (i=0;i
252
		for (j=0;j
253
		{
254
			if (color_matrix[i*BLOCKS_NUM+j]<>old_color_id) continue; //если фишка не нужного цвета идём дальше
255
			if (color_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //если фишка уже отмечена, идём далее
256
 
257
			if (j>0) && (color_matrix[i*BLOCKS_NUM+j-1]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим левый
258
			if (i>0) && (color_matrix[i-1*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим верхний
259
			if (j
260
			if (i
261
 
262
			if (color_matrix[i*BLOCKS_NUM+j]==MARKED) restart=1; //если фишку отметили, то потом цикл нужно будет прокрутить сначала - мож ещё чё отметим
263
		}
264
	if (restart) goto _RESTART_MARK;
265
 
266
	for (i=0;i
267
		for (j=0;j
268
			if (color_matrix[i*BLOCKS_NUM+j]==MARKED)	color_matrix[i*BLOCKS_NUM+j]=new_color_id;
269
}
270
 
271
 
272
int check_for_end()
273
{
274
	int i, j, ii, jj;
275
 
276
	if (CLICKS>=MAX_CLICKS) //если проигрыш
277
	{
278
		if (CLICKS==MAX_CLICKS) //выигрышь на последнем ходе
279
		{
280
			for (i=0;i
281
				for (j=0;j
282
					if (color_matrix[i*BLOCKS_NUM+j]<>color_matrix[0]) goto _LOOSE_MARK;
283
			goto _WIN_MARK;
284
		}
285
 
286
		_LOOSE_MARK:
287
 
288
		for (i=0;i<14;i++)
289
			for (j=0;j<14;j++)
290
			{
291
				if (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0])
292
				{
293
					ii=i;
294
					jj=j;
295
				}
296
				else
297
				{
298
					ii=i*2;
299
					jj=j*2;
300
				}
301
				color_matrix[ii*BLOCKS_NUM+jj]=loose_matrix[i*14+j];
302
				color_matrix[ii+1*BLOCKS_NUM+jj]=loose_matrix[i*14+j];
303
				color_matrix[ii*BLOCKS_NUM+jj+1]=loose_matrix[i*14+j];
304
				color_matrix[ii+1*BLOCKS_NUM+jj+1]=loose_matrix[i*14+j];
305
				draw_field();
306
				//Pause(5);
307
			}
308
 
309
		return 1;
310
	}
311
 
312
	for (i=0;i
313
		for (j=0;j
314
			if (color_matrix[i*BLOCKS_NUM+j]<>color_matrix[0]) return 0;
315
 
316
	//всё поле одного цвета и фишек меньше MAX_CLICKS -> победа
317
 
318
	_WIN_MARK:
319
 
320
	for (i=0;i<25;i++)
321
	{
322
		new_game();
323
		draw_field();
324
		Pause(7);
325
	}
326
 
327
	CLICKS=MAX_CLICKS;
328
 
329
	for (i=0;i<14;i++)
330
		for (j=0;j<14;j++)
331
		{
332
			if (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) //заливка для полей разного размера разная
333
			{
334
				ii=i;
335
				jj=j;
336
			}
337
			else
338
			{
339
				ii=i*2;
340
				jj=j*2;
341
			}
342
			color_matrix[ii*BLOCKS_NUM+jj]=win_matrix[i*14+j];
343
			color_matrix[ii+1*BLOCKS_NUM+jj]=win_matrix[i*14+j];
344
			color_matrix[ii*BLOCKS_NUM+jj+1]=win_matrix[i*14+j];
345
			color_matrix[ii+1*BLOCKS_NUM+jj+1]=win_matrix[i*14+j];
346
			draw_field();
347
			//Pause(5);
348
		}
349
	return 1;
350
}
351
 
352
 
353
void draw_clicks_num()
354
{
355
	#define TEXT_X 21
356
	#define TEXT_Y 92
357
 
358
	DrawBar(8*6+TEXT_X, TEXT_Y, 6*2,9, sc.work);
359
 
360
	WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,#CLICKS_TEXT,0);
361
 
362
	if (CLICKS<10) EBX=9*6+TEXT_X;
363
		else EBX=8*6+TEXT_X;
364
 
365
	WriteText(EBX,TEXT_Y,0x80,sc.work_text,IntToStr(CLICKS),0);
366
 
367
	WriteText(11*6+TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(MAX_CLICKS),0);
368
}
369
 
370
 
371
void draw_field()
372
{
373
	int i, j;
374
	int color_id;
375
 
376
	for (i=0;i
377
		for (j=0;j
378
		{
379
			color_id = color_matrix[i*BLOCKS_NUM+j];
380
			DrawBar(j*BLOCK_SIZE+USER_PANEL_WIDTH, i*BLOCK_SIZE+5, BLOCK_SIZE,BLOCK_SIZE, FIELD_COLORS[color_id]);
381
		}
382
}
383
 
384
 
385
void help()
386
{
387
	int i;
388
 
389
	loop()
390
	switch (WaitEvent())
391
	{
392
		CASE evButton:
393
				if (GetButtonID()==1) ExitProcess();
394
				break;
395
		CASE evKey:
396
				if (GetKey()==27) ExitProcess(); //Esc
397
				break;
398
		CASE evReDraw:
399
				for (i=0; HELP_TEXT[i]<>0; i++;) {};
400
 
401
				DefineAndDrawWindow(500,200,450,i*13+50,0x34,sc.work,0,0,#HELP_WINDOW_CAPTION);
402
 
403
				WriteText(6,12,0x80,sc.work_text,HELP_TEXT[0],0); //это для жирного шрифта
404
				for (i=0; HELP_TEXT[i]<>0; i++;) WriteText(5,i*13+12,0x80,sc.work_text,HELP_TEXT[i],0);
405
	}
406
}
407
 
408
 
409
stop: