Rev 2281 | Rev 2283 | 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(); |
||
2282 | leency | 123 | IF (id==1) || (id==4) ExitProcess(); |
124 | IF (id==2) goto _NEW_GAME_MARK; |
||
125 | IF (id==3) goto _HELP_MARK; |
||
126 | IF (id>=100) make_turn(id-100); |
||
2276 | leency | 127 | if (id>=10) |
128 | { |
||
129 | id=id-10*3; |
||
130 | |||
2282 | leency | 131 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[id]) break; //выбран тот же размер |
2276 | leency | 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(); |
||
2282 | leency | 144 | IF (key==027) //Escape |
2276 | leency | 145 | ExitProcess(); |
2282 | leency | 146 | IF (key==050) //F1 |
2276 | leency | 147 | { |
148 | _HELP_MARK: |
||
149 | CreateThread(#help,#stak); |
||
150 | } |
||
2282 | leency | 151 | IF (key==051) //F2 |
2276 | leency | 152 | { |
153 | _NEW_GAME_MARK: |
||
154 | new_game(); |
||
155 | draw_clicks_num(); |
||
156 | draw_field(); |
||
157 | } |
||
2282 | 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 | { |
||
2282 | leency | 174 | IF (color_matrix[0]==turn_id) return; //если цвет первой фишки такой же, игнорируем бессмысленный ход |
175 | IF (CLICKS>=MAX_CLICKS) return; //если игра закончена |
||
2281 | leency | 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); |
||
2282 | leency | 197 | IF (Form.height==GetSkinWidth()+3) return; |
2276 | leency | 198 | |
199 | //закрашиваем фон -> уменьшает перерисовку |
||
200 | for (i=0;i<=4;i++) |
||
201 | { |
||
2282 | leency | 202 | IF (i<>4) |
2276 | leency | 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 | |||
2282 | leency | 227 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[j*3]) EDI=0x800080; |
2276 | leency | 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 | { |
||
2282 | leency | 271 | IF (color_matrix[i*BLOCKS_NUM+j]<>old_color_id) continue; //если фишка не нужного цвета идём дальше |
272 | IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //если фишка уже отмечена, идём далее |
||
2276 | leency | 273 | |
2282 | leency | 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 |
||
2276 | leency | 278 | |
2282 | leency | 279 | IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) restart=1; //если фишку отметили, то потом цикл нужно будет прокрутить сначала - мож ещё чё отметим |
2276 | leency | 280 | } |
2282 | leency | 281 | IF (restart) goto _RESTART_MARK; |
2276 | leency | 282 | |
283 | for (i=0;i |
||
284 | for (j=0;j |
||
2282 | leency | 285 | IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=new_color_id; |
2276 | leency | 286 | } |
287 | |||
288 | |||
289 | int check_for_end() |
||
290 | { |
||
291 | int i, j, ii, jj; |
||
292 | |||
293 | if (CLICKS>=MAX_CLICKS) //если проигрыш |
||
294 | { |
||
2282 | leency | 295 | IF (CLICKS==MAX_CLICKS) //выигрышь на последнем ходе |
2276 | leency | 296 | { |
297 | for (i=0;i |
||
298 | for (j=0;j |
||
2282 | leency | 299 | IF (color_matrix[i*BLOCKS_NUM+j]<>color_matrix[0]) goto _LOOSE_MARK; |
2276 | leency | 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 | { |
||
2282 | leency | 308 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) |
2276 | leency | 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 |
||
2282 | leency | 331 | IF (color_matrix[i*BLOCKS_NUM+j]<>color_matrix[0]) return 0; |
2276 | leency | 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 | { |
||
2282 | leency | 349 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) //заливка для полей разного размера разная |
2276 | leency | 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 | |||
2282 | leency | 379 | IF (CLICKS<10) EBX=9*6+TEXT_X; |
2276 | leency | 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: |
||
2282 | leency | 410 | IF (GetButtonID()==1) ExitProcess(); |
2276 | leency | 411 | break; |
412 | CASE evKey: |
||
2282 | leency | 413 | IF (GetKey()==27) ExitProcess(); //Esc |
2276 | leency | 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:>> |