Rev 3273 | Rev 3776 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2794 | leency | 1 | //Leency 10.10.2011, JustClicks v2.0, GPL |
2 | |||
3587 | fedesco | 3 | #include "lib\kolibri.h" |
2794 | leency | 4 | #include "lib\random.h" |
5 | #include "lib\boxes.txt" |
||
6 | system_colors sc; |
||
7 | |||
8 | //уровни сложности |
||
2842 | leency | 9 | int DIFFICULTY_LEVEL=1; //по-умолчанию среднее поле |
2794 | leency | 10 | char *BOARD_SIZES[]={ "S", "M", "L", 0 }; |
11 | int DIFFICULTY_LEV_PARAMS[]={ 9, 12, 16 }; |
||
12 | |||
13 | int BLOCKS_NUM; //количество квадратиков по Х и по Y |
||
14 | int BLOCKS_LEFT; //блоков осталось |
||
15 | int blocks_matrix[28*28]; //цвета для поля с квадратиками |
||
16 | |||
17 | #define USER_PANEL_HEIGHT 35 |
||
18 | #define BLOCK_SIZE 21 //размер квадратика |
||
19 | #define MARKED 7 |
||
20 | #define DELETED_BLOCK 6 |
||
3273 | leency | 21 | #define HEADER "Just Clicks v2.1" |
2794 | leency | 22 | |
2797 | leency | 23 | #ifndef AUTOBUILD |
24 | #include "lang.h--" |
||
25 | #endif |
||
26 | |||
2794 | leency | 27 | #ifdef LANG_RUS |
3587 | fedesco | 28 | char NEW_GAME_TEXT[]=" ‡ ®ў® [F2]"; |
2794 | leency | 29 | char REZULT_TEXT[]="ђҐ§г«мв в: "; |
30 | #else |
||
3587 | fedesco | 31 | char NEW_GAME_TEXT[]="New Game [F2]"; |
2794 | leency | 32 | char REZULT_TEXT[]="Rezult: "; |
33 | #endif |
||
34 | |||
35 | |||
36 | void main() |
||
3587 | fedesco | 37 | { |
2794 | leency | 38 | int key, id; |
3587 | fedesco | 39 | |
2842 | leency | 40 | BLOCKS_NUM=DIFFICULTY_LEV_PARAMS[DIFFICULTY_LEVEL]; |
3587 | fedesco | 41 | |
2794 | leency | 42 | new_game(); |
3587 | fedesco | 43 | |
2794 | leency | 44 | loop() |
3587 | fedesco | 45 | switch(WaitEvent()) |
2794 | leency | 46 | { |
47 | case evButton: |
||
3587 | fedesco | 48 | id = GetButtonID(); |
2794 | leency | 49 | if (id==1) ExitProcess(); |
50 | if (id==2) goto _NEW_GAME_MARK; |
||
51 | if (id>=100) |
||
52 | { |
||
53 | if (check_for_end()) break; //если игра закончена |
||
3587 | fedesco | 54 | |
2794 | leency | 55 | move_blocks(id-100); |
56 | draw_field(); |
||
3587 | fedesco | 57 | |
2794 | leency | 58 | draw_clicks_num(); |
3587 | fedesco | 59 | |
2794 | leency | 60 | break; |
61 | } |
||
62 | if (id==10) //изменяем размер поля |
||
63 | { |
||
64 | if (DIFFICULTY_LEVEL<2) DIFFICULTY_LEVEL++; else DIFFICULTY_LEVEL=0; |
||
3587 | fedesco | 65 | |
2794 | leency | 66 | BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[DIFFICULTY_LEVEL]; //количество квадратиков по Х и по Y |
3587 | fedesco | 67 | |
2794 | leency | 68 | new_game(); |
3587 | fedesco | 69 | |
2794 | leency | 70 | MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +9, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+4+USER_PANEL_HEIGHT); |
71 | break; |
||
72 | } |
||
73 | break; |
||
74 | case evKey: |
||
75 | key = GetKey(); |
||
76 | if (key==027) //Escape |
||
77 | ExitProcess(); |
||
78 | if (key==051) //F2 |
||
79 | { |
||
80 | _NEW_GAME_MARK: |
||
81 | new_game(); |
||
82 | draw_clicks_num(); |
||
83 | draw_field(); |
||
84 | } |
||
85 | break; |
||
86 | case evReDraw: |
||
87 | draw_window(); |
||
88 | } |
||
89 | } |
||
90 | |||
91 | |||
92 | void move_blocks(int button_id) //если фишка одна, то не удаляем |
||
93 | { |
||
94 | int i, j, |
||
95 | marked_num=1, |
||
96 | old_marker=blocks_matrix[button_id], |
||
97 | restart; |
||
98 | |||
99 | blocks_matrix[button_id]=MARKED; |
||
100 | |||
101 | //выделяем все фишки того же чвета |
||
102 | _RESTART_MARK: |
||
103 | restart=0; |
||
104 | for (i=0;i |
||
105 | for (j=0;j |
||
106 | { |
||
107 | if (blocks_matrix[i*BLOCKS_NUM+j]<>old_marker) continue; //если фишка не нужного цвета идём дальше |
||
108 | if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //если фишка уже отмечена, идём далее |
||
3587 | fedesco | 109 | |
2794 | leency | 110 | if (j>0) && (blocks_matrix[i*BLOCKS_NUM+j-1]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим левый |
111 | if (i>0) && (blocks_matrix[i-1*BLOCKS_NUM+j]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим верхний |
||
112 | if (j |
||
113 | if (i |
||
3587 | fedesco | 114 | |
2794 | leency | 115 | if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) //если фишку отметили, то потом цикл нужно будет прокрутить сначала - мож ещё чё отметим |
116 | { |
||
117 | restart=1; |
||
118 | marked_num++; |
||
119 | } |
||
120 | } |
||
121 | if (restart) goto _RESTART_MARK; |
||
3587 | fedesco | 122 | |
2794 | leency | 123 | if (marked_num==1) //если блок только один, уходим |
124 | { |
||
125 | blocks_matrix[button_id]=old_marker; |
||
126 | return; |
||
127 | } |
||
128 | |||
129 | //двигаем блоки по вертикали |
||
130 | _2_RESTART_MARK: |
||
131 | restart=0; |
||
132 | for (i=BLOCKS_NUM;i>0;i--) |
||
133 | for (j=BLOCKS_NUM;j>=0;j--) |
||
134 | { |
||
135 | if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) && (blocks_matrix[i-1*BLOCKS_NUM+j]<>blocks_matrix[i*BLOCKS_NUM+j]) |
||
136 | { |
||
137 | blocks_matrix[i*BLOCKS_NUM+j]> |
||
138 | restart=1; |
||
139 | } |
||
140 | } |
||
141 | if (restart) goto _2_RESTART_MARK; |
||
3587 | fedesco | 142 | |
2794 | leency | 143 | //отмечаем фишки, как удалённые |
3587 | fedesco | 144 | for (i=0;i |
2794 | leency | 145 | if (blocks_matrix[i]==MARKED) |
146 | blocks_matrix[i]=DELETED_BLOCK; |
||
3587 | fedesco | 147 | |
2794 | leency | 148 | //двигаем блоки влево, если есть пустой столбец |
149 | restart=BLOCKS_NUM; //не придумал ничего лучше :( |
||
3587 | fedesco | 150 | |
2794 | leency | 151 | _3_RESTART_MARK: |
152 | for (j=0;j |
||
153 | if (blocks_matrix[BLOCKS_NUM-1*BLOCKS_NUM+j]==DELETED_BLOCK) |
||
154 | { |
||
155 | for (i=0;i |
||
156 | blocks_matrix[i*BLOCKS_NUM+j]> |
||
157 | } |
||
158 | restart--; |
||
159 | if (restart) goto _3_RESTART_MARK; |
||
160 | } |
||
161 | |||
162 | |||
163 | void draw_window() |
||
164 | { |
||
165 | int j, PANEL_Y; |
||
166 | proc_info Form; |
||
3587 | fedesco | 167 | |
2794 | leency | 168 | sc.get(); |
169 | DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +9, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+4+USER_PANEL_HEIGHT, |
||
3587 | fedesco | 170 | 0x74,sc.work,0,0,HEADER); |
171 | |||
2794 | leency | 172 | //проверяем не схлопнуто ли окно в заголовок |
173 | GetProcessInfo(#Form, SelfInfo); |
||
174 | if (Form.status_window>2) return; |
||
175 | |||
176 | |||
177 | PANEL_Y=BLOCK_SIZE*BLOCKS_NUM; |
||
178 | |||
179 | DrawBar(0,PANEL_Y, PANEL_Y, USER_PANEL_HEIGHT, sc.work); //панель снизу |
||
3587 | fedesco | 180 | |
2794 | leency | 181 | //новая игра |
182 | DefineButton(10,PANEL_Y+7, 13*6+6, 20, 2,sc.work_button); |
||
183 | WriteText(10+4,PANEL_Y+14,0x80,sc.work_button_text,#NEW_GAME_TEXT,0); |
||
184 | |||
185 | |||
186 | //кнопочкa выбора уровня сложности |
||
187 | DefineButton(95,PANEL_Y+7, 20,20, 10,sc.work_button); |
||
188 | WriteText(95+8,PANEL_Y+14,0x80,sc.work_button_text,BOARD_SIZES[DIFFICULTY_LEVEL],0); |
||
3587 | fedesco | 189 | |
2794 | leency | 190 | draw_field(); |
3587 | fedesco | 191 | |
2794 | leency | 192 | draw_clicks_num(); |
193 | } |
||
194 | |||
195 | |||
196 | int check_for_end() |
||
197 | { |
||
198 | int i, j, button_id; |
||
199 | |||
200 | if (!BLOCKS_LEFT) return 1; //epic win |
||
201 | |||
202 | for (i=0;i |
||
203 | for (j=0;j |
||
204 | { |
||
205 | button_id=blocks_matrix[i*BLOCKS_NUM+j]; |
||
3587 | fedesco | 206 | |
2794 | leency | 207 | if (button_id==DELETED_BLOCK) continue; |
3587 | fedesco | 208 | |
2794 | leency | 209 | if (j>0) && (blocks_matrix[i*BLOCKS_NUM+j-1]==button_id) return 0; |
210 | if (i>0) && (blocks_matrix[i-1*BLOCKS_NUM+j]==button_id) return 0; |
||
211 | if (j |
||
212 | if (i |
||
213 | } |
||
3587 | fedesco | 214 | return 2; |
2794 | leency | 215 | } |
216 | |||
217 | |||
218 | void draw_clicks_num() |
||
219 | { |
||
220 | char rezult[15]; |
||
221 | int i; |
||
222 | int TEXT_Y=BLOCK_SIZE*BLOCKS_NUM+14; |
||
223 | int TEXT_X=TEXT_Y/2+48; //130; |
||
224 | |||
225 | BLOCKS_LEFT=0; |
||
3587 | fedesco | 226 | |
227 | for (i=0;i |
||
228 | if (blocks_matrix[i]<>DELETED_BLOCK) BLOCKS_LEFT++; |
||
229 | |||
2800 | leency | 230 | DrawBar(TEXT_X, TEXT_Y, 18,9, sc.work); |
2821 | leency | 231 | WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(BLOCKS_LEFT),0); |
232 | |||
2794 | leency | 233 | if (check_for_end()) |
234 | { |
||
235 | copystr(#REZULT_TEXT, #rezult); |
||
236 | copystr(IntToStr(BLOCKS_LEFT), #rezult+strlen(#rezult)); |
||
237 | if (check_for_end()==1) copystr("Epic WIN!!1", #rezult); |
||
238 | DrawFlatButton(BLOCK_SIZE*BLOCKS_NUM/2-70, BLOCK_SIZE*BLOCKS_NUM/2-20, 140, 40, 2, #rezult); |
||
239 | } |
||
240 | } |
||
241 | |||
242 | |||
243 | void new_game() |
||
244 | { |
||
245 | int i; |
||
246 | |||
247 | //пять цветов используется в игре для квадратиков, MARKED для того, |
||
248 | //чтобы отметить квадратики в процессе заливки и DELETED_BLOCK для их удаления |
||
249 | for (i=0;i |
||
250 | blocks_matrix[i] = random(5); |
||
3273 | leency | 251 | DeleteButton(2); |
2794 | leency | 252 | } |
253 | |||
254 | |||
255 | void draw_field() |
||
256 | { |
||
257 | int i, j; |
||
258 | int current_id; |
||
3587 | fedesco | 259 | |
2794 | leency | 260 | for (i=0;i |
261 | for (j=0;j |
||
262 | { |
||
263 | current_id = i*BLOCKS_NUM+j; |
||
264 | DeleteButton(current_id+100); |
||
265 | if (blocks_matrix[current_id]==DELETED_BLOCK) |
||
266 | { |
||
267 | DrawBar(j*BLOCK_SIZE,i*BLOCK_SIZE, BLOCK_SIZE,BLOCK_SIZE, 0xB2B4BF); |
||
268 | } |
||
269 | else |
||
270 | { |
||
271 | DefineButton(j*BLOCK_SIZE,i*BLOCK_SIZE,BLOCK_SIZE-1,BLOCK_SIZE-1, current_id+100+BT_HIDE,0); |
||
272 | PutImage(blocks_matrix[current_id]*1323+#img,21,21,j*BLOCK_SIZE,i*BLOCK_SIZE); |
||
273 | } |
||
274 | } |
||
275 | } |
||
276 | |||
277 | |||
278 | void DrawFlatButton(dword x,y,width,height,id,text) |
||
279 | { |
||
280 | DrawRegion_3D(x,y,width,height,sc.work_graph,sc.work_graph); |
||
281 | DrawRegion_3D(x+1,y+1,width-2,height-2,0xFFFFFF,sc.work); |
||
282 | DrawBar(x+2,y+2,width-3,height-3,sc.work); |
||
283 | IF (id) DefineButton(x,y,width,height,id+BT_HIDE,sc.work); |
||
284 | WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,sc.work_text,text,0); |
||
285 | } |
||
286 | |||
3587 | fedesco | 287 | stop: |