Subversion Repositories Kolibri OS

Rev

Rev 2796 | Go to most recent revision | Details | 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"
6
#include "lang.h"
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: