Subversion Repositories Kolibri OS

Rev

Rev 3933 | Rev 6167 | 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]";
4254 leency 35
	char REZULT_TEXT[]="Result: ";
2794 leency 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
{
4254 leency 168
	int PANEL_Y;
2794 leency 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: