Хорошо, во-первых, это мой первый пост здесь, и обычно я могу обойтись и просто найти ответ, однако, поскольку это немного специфично, я не смог найти ответ на этот.
Я немного новичок в кодировании (в основном я знаю основы, просмотрел много видео и прочитал много руководств по С#) и пытаюсь закодировать консольную «игру» ASCII. Какое-то время все шло довольно хорошо, но теперь я застрял на картографической части. Сначала я думал, что буду вводить вручную все координаты для стен. Однако я нашел сообщение здесь, объясняющее, что более объектно-ориентированный способ сделать это - создать такой класс Tile.
public class Tile
{
public int X { get; set; }
public int Y { get; set; }
public bool IsWall { get; set; }
}
а затем заполните список, выполнив это
private static void PopulateTiles()
{
for (int x = 1; x < 159; x++)
for (int y = 3; y < 45; y++)
Tiles.Add(new Tile { X = x, Y = y });
}
Причина нечетного начального значения x и y заключается в том, что я ограничиваю плитки определенной частью консоли, а остальная часть используется для графического интерфейса.
В любом случае, если нет лучшего способа (а он должен быть, я просто не знаю, что это может быть), я пытаюсь получить только части этого списка, чтобы изменить свойство ISWALL, чтобы установить его в TRUE а затем использовать это
static void DrawObstacles()
{
foreach (Tile tile in World.Tiles)
{
if (tile.IsWall)
{
Console.SetCursorPosition(tile.X, tile.Y);
Console.Write("#");
}
}
}
До сих пор я пробовал несколько разных решений, но, очевидно, у меня возникали проблемы с каждым из них (я также пытаюсь избежать замедления программы, если это возможно, и избежать еще одного цикла с более чем 1000 итераций).
//Tried this
private static void SetWalls()
{
int[] walls = new int[] { };
walls += Tiles.GetRange(0, 7); //Fails because I cannot use tiles in an int[]... of course
}
//This
List<Tile> walls = new List<Tile>();
List<Tile> walls = Tiles.GetRange(0, 7);
List<Tile> walls = Tiles.GetRange(19, 7; //Doesn't work either but I've no idea why here
//And finally
List<Tile> walls = new List<Tile>();
walls.Add(Tiles[Tiles.GetRange(0, 7)]); //Gives me an error saying that System.Collections.Generic.List<Engine.Tile> cannot be converted to int
Так что прямо сейчас я немного растерялся, так как я действительно предпочел бы перебирать список, а не вводить все координаты вручную в 2D-массиве... а затем перебирать его, чтобы «построить» стены.
Мой вопрос: возможно ли получить только некоторые части списка (например, индекс 0–7, 19–26, 29, 31, 35–46), а затем перебрать основной список плиток, чтобы использовать этот новый «Список индексов». ", чтобы изменить свойство ISWALL плиток по этим индексам... Если это имеет смысл.
Заранее спасибо и не стесняйтесь сообщать мне, если я допустил какие-то ошибки в посте.