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