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:>> |