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