⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slider.lst

📁 汽车通讯控制程序 电子屏字符显示器
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -