科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

作者:银河 来源:博客园 2007年11月17日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
以下是引用片段:
  387 /// 设计模式下,当鼠标点击时要采取的动作
  388 /// 
  389 /// 输出:要重绘的区域
  390 /// 是否发生动作
  391 public bool Design(out Rectangle invalid)
  392 {
  393 invalid = Rectangle.Empty;
  394 Point to;
  395 if (!ValidClick(out to)) return false;
  396 db.UpdateCounts(to.X, to.Y, false);
  397 Block.Update(ref db.Map[to.Y, to.X], pen);
  398 db.UpdateCounts(to.X, to.Y, true);
  399 if (pen == Block.Man0 && HasWorker) pen = Block.Box0;
  400 invalid = BoxToPixel(GetRectangle(to, to));
  401 return true;
  402 }
  403
  404 /**//// 
  405 /// 工人往指定方向前进一步(可能推着箱子)
  406 /// 
  407 /// 前进的方向
  408 /// “撤销”时是否停留
  409 /// 输出:要重绘的区域
  410 /// 是否成功
  411 public bool StepIt(Direction dir, bool isStop, out Rectangle invalid)
  412 {
  413 invalid = Rectangle.Empty;
  414 if (HasError) return false;
  415 if (Direction.None == dir) return false;
  416 Point p1 = worker; // 工人前进方向一步的位置
  417 Point p2 = worker; // 箱子前进方向一步的位置
  418 switch (dir)
  419 {
  420 case Direction.East: p1.X++; p2.X += 2; break;
  421 case Direction.South: p1.Y++; p2.Y += 2; break;
  422 case Direction.West: p1.X--; p2.X -= 2; break;
  423 case Direction.North: p1.Y--; p2.Y -= 2; break;
  424 }
  425 byte b1 = db.Map[p1.Y, p1.X]; // 工人前进方向一步位置上的东西
  426 bool isBox = Block.IsBox(b1); // 是否推着箱子前进
  427 if (!isBox && !Block.IsBlank(b1)) return false; // 如果没有推着箱子且前方不是空地则失败
  428 if (isBox && !Block.IsBlank(db.Map[p2.Y, p2.X])) return false; // 如果推着箱子且箱子前方不是空地则失败
  429 invalid = BoxToPixel(GetRectangle(worker, isBox ? p2 : p1)); // 要重绘的区域
  430 stack.Push(new Step(dir, isBox, isStop)); // 记录走法步骤
  431 Block.ManOut(ref db.Map[worker.Y, worker.X]); // 工人离开当前位置
  432 Block.ManIn(ref db.Map[p1.Y, p1.X]); // 工人进入前方位置
  433 if (isBox)
  434 {
  435 pushSteps++; // 更新推箱子步数
  436 db.Boths += (db.Map[p2.Y, p2.X] - Block.Land) - (b1 - Block.Box0); // 更新已完成任务数
  437 Block.BoxOut(ref db.Map[p1.Y, p1.X]); // 箱子离开当前位置
  438 Block.BoxIn(ref db.Map[p2.Y, p2.X]); // 箱子进入前方位置
  439 }
  440 worker = p1; // 更新工人位置
  441 return true; // 工人成功前进一步(可能推着条子)
  442 }
  443
  444 /**//// 
  445 /// 工人后退一步(可能连带箱子一起后退)
  446 /// 
  447 /// 输出:要重绘的区域
  448 /// 是否完成“撤消”
  449 public bool Back(out Rectangle invalid)
  450 {
  451 invalid = Rectangle.Empty;
  452 if (HasError) return true;
  453 if (stack.Count == 0) return true;
  454 Step step = stack.Pop(); // 当前步骤
  455 Point p1 = worker; // 工人后退方向一步的位置
  456 Point p2 = worker; // 箱子的当前位置
  457 switch (step.Direct)
  458 {
  459 case Direction.East: p1.X--; p2.X++; break;
  460 case Direction.South: p1.Y--; p2.Y++; break;
  461 case Direction.West: p1.X++; p2.X--; break;
  462 case Direction.North: p1.Y++; p2.Y--; break;
  463 }
  464 invalid = BoxToPixel(GetRectangle(p1, step.IsBox ? p2 : worker)); // 要重绘的区域
  465 Block.ManOut(ref db.Map[worker.Y, worker.X]); // 工人离开当前位置
  466 Block.ManIn(ref db.Map[p1.Y, p1.X]); // 工人进入后退方向一步的位置
  467 if (step.IsBox)
  468 {
  469 Block.BoxOut(ref db.Map[p2.Y, p2.X]); // 箱子离开当前位置
  470 Block.BoxIn(ref db.Map[worker.Y, worker.X]); // 箱子进入工人原来的位置
  471 db.Boths += (db.Map[worker.Y, worker.X] - Block.Box0) - (db.Map[p2.Y, p2.X] - Block.Land); // 更新已完成任务数
  472 pushSteps--; // 更新推箱子步数
  473 }
  474 worker = p1; // 更新工人位置
  475 return step.IsStop; // 是否完成“撤消”
  476 }
  477
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

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