📄 slider.lst
字号:
177 if (hole_x_pos != (WIDTH_IN_TILES-1) ) {
178 MoveTile(hole_x_pos + 1, hole_y_pos);
179 }
180 break;
181 }
182 }
183 break;
184
185 case GR_EVENT_TYPE_EXPOSURE:
186 RefreshWindow();
187 break;
188 case GR_EVENT_TYPE_CLOSE_REQ:
189 GrClose();
190 exit(0);
191 }
192
193 }
194
195 void
196 RefreshWindow()
197 {
198 int xpos, ypos;
199
200 GrSetGCForeground(gc1, WHITE);
201 GrSetGCBackground(gc1, RED);
202
203 /* 绘制按钮 */
204 GrRect(buttons, gc1, 0, 0, (calc_width - 12)/2, 34);
205 GrRect(buttons, gc1, (calc_width - 8)/2, 0, (calc_width - 12)/2, 34);
206
207
208 GrText(buttons, gc1, 5, 22, "Again", 5, 0);
209 GrText(buttons, gc1, (calc_width / 2) + 5, 22, "Quit", 4, 0);
210
211 /* 绘制拼图 */
212 for (ypos=0; ypos< HEIGHT_IN_TILES; ypos++){
213 for (xpos=0; xpos< WIDTH_IN_TILES; xpos++){
214 DrawTile(xpos, ypos);
215 }
216 }
217 }
218
219 void
220 RandomiseTiles()
221 {
222 int count, xpos, ypos;
223
224 /* 将图片对应的4*4的区域编号*/
225 for (ypos=0; ypos< HEIGHT_IN_TILES; ypos++){
226 for (xpos=0; xpos< WIDTH_IN_TILES; xpos++){
227 value[xpos][ypos] = 1 + xpos + (WIDTH_IN_TILES * ypos);
228 }
229 }
230
231 /* 空区的位置 */
232 xpos = WIDTH_IN_TILES - 1;
233 ypos = HEIGHT_IN_TILES - 1;
234
235 /* 使用随机数将拼图随意移动 */
236 for (count=0; count< MAX_TILES * 1000; count++){
237 switch(random() % 4) {
C51 COMPILER V7.06 SLIDER 07/27/2005 18:45:50 PAGE 5
238 case 0:
239 if (ypos < HEIGHT_IN_TILES - 1) {
240 value[xpos][ypos] = value[xpos][ypos+1];
241 ypos++;
242 value[xpos][ypos] = MAX_TILES;
243 }
244 break;
245 case 1:
246 if (xpos > 0) {
247 value[xpos][ypos] = value[xpos - 1][ypos];
248 xpos--;
249 value[xpos][ypos] = MAX_TILES;
250 }
251 break;
252 case 2:
253 if (ypos > 0) {
254 value[xpos][ypos] = value[xpos][ypos - 1];
255 ypos--;
256 value[xpos][ypos] = MAX_TILES;
257 }
258 break;
259 case 3:
260 if (xpos < WIDTH_IN_TILES - 1) {
261 value[xpos][ypos] = value[xpos + 1][ypos];
262 xpos++;
263 value[xpos][ypos] = MAX_TILES;
264 }
265 break;
266 }
267 }
268 }
269
270 void
271 MoveTile(int xpos, int ypos)
272 {
273 /* 看看能向哪个方向移动 */
274 if (ypos > 0 && value[xpos][ypos - 1] == MAX_TILES) {
275 value[xpos][ypos - 1] = value[xpos][ypos];
276 value[xpos][ypos] = MAX_TILES;
277 DrawTile(xpos, ypos - 1);
278 DrawTile(xpos, ypos);
279 }
280
281 if (xpos < (WIDTH_IN_TILES - 1) && value[xpos + 1][ypos] == MAX_TILES) {
282 value[xpos + 1][ypos] = value[xpos][ypos];
283 value[xpos][ypos] = MAX_TILES;
284 DrawTile(xpos + 1, ypos);
285 DrawTile(xpos, ypos);
286 }
287
288 if (ypos < (HEIGHT_IN_TILES - 1) && value[xpos][ypos + 1] == MAX_TILES) {
289 value[xpos][ypos + 1] = value[xpos][ypos];
290 value[xpos][ypos] = MAX_TILES;
291 DrawTile(xpos, ypos + 1);
292 DrawTile(xpos, ypos);
293 }
294
295 if (xpos > 0 && value[xpos - 1][ypos] == MAX_TILES) {
296 value[xpos - 1][ypos] = value[xpos][ypos];
297 value[xpos][ypos] = MAX_TILES;
298 DrawTile(xpos - 1, ypos);
299 DrawTile(xpos, ypos);
C51 COMPILER V7.06 SLIDER 07/27/2005 18:45:50 PAGE 6
300 }
301
302 /* 查看是否完成 */
303 if (value[WIDTH_IN_TILES - 1][HEIGHT_IN_TILES - 1] == MAX_TILES) {
304 int winner = 0;
305 for (ypos=0; ypos< HEIGHT_IN_TILES; ypos++){
306 for (xpos=0; xpos< WIDTH_IN_TILES; xpos++){
307 if (value[xpos][ypos] == winner + 1)
308 winner++;
309 else
310 winner=0;
311 }
312 }
313 if (winner == MAX_TILES) {
314 /* 完成了拼图 */
315 int loop = MAX_TILES;
316 for(loop=0; loop < MAX_TILES; loop++) {
317 for(winner=0; winner < (MAX_TILES - loop) ; winner++) {
318 xpos = winner % WIDTH_IN_TILES;
319 ypos = (int)(winner/WIDTH_IN_TILES);
320 value[xpos][ypos] = loop + winner + 1;
321 DrawTile(winner % WIDTH_IN_TILES, (int)(winner/WIDTH_IN_TILES));
322 }
323 GrFlush();
324 for(winner=0; winner < 10000000 ; winner++);
325 /* 延时 */
326 }
327 /* 输出完成信息 */
328 GrSetGCForeground(gc1, WHITE);
329 GrSetGCBackground(gc1, RED);
330 GrText(tiles, gc1, ((WIDTH_IN_TILES * tile_width)/2) - 40, (HEIGHT_IN_TILES * tile_height)/2, "Well Don
-e!!", -1, 0);
331 }
332
333 }
334 }
335
336
337 void
338 DrawTile(int xpos, int ypos)
339 {
340 char text[]="00";
341
342 /* 清理屏幕 */
343 GrSetGCForeground(gc1, RED);
344 GrFillRect(tiles, gc1, (xpos* tile_width), (ypos*tile_height), tile_width,
345 tile_height);
346
347 if (value[xpos][ypos] != MAX_TILES ) {
348 /* 重绘屏图的边框 */
349 GrSetGCForeground(gc1, WHITE);
350 GrSetGCBackground(gc1, RED);
351 GrRect(tiles, gc1, (xpos*tile_width), (ypos*tile_height), tile_width,
352 tile_height);
353
354 /* 拷贝并且显示图形的切片 */
355 GrCopyArea(tiles, gc1, 1 + (xpos*tile_width), 1 + (ypos*tile_height),
356 tile_width - 2, tile_height - 2, image,
357 1 + (((value[xpos][ypos] - 1) % WIDTH_IN_TILES) * tile_width),
358 1 + (((int)(value[xpos][ypos] - 1) / WIDTH_IN_TILES) * tile_height), 0);
359
360 }
C51 COMPILER V7.06 SLIDER 07/27/2005 18:45:50 PAGE 7
361 }
C51 COMPILATION COMPLETE. 2 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -