public void DifficultTest() { /* * 11 x 11 * * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 * * * * * 0 0 0 0 0 0 0 * * * * * * * 0 0 0 0 0 0 0 0 * * * 0 0 0 * * * * * * * * 0 0 0 * * * * * * 0 0 * * * 0 * * * * * * 0 0 * * * 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 */ var rectangles = new SimplifiedRectangle[] { new SimplifiedRectangle(0, 4, 2, 6), new SimplifiedRectangle(2, 2, 4, 3), new SimplifiedRectangle(6, 3, 10, 5), new SimplifiedRectangle(7, 7, 10, 8), }; var start = new Vector2(0, 0); var finish = new Vector2(10, 10); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); // результат непредсказуем, т.к. юзаем бфс :) ; //Assert.AreEqual(4, path.Length); }
public void WithoutBarriers() { var rectangles = new SimplifiedRectangle[0]; var start = new Vector2(0, 0); var finish = new Vector2(10, 10); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); Assert.AreEqual(1, path.Length); Assert.AreEqual(finish, path[0]); }
public void OneBarrier() { var rectangles = new SimplifiedRectangle[] { new SimplifiedRectangle(25, 25, 75, 75), }; var start = new Vector2(0, 0); var finish = new Vector2(100, 100); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); Assert.AreEqual(2, path.Length); Assert.AreEqual(finish, path[1]); }
public void PathToRectMiddleFromItsVertext() { var rectangles = new SimplifiedRectangle[] { new SimplifiedRectangle(0, 0, 20, 20) }; var start = new Vector2(0, 0); var finish = new Vector2(10, 10); var path = AlgorithmsMethods.FindPathAmongRectangles(start, finish, rectangles); Assert.IsEmpty(path); }
/// <summary> /// Перемещение юнита в точку. Для перемещения нескольких юнитов лучше использовать соответствующий метод. /// </summary> public void SetUnitMovingTo(GameState state, Unit unit, Vector2 target) { if (!(unit is IMovableUnit)) { throw new ArgumentException($"Unit with {unit.Id} is not IMovableUnit"); } var path = AlgorithmsMethods.FindPathAmongRectangles(unit.Position, target, state.Map.Squares.ToArray()); unit.MovingTargets.Clear(); foreach (var v in path) { unit.MovingTargets.Enqueue(v); } if (unit is ICombatUnit combat) { unit.EnemyId = null; } }