Как реализовать работу с коллекцией для алгоритма поиска

92
10 сентября 2019, 07:20

У меня есть List в котором хранятся все клетки на игровом поле, у каждой клетки есть два состояния - проходима или нет (стена). Так как для генерации поля используется клеточный автомат, то некоторые "комнаты" оказываются изолированными. Собственно, попробовал написать алгоритм, который бы проходил по коллекции и создавал комнаты из клеток, но, судя по всему компилятор ругается на то, что нельзя изменять коллекцию (очередь) в момент работы с ней. Вот код тех моментов, которые вызывают ошибку.

public List<Room> rooms;
public List<GameObject> cells;
public void CreateRooms ()
{
    int numberOfRooms = 0;
    foreach (GameObject cell in cells)
    {
        if (cell.GetComponent<Cell>().isWall == false && cell.GetComponent<Cell>().state == "free")
        {
            rooms[numberOfRooms] = GenerateRoom(cell);
            numberOfRooms++;
        }
    }
}
public Room GenerateRoom (GameObject startCell)
{
    int cellInRoom = 0;
    List<GameObject> newRoom = new List<GameObject>();
    Room room = new Room();
    Queue<GameObject> stack = new Queue<GameObject>();
    stack.Enqueue(startCell);
    do
    {
        GameObject temp = stack.Dequeue();
        List<GameObject> TempList = new List<GameObject>();
        TempList = temp.GetComponent<Cell>().idleNeighbors;
        for (int i = 0; i < TempList.Count; i++ )
        {
            newRoom[cellInRoom] = TempList[i];
            cellInRoom++;
            stack.Enqueue(TempList[i]);
        }
    } while (stack.Count != 0);
    for (int i = 0; i < newRoom.Count; i++)
    {
        room.room.Add(newRoom[i]);
    }
    return room;
}
Answer 1

ArgumentOutOfRangeException возникает не при изменении очереди, а когда индекс элемента, к которому вы обращаетесь, выходит за границы очереди. В вашем случае это, видимо, происходит в строке

newRoom[cellInRoom] = TempList[i];

т.к. список newRoom определен без заданного количества элементов

List<GameObject> newRoom = new List<GameObject>();

Соответственно, в нем нет элементов, и при обращении к первому элементу возникает исключение.

Используйте метод Add() класса List

newRoom.Add(TempList[i]);

P.S. Не называйте экземпляр класса Queue именем stack, строчка stack.Enqueue(TempList[i]); режет глаз, все-таки стэк и очередь разные понятия

READ ALSO
Вызвать функцию другой программы

Вызвать функцию другой программы

Есть две программы Server и ClientClient знает о функциях сервера и хочет их вызвать

93
Найти уникальные строки

Найти уникальные строки

Всем привет, хочу найти уникальные строки при чтении файла

117
Как добавить проект Unittest-ов в Visual Studio Code ( Asp.Net Core)

Как добавить проект Unittest-ов в Visual Studio Code ( Asp.Net Core)

Есть проект, назовём его testProject и есть проект Unittest нужно что бы проект Unittest видел папку Models из проекта testProject, как это сделать?

109