예제 #1
0
    public SameBlocksContainer.Block FindMapBlock(
        List <MapBlock.Direction> inclusionsDirection,
        List <MapBlock.Direction> exclusionsDirection,
        bool wantedExitBlock             = false,
        MapBlock.Direction exitDirection = MapBlock.Direction.BOTTOM
        )
    {
        SameBlocksContainer.Block block = null;

        if (wantedExitBlock)
        {
            foreach (var item in inclusionsDirection)
            {
                if (exitDirection == item)
                {
                    throw new Exception("Направление выхода не может совпадать с направлением проходов.");
                }
            }
        }

        //проходим по всему списку одинаковых по типу блоков
        for (int i = 0; i < blockContainers.Count; i++)
        {
            bool contin = false;

            //проверяем чтобы были все нужные направления
            foreach (var item in inclusionsDirection)
            {
                if (blockContainers[i].Name.IndexOf(item.ToString()) == -1)
                {
                    contin = true;
                    break;
                }
            }

            //если не нашли нужное направление то проверяем следуущий тип блоков
            if (contin)
            {
                continue;
            }

            //проверяем чтобы небыло ниодного ненужного направления
            foreach (var item in exclusionsDirection)
            {
                if (blockContainers[i].Name.IndexOf(item.ToString()) != -1)
                {
                    contin = true;
                    break;
                }
            }

            //если ненужное направление есть то проверяем следуущий тип блоков
            if (contin)
            {
                continue;
            }

            //индекс найденного типа
            indexType = i;

            //если нужен блок с выходом
            if (wantedExitBlock)
            {
                //случайнам образом берем индекс среди блоков одинакового типа
                try
                {
                    indexSame = rnd.Next(blockContainers[i].ExitBlocks[(int)exitDirection].Count);
                }
                catch
                {
                    StringBuilder builder = new StringBuilder();
                    string        space   = " ";
                    foreach (var item in inclusionsDirection)
                    {
                        builder.Append(item.ToString() + space);
                    }

                    throw new Exception("Блока с проходами: " + builder.ToString() + " и выходом " + exitDirection + " не существует.");
                }
                block = blockContainers[i].ExitBlocks[(int)exitDirection][indexSame];
            }
            //если нужен обычный блок
            else
            {
                //случайнам образом берем индекс среди блоков одинакового типа
                indexSame = rnd.Next(blockContainers[i].SameBlocks.Count);
                block     = blockContainers[i].SameBlocks[indexSame];
            }
            break;
        }

        return(block);
    }
예제 #2
0
    MapBlock.Direction GetExitDirection(Vector2 positionInMinigrid, bool isExit)
    {
        List <MapBlock.Direction> allowableDirections = new List <MapBlock.Direction>(2);

        if (positionInMinigrid.y == 0)
        {
            allowableDirections.Add(MapBlock.Direction.BOTTOM);
        }
        else if (positionInMinigrid.y == rowCountOfBlocks - 1)
        {
            allowableDirections.Add(MapBlock.Direction.TOP);
        }

        if (positionInMinigrid.x == 0)
        {
            allowableDirections.Add(MapBlock.Direction.LEFT);
        }
        else if (positionInMinigrid.x == colCountOfBlocks - 1)
        {
            allowableDirections.Add(MapBlock.Direction.RIGHT);
        }

        if (!isExit)
        {
            MapBlock.Direction d = MapBlock.Direction.BOTTOM;
            switch (GameManager.Instance.exitDirection)
            {
            case MapBlock.Direction.BOTTOM:
                d = MapBlock.Direction.TOP;
                break;

            case MapBlock.Direction.TOP:
                d = MapBlock.Direction.BOTTOM;
                break;

            case MapBlock.Direction.LEFT:
                d = MapBlock.Direction.RIGHT;
                break;

            case MapBlock.Direction.RIGHT:
                d = MapBlock.Direction.LEFT;
                break;
            }

            if (allowableDirections.Contains(d))
            {
                GameManager.Instance.entranceDirection = d;
                return(d);
            }
        }

        int index = rnd.Next(allowableDirections.Count);

        if (isExit)
        {
            GameManager.Instance.exitDirection = allowableDirections[index];
            return(GameManager.Instance.exitDirection);
        }
        else
        {
            GameManager.Instance.entranceDirection = allowableDirections[index];
            return(GameManager.Instance.entranceDirection);
        }
    }