// 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); }
//Actions public virtual void Explore() { int number = Random.Range(1, 5); Dir dir_Itr = Dir.Up; for (int i = 0; i < number; i++) { dir_Itr = dir_Itr.Clockwise(); character.TryToMove(dir_Itr); } }
public Dir FindPath(Coord start, Coord dest) { int seed; Dir dir_Iter = Dir.Up; Coord front, temp; bool succeed = false; ResetCheck(); queue.Clear(); queue.Add(start); from[start.x][start.y] = Dir.Up; while (!succeed && queue.Count != 0) { seed = Random.Range(1, 5); front = queue[0]; queue.RemoveAt(0); for (int i = 0; i < seed; i++) { dir_Iter = dir_Iter.Clockwise(); } for (int i = 0; i < 4; i++) { dir_Iter = dir_Iter.Clockwise(); temp = front + dir_Iter.ToCoord(); if (temp.x != Mathf.Clamp(temp.x, 0, 100)) { continue; } if (temp.y != Mathf.Clamp(temp.y, 0, 100)) { continue; } if (from[temp.x][temp.y] != Dir.Stay) { continue; } if (currMap.CheckWallExists(temp)) { from[temp.x][temp.y] = (Dir)10; continue; } queue.Add(temp); from[temp.x][temp.y] = dir_Iter; if (IsArrived(temp, dest)) { succeed = true; break; } } } temp = dest; dir_Iter = Dir.Stay; if (succeed) { while (!IsArrived(temp, start)) { dir_Iter = from[temp.x][temp.y]; temp = temp + dir_Iter.Reverse().ToCoord(); } } return(dir_Iter); }
public static Dir CounterClockwise(this Dir thiz) { return(thiz.Clockwise().Reverse()); }
public Loc Right(Dir front) { return(Forward(front.Clockwise().Clockwise())); }
public static Dir Opposite(this Dir dir) { return(dir.Clockwise().Clockwise().Clockwise().Clockwise()); }