예제 #1
0
파일: Rail.cs 프로젝트: henon/manic_digger
        public static RailDirectionFlags ToRailDirectionFlags(RailDirection direction)
        {
            switch (direction)
            {
            case RailDirection.DownLeft:
                return(RailDirectionFlags.DownLeft);

            case RailDirection.DownRight:
                return(RailDirectionFlags.DownRight);

            case RailDirection.Horizontal:
                return(RailDirectionFlags.Horizontal);

            case RailDirection.UpLeft:
                return(RailDirectionFlags.UpLeft);

            case RailDirection.UpRight:
                return(RailDirectionFlags.UpRight);

            case RailDirection.Vertical:
                return(RailDirectionFlags.Vertical);

            default:
                throw new ArgumentOutOfRangeException("direction");
            }
        }
예제 #2
0
 public static IEnumerable<VehicleDirection12> ToVehicleDirections(RailDirection direction)
 {
     switch (direction)
     {
         case RailDirection.DownLeft:
             yield return VehicleDirection12.DownLeftDown;
             yield return VehicleDirection12.DownLeftLeft;
             break;
         case RailDirection.DownRight:
             yield return VehicleDirection12.DownRightDown;
             yield return VehicleDirection12.DownRightRight;
             break;
         case RailDirection.Horizontal:
             yield return VehicleDirection12.HorizontalLeft;
             yield return VehicleDirection12.HorizontalRight;
             break;
         case RailDirection.UpLeft:
             yield return VehicleDirection12.UpLeftLeft;
             yield return VehicleDirection12.UpLeftUp;
             break;
         case RailDirection.UpRight:
             yield return VehicleDirection12.UpRightRight;
             yield return VehicleDirection12.UpRightUp;
             break;
         case RailDirection.Vertical:
             yield return VehicleDirection12.VerticalDown;
             yield return VehicleDirection12.VerticalUp;
             break;
         default:
             throw new ArgumentOutOfRangeException("direction");
     }
 }
예제 #3
0
 public static IEnumerable<TileEnterDirection> ToTileEnterDirections(RailDirection rail_direction)
 {
     switch (rail_direction)
     {
         case RailDirection.Horizontal:
             yield return TileEnterDirection.Left;
             yield return TileEnterDirection.Right;
             break;
         case RailDirection.Vertical:
             yield return TileEnterDirection.Left;
             yield return TileEnterDirection.Right;
             break;
         case RailDirection.DownLeft:
             yield return TileEnterDirection.Down;
             yield return TileEnterDirection.Left;
             break;
         case RailDirection.DownRight:
             yield return TileEnterDirection.Down;
             yield return TileEnterDirection.Right;
             break;
         case RailDirection.UpLeft:
             yield return TileEnterDirection.Up;
             yield return TileEnterDirection.Left;
             break;
         case RailDirection.UpRight:
             yield return TileEnterDirection.Up;
             yield return TileEnterDirection.Right;
             break;
         default:
             throw new Exception();
     }
 }
예제 #4
0
 public static RailDirectionFlags ToRailDirectionFlags(RailDirection direction)
 {
     switch (direction)
     {
         case RailDirection.DownLeft:
             return RailDirectionFlags.DownLeft;
         case RailDirection.DownRight:
             return RailDirectionFlags.DownRight;
         case RailDirection.Horizontal:
             return RailDirectionFlags.Horizontal;
         case RailDirection.UpLeft:
             return RailDirectionFlags.UpLeft;
         case RailDirection.UpRight:
             return RailDirectionFlags.UpRight;
         case RailDirection.Vertical:
             return RailDirectionFlags.Vertical;
         default:
             throw new ArgumentOutOfRangeException("direction");
     }
 }
예제 #5
0
 public static int ToRailDirectionFlags(RailDirection direction)
 {
     switch (direction)
     {
         case RailDirection.DownLeft:
             return RailDirectionFlags.DownLeft;
         case RailDirection.DownRight:
             return RailDirectionFlags.DownRight;
         case RailDirection.Horizontal:
             return RailDirectionFlags.Horizontal;
         case RailDirection.UpLeft:
             return RailDirectionFlags.UpLeft;
         case RailDirection.UpRight:
             return RailDirectionFlags.UpRight;
         case RailDirection.Vertical:
             return RailDirectionFlags.Vertical;
         default:
             return 0;
     }
 }
