扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:银河 来源:博客园 2007年11月17日
关键字:
以下是引用片段: 478 /**//// 479 /// 寻找一条将工人移动到鼠标点击的位置的路线 480 /// 481 /// 移动的路线 482 public Queue GetMoveInfo() 483 { 484 Point to; 485 if (!CanTo(out to)) return null; 486 return FindPath.Seek(db.Map, worker, to); 487 } 488 489 /**//// 490 /// 给出将箱子推动到鼠标点击的位置所需的 491 /// 492 /// 输出:工人移动的方向 493 /// 工人移动的步数 494 public int GetPushInfo(out Direction dir) 495 { 496 dir = Direction.None; 497 if (HasError) return 0; 498 Point to; // 目的地 499 if (!CanTo(out to)) return 0; // 无效的目的地 500 if (to.Y != worker.Y && to.X != worker.X) return 0; // 目的地和工人不在同一条直线上 501 int z0 = (to.Y == worker.Y) ? worker.X : worker.Y; 502 int z9 = (to.Y == worker.Y) ? to.X : to.Y; 503 if (to.Y == worker.Y) dir = (z9 > z0) ? Direction.East : Direction.West; 504 else dir = (z9 > z0) ? Direction.South : Direction.North; 505 int i0 = Math.Min(z9, z0); 506 int i9 = Math.Max(z9, z0); 507 int steps = i9 - i0; // 目的地和工人之间的距离 508 int boxs = 0; 509 for (int i = i0 + 1; i < i9; i++) 510 { 511 byte bi = (to.Y == worker.Y) ? db.Map[worker.Y, i] : db.Map[i, worker.X]; 512 if (Block.IsBox(bi)) boxs++; // 计算工人和目的地之间的箱子的个数 513 else if (!Block.IsBlank(bi)) boxs += 2; // “墙”和“砖”折算为两个箱子 514 } 515 if (boxs > 1) return 0; // 最多只能推着一个箱子前进 516 return steps - boxs; // 工人移动的步数 517 } 518 519 /**//// 520 /// 521 /// 522 /// 输出:换算后的位置 523 /// 是否可达 524 bool CanTo(out Point to) 525 { 526 if (!ValidClick(out to)) return false; 527 if (!Block.IsMan(db.Map[worker.Y, worker.X])) throw new Exception("内部错误:工人的位置上不是工人"); 528 if (!Block.IsBlank(db.Map[to.Y, to.X])) return false; // 目的地必须是“地”或“槽” 529 if (to.Y == worker.Y && to.X == worker.X) return false; // 目的地不能是工人当前的位置 530 return true; // 目的地可达 531 } 532 533 /**//// 534 /// 检查鼠标点击位置是否有效, 并将像素换算为单元格 535 /// 536 /// 输出:换算后的位置 537 /// 是否有效位置 538 bool ValidClick(out Point to) 539 { 540 to = Point.Empty; 541 if (HasError) return false; 542 to.Y = toPixel.Y / boxSize.Height + 1; 543 to.X = toPixel.X / boxSize.Width + 1; 544 if (toPixel.X >= boxSize.Width * LevelSize.Width || toPixel.Y >= boxSize.Height * LevelSize.Height) 545 return false; // 目的地超出当前关的有效范围 546 return true; // 目的地有效 547 } 548 } 549} 550 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者