科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用 C# 开发智能手机软件:推箱子(十一)

用 C# 开发智能手机软件:推箱子(十一)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在上篇文章“使用 C# 开发智能手机软件:推箱子(十)”中,我对Common/DataFile.cs 源程序文件进行了介绍。

作者:银河 来源:博客园 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章