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

2019-12-05 07:49:46 来源: 阿勒泰信息港

以下是引用片段:

478/**////

479///寻找一条将工人移动到鼠标点击的位置的路线

480///

481///移动的路线

482publicQueueGetMoveInfo()

483{

484Pointto;

485if(!CanTo(outto))returnnull;

486returnFindPath.Seek(db.Map,worker,to);

487}

488

489/**////

490///给出将箱子推动到鼠标点击的位置所需的信息

491///

492///输出:工人移动的方向

493///工人移动的步数

494publicintGetPushInfo(outDirectiondir)

495{

496dir=Direction.None;

497if(HasError)return0;

498Pointto;//目的地

499if(!CanTo(outto))return0;//无效的目的地

500if(to.Y!=worker.Y&&to.X!=worker.X)return0;//目的地和工人不在同一条直线上

501intz0=(to.Y==worker.Y)?worker.X:worker.Y;

502intz9=(to.Y==worker.Y)?to.X:to.Y;

503if(to.Y==worker.Y)dir=(z9>z0)?Direction.East:Direction.West;

504elsedir=(z9>z0)?Direction.South:Direction.North;

505inti0=Math.Min(z9,z0);

506inti9=Math.Max(z9,z0);

507intsteps=i9-i0;//目的地和工人之间的距离

508intboxs=0;

509for(inti=i0+1;i<i9;i++)

510{

511bytebi=(to.Y==worker.Y)?db.Map[worker.Y,i]:db.Map[i,worker.X];

512if(Block.IsBox(bi))boxs++;//计算工人和目的地之间的箱子的个数

513elseif(!Block.IsBlank(bi))boxs+=2;//“墙”和“砖”折算为两个箱子

514}

515if(boxs>1)return0;//多只能推着一个箱子前进

516returnsteps-boxs;//工人移动的步数

517}

518

519/**////

520///检查鼠标点击位置是否可达,并将像素换算为单元格

521///

522///输出:换算后的位置

523///是否可达

524boolCanTo(outPointto)

525{

526if(!ValidClick(outto))returnfalse;

527if(!Block.IsMan(db.Map[worker.Y,worker.X]))thrownewException("内部错误:工人的位置上不是工人");

528if(!Block.IsBlank(db.Map[to.Y,to.X]))returnfalse;//目的地必须是“地”或“槽”

529if(to.Y==worker.Y&&to.X==worker.X)returnfalse;//目的地不能是工人当前的位置

530returntrue;//目的地可达

531}

532

533/**////

534///检查鼠标点击位置是否有效,并将像素换算为单元格

535///

536///输出:换算后的位置

537///是否有效位置

538boolValidClick(outPointto)

539{

540to=Point.Empty;

541if(HasError)returnfalse;

542to.Y=toPixel.Y/boxSize.Height+1;

543to.X=toPixel.X/boxSize.Width+1;

544if(toPixel.X>=boxSize.Width*LevelSize.Width||toPixel.Y>=boxSize.Height*LevelSize.Height)

545returnfalse;//目的地超出当前关的有效范围

546returntrue;//目的地有效

547}

548}

549}

550查看本文来源

3岁宝宝晚上发烧怎么办
小儿退烧药有哪些
老年人家庭常备哪些药
立可安小檗碱片有几种规格
本文标签: