public bool JumpToEdge(Forest f) { do { Tree closestTree = f.GetClosestTree(VisitedTrees.Last().Value, this); double distanceToBorder = f.GetDistanceToBorder(VisitedTrees.Last().Value); double distanceToClosestTree = f.GetDistance(VisitedTrees.Last().Value, closestTree); if (distanceToBorder < distanceToClosestTree) { CalculatedPath.Add(++Hops, new Tree(9696)); // Logging Console.WriteLine($"[{f.Id}]: Monkey {Naam} jumps out of the forest"); Global.Log.TaskList.Add(Task.Run(() => Global.Log.ActionLog(f.Id, this.Id, $"[{f.Id}]: Monkey {Naam} jumps out of the forest"))); f.TextLogs.Add($"[{f.Id}]: Monkey {Naam} jumps out of the forest"); } else { Tree prev = VisitedTrees[Hops]; CalculatedPath.Add(++Hops, closestTree); VisitedTrees.Add(Hops, closestTree); // Logging Console.WriteLine($"[{f.Id}]: Monkey {Naam} jumps from {prev.Id} to {closestTree.Id} at {closestTree.X},{closestTree.Y}"); Global.Log.TaskList.Add(Task.Run(() => Global.Log.ActionLog(f.Id, this.Id, $"[{f.Id}]: Monkey {Naam} jumps from {prev.Id} to {closestTree.Id} at {closestTree.X},{closestTree.Y}"))); Global.Log.TaskList.Add(Task.Run(() => Global.Log.MonkeyLog(f, this, closestTree))); f.TextLogs.Add($"[{f.Id}]: Monkey {Naam} jumps from {prev.Id} to {closestTree.Id} at {closestTree.X},{closestTree.Y}"); Global.Log.WriteMonkeyJump(f, prev, closestTree); } } while (CalculatedPath.Last().Value.Id != 9696); return(true); }
public async Task Jump(Forest forest) { VisitedTrees.Add(ClosestTree); CurrentTree.IsOccupied = false; forest.Trees[ClosestTree.ID].IsOccupied = true; CurrentTree = ClosestTree; ClosestTree = null; }
public async Task CalculateClosestTree(Forest forest) { double distanceToBorder = (new List <double>() { forest.ymax - CurrentTree.PositionY, forest.xmax - CurrentTree.PositionX, CurrentTree.PositionY - forest.ymin, CurrentTree.PositionX - forest.xmin }).Min(); double distanceToClosestTree = 100; foreach (Tree tree in forest.Trees) { if (!VisitedTrees.Contains(tree) && tree.ID != CurrentTree.ID && !tree.IsOccupied) { if (ClosestTree == null && tree != CurrentTree) { ClosestTree = tree; } else { int x1 = CurrentTree.PositionX; int y1 = CurrentTree.PositionY; int x2 = tree.PositionX; int y2 = tree.PositionY; double distanceToTree = Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2)); distanceToClosestTree = Math.Sqrt(Math.Pow(x1 - ClosestTree.PositionX, 2) + Math.Pow(y1 - ClosestTree.PositionY, 2)); if (distanceToTree < distanceToClosestTree) { ClosestTree = tree; } } } } if (distanceToBorder < distanceToClosestTree) { Escaped = true; await DataBaseManager.WriteMonkeyRecordsToDataBase(this, forest.ID); } else { await DataBaseManager.WriteToTextFile(forest); await Jump(forest); } }