예제 #6
0
        static void Main(string[] args)
        {
            RailDirection[,] rails = new RailDirection[150, 150];
            List <Cart>  carts = new List <Cart>();
            StreamReader sr    = new StreamReader("input13.txt");
            int          j     = 0;

            while (sr.Peek() != -1)
            {
                string line = sr.ReadLine();
                for (int i = 0; i < line.Length; i++)
                {
                    if (line[i] == ' ')
                    {
                        rails[i, j] = RailDirection.None;
                    }
                    else if (line[i] == '|')
                    {
                        rails[i, j] = RailDirection.Vertical;
                    }
                    else if (line[i] == '-')
                    {
                        rails[i, j] = RailDirection.Horizontal;
                    }
                    else if (line[i] == '/')
                    {
                        rails[i, j] = RailDirection.Right;
                    }
                    else if (line[i] == '\\')
                    {
                        rails[i, j] = RailDirection.Left;
                    }
                    else if (line[i] == '+')
                    {
                        rails[i, j] = RailDirection.Intersection;
                    }

                    else if (line[i] == '>')
                    {
                        rails[i, j] = RailDirection.Horizontal; carts.Add(new Cart(i, j, CartDirection.Right));
                    }
                    else if (line[i] == '<')
                    {
                        rails[i, j] = RailDirection.Horizontal; carts.Add(new Cart(i, j, CartDirection.Left));
                    }
                    else if (line[i] == '^')
                    {
                        rails[i, j] = RailDirection.Vertical; carts.Add(new Cart(i, j, CartDirection.Up));
                    }
                    else if (line[i] == 'v')
                    {
                        rails[i, j] = RailDirection.Vertical; carts.Add(new Cart(i, j, CartDirection.Down));
                    }
                }
                j++;
            }

            //PART1
            bool        nCollision = true;
            bool        first      = false;
            List <Cart> toRemove   = new List <Cart>();

            while (nCollision)
            {
                carts.Sort(compareCarts);                //by rows then from left to right
                for (int i = 0; i < carts.Count; i++)
                {
                    if (toRemove.Contains(carts[i]))
                    {
                        continue;                                                 //cart removed
                    }
                    Cart c = carts[i];
                    if (c.dir == CartDirection.Left)
                    {
                        c.x--;
                    }
                    else if (c.dir == CartDirection.Right)
                    {
                        c.x++;
                    }
                    else if (c.dir == CartDirection.Up)
                    {
                        c.y--;
                    }
                    else if (c.dir == CartDirection.Down)
                    {
                        c.y++;
                    }

                    if (rails[c.x, c.y] == RailDirection.Left)                    // -----\-----
                    {
                        if (c.dir == CartDirection.Left)
                        {
                            c.dir = CartDirection.Up;
                        }
                        else if (c.dir == CartDirection.Right)
                        {
                            c.dir = CartDirection.Down;
                        }
                        else if (c.dir == CartDirection.Up)
                        {
                            c.dir = CartDirection.Left;
                        }
                        else if (c.dir == CartDirection.Down)
                        {
                            c.dir = CartDirection.Right;
                        }
                    }
                    else if (rails[c.x, c.y] == RailDirection.Right)                     // ---/----
                    {
                        if (c.dir == CartDirection.Left)
                        {
                            c.dir = CartDirection.Down;
                        }
                        else if (c.dir == CartDirection.Right)
                        {
                            c.dir = CartDirection.Up;
                        }
                        else if (c.dir == CartDirection.Up)
                        {
                            c.dir = CartDirection.Right;
                        }
                        else if (c.dir == CartDirection.Down)
                        {
                            c.dir = CartDirection.Left;
                        }
                    }
                    else if (rails[c.x, c.y] == RailDirection.Intersection)                     // ---+----
                    {
                        if (c.dir == CartDirection.Left)
                        {
                            if (c.lastTurn == CartDirection.Right)                            //turn left
                            {
                                c.dir      = CartDirection.Down;
                                c.lastTurn = CartDirection.Left;
                            }
                            else if (c.lastTurn == CartDirection.Left)                            //go straight
                            {
                                c.lastTurn = CartDirection.Up;
                            }
                            else if (c.lastTurn == CartDirection.Up)                            //turn right
                            {
                                c.dir      = CartDirection.Up;
                                c.lastTurn = CartDirection.Right;
                            }
                        }
                        else if (c.dir == CartDirection.Right)
                        {
                            if (c.lastTurn == CartDirection.Right)                            //turn left
                            {
                                c.dir      = CartDirection.Up;
                                c.lastTurn = CartDirection.Left;
                            }
                            else if (c.lastTurn == CartDirection.Left)                            //go straight
                            {
                                c.lastTurn = CartDirection.Up;
                            }
                            else if (c.lastTurn == CartDirection.Up)                            //turn right
                            {
                                c.dir      = CartDirection.Down;
                                c.lastTurn = CartDirection.Right;
                            }
                        }
                        else if (c.dir == CartDirection.Up)
                        {
                            if (c.lastTurn == CartDirection.Right)                            //turn left
                            {
                                c.dir      = CartDirection.Left;
                                c.lastTurn = CartDirection.Left;
                            }
                            else if (c.lastTurn == CartDirection.Left)                            //go straight
                            {
                                c.lastTurn = CartDirection.Up;
                            }
                            else if (c.lastTurn == CartDirection.Up)                            //turn right
                            {
                                c.dir      = CartDirection.Right;
                                c.lastTurn = CartDirection.Right;
                            }
                        }
                        else if (c.dir == CartDirection.Down)
                        {
                            if (c.lastTurn == CartDirection.Right)                            //turn left
                            {
                                c.dir      = CartDirection.Right;
                                c.lastTurn = CartDirection.Left;
                            }
                            else if (c.lastTurn == CartDirection.Left)                            //go straight
                            {
                                c.lastTurn = CartDirection.Up;
                            }
                            else if (c.lastTurn == CartDirection.Up)                            //turn right
                            {
                                c.dir      = CartDirection.Left;
                                c.lastTurn = CartDirection.Right;
                            }
                        }
                    }

                    carts[i] = c;                    //update position

                    for (int k = 0; k < carts.Count; k++)
                    {
                        if (carts[k].x == c.x && carts[k].y == c.y && i != k && !toRemove.Contains(carts[k]))
                        {
                            if (!first)
                            {
                                //PART1
                                first = true;
                                Console.WriteLine(c.x + "," + c.y);
                                //PART1
                            }
                            toRemove.Add(carts[k]);
                            toRemove.Add(carts[i]);
                        }
                    }
                }

                //PART2
                if (toRemove.Count > 0)
                {
                    foreach (Cart cc in toRemove)
                    {
                        carts.Remove(cc);
                    }
                    toRemove.Clear();
                }
                if (carts.Count == 1)
                {
                    Cart x = carts[0];
                    Console.WriteLine(x.x + "," + x.y);
                    nCollision = false;
                    break;
                }
                //PART2
            }
        }