// dir 方向へ(なるべく)前進する Loc を返す。 // (前方、斜め前方、側面方向の Loc を返す) public Loc[] Forwards5(Dir front) { return(new[] { Forward(front), Forward(front.Clockwise()), Forward(front.Anticlockwise()), Forward(front.Clockwise().Clockwise()), Forward(front.Anticlockwise().Anticlockwise()), }); }
// 前進する場合の移動先の候補を返す。進めない場合は後退する。 private static Loc[] Advance(Loc fm, Dir dir) { var locs = new[] { fm.Forward(dir), fm.Forward(dir.Clockwise()), fm.Forward(dir.Anticlockwise()), fm.Forward(dir.Clockwise().Clockwise()), fm.Forward(dir.Anticlockwise().Anticlockwise()), fm.Backward(dir), }; return(locs); }
// 斜め方向 public Loc[] ForwardsDiagonally(Dir front) { return(new[] { Forward(front.Clockwise()), Forward(front.Anticlockwise()), }); }
// to に近づく private static Loc[] Approach(Loc fm, Loc to) { Dir dir = fm.Toward(to); var locs = new[] { fm.Forward(dir), fm.Forward(dir.Clockwise()), fm.Forward(dir.Anticlockwise()), fm.Forward(dir.Clockwise().Clockwise()), fm.Forward(dir.Anticlockwise().Anticlockwise()), }; Array.Sort(locs, (a, b) => { var x = a.SquareDistance(to); var y = b.SquareDistance(to); return(x.CompareTo(y)); }); return(locs); }
public Loc Left(Dir front) { return(Forward(front.Anticlockwise().Anticlockwise())); }