Rev 2283 | Rev 3933 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2295 | leency | 1 | //Leency 06.10.2011, Flood-it! v2.4, 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 |
||
2283 | leency | 34 | char *BUTTON_CAPTIONS[]={ " ‡ ®ў® [F2]", " Џ®¬®йм [F1]", " ‚л室 [Esc]", 0}; |
2276 | leency | 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 | |||
2283 | leency | 75 | unsigned char color_matrix[28*28]; //цвета для поля с квадратиками |
2276 | leency | 76 | |
2295 | leency | 77 | unsigned char loss_matrix[14*14]={ |
2276 | leency | 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 | |||
2283 | leency | 94 | unsigned char win_matrix[14*14]={ |
2276 | leency | 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; |
||
2283 | leency | 126 | IF (id>=100) |
127 | { |
||
128 | make_turn(id-100); |
||
129 | break; |
||
130 | } |
||
2276 | leency | 131 | if (id>=10) |
132 | { |
||
133 | id=id-10*3; |
||
134 | |||
2282 | leency | 135 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[id]) break; //выбран тот же размер |
2276 | leency | 136 | |
137 | BLOCK_SIZE = DIFFICULTY_LEV_PARAMS[id]; //размер квадратика |
||
138 | BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[id+1]; //количество квадратиков по Х и по Y |
||
139 | MAX_CLICKS = DIFFICULTY_LEV_PARAMS[id+2]; //максимальное количество кликов до выигрыша |
||
140 | |||
141 | new_game(); |
||
142 | |||
143 | MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14); |
||
144 | } |
||
145 | break; |
||
146 | case evKey: |
||
147 | key = GetKey(); |
||
2282 | leency | 148 | IF (key==027) //Escape |
2276 | leency | 149 | ExitProcess(); |
2282 | leency | 150 | IF (key==050) //F1 |
2276 | leency | 151 | { |
152 | _HELP_MARK: |
||
153 | CreateThread(#help,#stak); |
||
154 | } |
||
2282 | leency | 155 | IF (key==051) //F2 |
2276 | leency | 156 | { |
157 | _NEW_GAME_MARK: |
||
158 | new_game(); |
||
159 | draw_clicks_num(); |
||
160 | draw_field(); |
||
161 | } |
||
2282 | leency | 162 | IF (key==113) make_turn(0); //Q |
163 | IF (key==119) make_turn(1); //W |
||
164 | IF (key==101) make_turn(2); //E |
||
165 | IF (key==097) make_turn(3); //A |
||
166 | IF (key==115) make_turn(4); //S |
||
167 | IF (key==100) make_turn(5); //D |
||
2276 | leency | 168 | break; |
169 | case evReDraw: |
||
170 | draw_window(); |
||
171 | } |
||
172 | } |
||
173 | } |
||
174 | |||
175 | |||
2281 | leency | 176 | void make_turn(int turn_id) |
177 | { |
||
2282 | leency | 178 | IF (color_matrix[0]==turn_id) return; //если цвет первой фишки такой же, игнорируем бессмысленный ход |
179 | IF (CLICKS>=MAX_CLICKS) return; //если игра закончена |
||
2281 | leency | 180 | |
181 | CLICKS++; |
||
182 | draw_clicks_num(); |
||
183 | |||
184 | fill_field(turn_id); |
||
185 | draw_field(); |
||
186 | check_for_end(); //если игра закончена |
||
187 | } |
||
188 | |||
189 | |||
2276 | leency | 190 | void draw_window() |
191 | { |
||
192 | int i, j; |
||
193 | #define BUTTON_SIZE 28 |
||
194 | |||
195 | sc.get(); |
||
196 | |||
197 | DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14, 0x74,sc.work,0,0,"Flood-it!"); |
||
198 | |||
199 | //проверяем не схлопнуто ли окно в заголовок |
||
200 | GetProcessInfo(#Form, SelfInfo); |
||
2295 | leency | 201 | IF (Form.status_window==4) return; |
2276 | leency | 202 | |
203 | //закрашиваем фон -> уменьшает перерисовку |
||
204 | for (i=0;i<=4;i++) |
||
205 | { |
||
2282 | leency | 206 | IF (i<>4) |
2276 | leency | 207 | DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work); |
208 | else |
||
209 | DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work_graph); //ободок |
||
210 | } |
||
211 | DrawBar(0,0, USER_PANEL_WIDTH-5, BLOCK_SIZE*BLOCKS_NUM+10, sc.work); |
||
212 | |||
213 | //кнопочки заливки |
||
214 | for (i=0;i<2;i++) |
||
215 | for (j=0;j<3;j++) |
||
216 | DefineButton(j*BUTTON_SIZE+17,i*BUTTON_SIZE+15,BUTTON_SIZE,BUTTON_SIZE, i*3+j+100,FIELD_COLORS[i*3+j]); |
||
217 | |||
218 | //кнопочки действий |
||
219 | for (j=0;j<3;j++) |
||
220 | { |
||
221 | DefineButton(17,j*25+120, 13*6+6, 20, j+2,sc.work_button); |
||
222 | WriteText(17+4,j*25+127,0x80,sc.work_button_text,BUTTON_CAPTIONS[j],0); |
||
223 | } |
||
224 | |||
225 | //кнопочки выбора уровня сложности |
||
226 | WriteText(17,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,sc.work_text,#LEVELS_TEXT,0); |
||
227 | for (j=0;j<2;j++) |
||
228 | { |
||
229 | DefineButton(j*25+56,BLOCKS_NUM*BLOCK_SIZE-20, 20,20, j+10,sc.work_button); |
||
230 | |||
2282 | leency | 231 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[j*3]) EDI=0x800080; |
2276 | leency | 232 | else EDI=sc.work_button_text; |
233 | |||
234 | WriteText(j*25+56+8,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0); |
||
235 | WriteText(j*25+56+9,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0); |
||
236 | } |
||
237 | |||
238 | draw_clicks_num(); |
||
239 | |||
240 | draw_field(); |
||
241 | |||
242 | } |
||
243 | |||
244 | |||
245 | void new_game() |
||
246 | { |
||
2283 | leency | 247 | int i; |
2276 | leency | 248 | |
249 | CLICKS = 0; |
||
250 | |||
2283 | leency | 251 | for (i=0;i |
252 | color_matrix[i] = random(6); |
||
2276 | leency | 253 | } |
254 | |||
255 | |||
256 | void fill_field(int new_color_id) |
||
257 | { |
||
2283 | leency | 258 | int i, j, |
2276 | leency | 259 | old_color_id=color_matrix[0], |
260 | restart; |
||
261 | #define MARKED 6 |
||
262 | |||
263 | color_matrix[0]=MARKED; |
||
264 | |||
265 | _RESTART_MARK: |
||
266 | |||
267 | restart=0; |
||
268 | |||
269 | for (i=0;i |
||
270 | for (j=0;j |
||
271 | { |
||
2282 | leency | 272 | IF (color_matrix[i*BLOCKS_NUM+j]<>old_color_id) continue; //если фишка не нужного цвета идём дальше |
273 | IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //если фишка уже отмечена, идём далее |
||
2276 | leency | 274 | |
2282 | leency | 275 | IF (j>0) && (color_matrix[i*BLOCKS_NUM+j-1]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим левый |
276 | IF (i>0) && (color_matrix[i-1*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим верхний |
||
277 | IF (j |
||
278 | IF (i |
||
2276 | leency | 279 | |
2282 | leency | 280 | IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) restart=1; //если фишку отметили, то потом цикл нужно будет прокрутить сначала - мож ещё чё отметим |
2276 | leency | 281 | } |
2282 | leency | 282 | IF (restart) goto _RESTART_MARK; |
2276 | leency | 283 | |
2283 | leency | 284 | for (i=0;i |
285 | IF (color_matrix[i]==MARKED) color_matrix[i]=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 | { |
2283 | leency | 297 | for (i=0;i |
2295 | leency | 298 | IF (color_matrix[i]<>color_matrix[0]) goto _loss_MARK; |
2276 | leency | 299 | goto _WIN_MARK; |
300 | } |
||
301 | |||
2295 | leency | 302 | _loss_MARK: |
2276 | leency | 303 | |
304 | for (i=0;i<14;i++) |
||
305 | for (j=0;j<14;j++) |
||
306 | { |
||
2282 | leency | 307 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) |
2276 | leency | 308 | { |
309 | ii=i; |
||
310 | jj=j; |
||
311 | } |
||
312 | else |
||
313 | { |
||
314 | ii=i*2; |
||
315 | jj=j*2; |
||
316 | } |
||
2295 | leency | 317 | color_matrix[ii*BLOCKS_NUM+jj]=loss_matrix[i*14+j]; |
318 | color_matrix[ii+1*BLOCKS_NUM+jj]=loss_matrix[i*14+j]; |
||
319 | color_matrix[ii*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j]; |
||
320 | color_matrix[ii+1*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j]; |
||
2276 | leency | 321 | draw_field(); |
322 | //Pause(5); |
||
323 | } |
||
324 | |||
325 | return 1; |
||
326 | } |
||
327 | |||
2283 | leency | 328 | for (i=0;i |
329 | IF (color_matrix[i]<>color_matrix[0]) return 0; |
||
2276 | leency | 330 | |
331 | //всё поле одного цвета и фишек меньше MAX_CLICKS -> победа |
||
332 | |||
333 | _WIN_MARK: |
||
334 | |||
335 | for (i=0;i<25;i++) |
||
336 | { |
||
337 | new_game(); |
||
338 | draw_field(); |
||
339 | Pause(7); |
||
340 | } |
||
341 | |||
342 | CLICKS=MAX_CLICKS; |
||
343 | |||
344 | for (i=0;i<14;i++) |
||
345 | for (j=0;j<14;j++) |
||
346 | { |
||
2282 | leency | 347 | IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) //заливка для полей разного размера разная |
2276 | leency | 348 | { |
349 | ii=i; |
||
350 | jj=j; |
||
351 | } |
||
352 | else |
||
353 | { |
||
354 | ii=i*2; |
||
355 | jj=j*2; |
||
356 | } |
||
357 | color_matrix[ii*BLOCKS_NUM+jj]=win_matrix[i*14+j]; |
||
358 | color_matrix[ii+1*BLOCKS_NUM+jj]=win_matrix[i*14+j]; |
||
359 | color_matrix[ii*BLOCKS_NUM+jj+1]=win_matrix[i*14+j]; |
||
360 | color_matrix[ii+1*BLOCKS_NUM+jj+1]=win_matrix[i*14+j]; |
||
361 | draw_field(); |
||
362 | //Pause(5); |
||
363 | } |
||
364 | return 1; |
||
365 | } |
||
366 | |||
367 | |||
368 | void draw_clicks_num() |
||
369 | { |
||
370 | #define TEXT_X 21 |
||
371 | #define TEXT_Y 92 |
||
372 | |||
373 | DrawBar(8*6+TEXT_X, TEXT_Y, 6*2,9, sc.work); |
||
374 | |||
375 | WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,#CLICKS_TEXT,0); |
||
376 | |||
2282 | leency | 377 | IF (CLICKS<10) EBX=9*6+TEXT_X; |
2276 | leency | 378 | else EBX=8*6+TEXT_X; |
379 | |||
380 | WriteText(EBX,TEXT_Y,0x80,sc.work_text,IntToStr(CLICKS),0); |
||
381 | |||
382 | WriteText(11*6+TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(MAX_CLICKS),0); |
||
383 | } |
||
384 | |||
385 | |||
386 | void draw_field() |
||
387 | { |
||
388 | int i, j; |
||
389 | int color_id; |
||
390 | |||
391 | for (i=0;i |
||
392 | for (j=0;j |
||
393 | { |
||
394 | color_id = color_matrix[i*BLOCKS_NUM+j]; |
||
395 | DrawBar(j*BLOCK_SIZE+USER_PANEL_WIDTH, i*BLOCK_SIZE+5, BLOCK_SIZE,BLOCK_SIZE, FIELD_COLORS[color_id]); |
||
396 | } |
||
397 | } |
||
398 | |||
399 | |||
400 | void help() |
||
401 | { |
||
402 | int i; |
||
403 | |||
404 | loop() |
||
405 | switch (WaitEvent()) |
||
406 | { |
||
407 | CASE evButton: |
||
2282 | leency | 408 | IF (GetButtonID()==1) ExitProcess(); |
2276 | leency | 409 | break; |
410 | CASE evKey: |
||
2282 | leency | 411 | IF (GetKey()==27) ExitProcess(); //Esc |
2276 | leency | 412 | break; |
413 | CASE evReDraw: |
||
414 | for (i=0; HELP_TEXT[i]<>0; i++;) {}; |
||
415 | |||
2281 | leency | 416 | DefineAndDrawWindow(500,200,450,i*13+44,0x34,sc.work,0,0,#HELP_WINDOW_CAPTION); |
2276 | leency | 417 | |
418 | WriteText(6,12,0x80,sc.work_text,HELP_TEXT[0],0); //это для жирного шрифта |
||
419 | for (i=0; HELP_TEXT[i]<>0; i++;) WriteText(5,i*13+12,0x80,sc.work_text,HELP_TEXT[i],0); |
||
420 | } |
||
421 | } |
||
422 | |||
423 | |||
424 | stop:>> |