private static void PrintMap(Map map)
        {
            var foodTiles     = map.FoodPositions.Select(p => new PrintTile(p, "F", ConsoleColor.Red));
            var obstacleTiles = map.ObstaclePositions.Select(p => new PrintTile(p, "*", ConsoleColor.Yellow));
            var playerTiles   = map.Snakes.Where(p => p.IsAlive)
                                .SelectMany(p =>
            {
                var headPosition = p.Positions.First();
                var color        = PlayerColors.GetColor(p.Id);
                var head         = new PrintTile(headPosition, "@", color);
                return(new[] { head }.Concat(p.Positions.Skip(1).Select(pos => new PrintTile(pos, "#", color))));
            });

            Console.WriteLine(new string('-', map.Width + 2));
            int rowIndex = 0;

            foreach (var row in obstacleTiles.Concat(playerTiles).Concat(foodTiles).GroupBy(t => t.Position.Y).OrderBy(x => x.Key))
            {
                var stringBuilder = new StringBuilder();
                Console.ForegroundColor = ConsoleColor.White;
                while (rowIndex++ < row.Key)
                {
                    stringBuilder.Append('|').Append(' ', map.Width).Append('|').AppendLine();
                }
                Console.Write(stringBuilder.ToString());

                Console.ForegroundColor = ConsoleColor.White;
                Console.Write('|');

                int column = 0;
                foreach (var tile in row.OrderBy(p => p.Position.ToIndex(map.Width)))
                {
                    int diff = tile.Position.X - column;
                    column = tile.Position.X + 1;
                    if (diff < 0)
                    {
                        continue;
                    }
                    Console.ForegroundColor = tile.Color;
                    Console.Write(new StringBuilder().Append(' ', diff).Append(tile.Character));
                }

                Console.ForegroundColor = ConsoleColor.White;
                Console.Write(new StringBuilder().Append(' ', map.Width - column).AppendLine("|"));
            }

            var sb = new StringBuilder();

            Console.ForegroundColor = ConsoleColor.White;
            while (rowIndex++ < map.Height)
            {
                sb.Append('|').Append(' ', map.Width).Append('|').AppendLine();
            }
            sb.Append('-', map.Width + 2).AppendLine();
            Console.Write(sb.ToString());
        }
Exemplo n.º 2
0
    public UrbTile[] GetBorderingTiles(UrbTile Tile, bool GetLinked = false, int Distance = 0)
    {
        if (X < 2 && Y < 2 && Distance == 0)
        {
            return(Tile.GetAdjacent(GetLinked));
        }


        Vector2 Voffset = GetOffset();
        int     Xoffset = (int)Voffset.x;
        int     Yoffset = (int)Voffset.y;

        List <UrbTile> ReturnList = new List <UrbTile>();

        for (int i = -1; i <= X; i++)
        {
            UrbTile CheckedTile = Tile.GetRelativeTile(i + Xoffset, Yoffset - (1 + Distance));
            if (CheckedTile == null)
            {
                continue;
            }

            ReturnList.Add(CheckedTile);
        }

        for (int i = 0; i <= Y; i++)
        {
            UrbTile CheckedTile = Tile.GetRelativeTile(X + Xoffset + Distance, i + Yoffset);
            if (CheckedTile == null)
            {
                continue;
            }

            ReturnList.Add(CheckedTile);
        }

        for (int i = -1; i <= X; i++)
        {
            UrbTile CheckedTile = Tile.GetRelativeTile(i + Xoffset, Y + Yoffset + Distance);
            if (CheckedTile == null)
            {
                continue;
            }

            ReturnList.Add(CheckedTile);
        }

        for (int i = 0; i < Y; i++)
        {
            UrbTile CheckedTile = Tile.GetRelativeTile(Xoffset - (1 + Distance), Yoffset + i);
            if (CheckedTile == null)
            {
                continue;
            }

            ReturnList.Add(CheckedTile);
        }

        if (GetLinked)
        {
            UrbTile[] Tiles = GetAllPrintTiles(Tile);

            foreach (UrbTile PrintTile in Tiles)
            {
                if (PrintTile != null)
                {
                    ReturnList.AddRange(PrintTile.GetLinked());
                }
            }
        }

        return(ReturnList.ToArray());
    }