Subversion Repositories Kolibri OS

Rev

Rev 2276 | Rev 2282 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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