Exemplo n.º 1
0
    /// <summary>
    /// Change size of current grid.
    /// </summary>
    /// <param name="newSize"></param>
    private void ResizeGrid(Vector2Int newSize)
    {
        ClearElements();
        ClearGrid();

        ElementType[,] oldElements = elementTypes;
        ElementType[,] elements    = new ElementType[newSize.y, newSize.x];

        for (int y = 0; y < newSize.y; y++)
        {
            for (int x = 0; x < newSize.x; x++)
            {
                if (y < oldElements.GetLength(0) && x < oldElements.GetLength(1))
                {
                    elements[y, x] = oldElements[y, x];
                }
                else
                {
                    elements[y, x] = ElementType.Air;
                }
            }
        }

        for (int y = 0; y < mapSize.y; y++)
        {
            for (int x = 0; x < mapSize.x; x++)
            {
                elementTypes[y, x] = ElementType.Air;
            }
        }

        isPlayer   = false;
        IsDeleting = false;
        InitializeEditor(elements, newSize, biomeType, Difficulty.Easy, mapName);
    }
Exemplo n.º 2
0
        private static bool CheckIfGameIsOver(ElementType[,] field)
        {
            int numberOfRows = field.GetUpperBound(0) + 1;
            int numberOfCols = field.GetUpperBound(1) + 1;

            for (int i = 0; i < numberOfRows; i++)
            {
                for (int j = 0; j < numberOfCols; j++)
                {
                    switch (field[i, j])
                    {
                    case ElementType.X:
                        if (CheckConsecutiveElements(field, numberOfCols, numberOfRows, i, j, ElementType.X))
                        {
                            return(true);
                        }
                        break;

                    case ElementType.O:
                        if (CheckConsecutiveElements(field, numberOfCols, numberOfRows, i, j, ElementType.O))
                        {
                            return(true);
                        }
                        break;

                    default:
                        break;
                    }
                }
            }

            return(false);
        }
Exemplo n.º 3
0
Arquivo: Map.cs Projeto: kcpru/sokoban
    /// <summary>
    /// Checks whether count of boxes equals count of targets.
    /// </summary>
    public static bool ValidateBoxes(ref ElementType[,] map)
    {
        int boxesCount = 0, targetsCount = 0;

        for (int i = 0; i < map.GetLength(0); i++)
        {
            for (int j = 0; j < map.GetLength(1); j++)
            {
                if (map[i, j] == ElementType.Box)
                {
                    boxesCount++;
                }

                if (map[i, j] == ElementType.Target || map[i, j] == ElementType.PlayerOnTarget)
                {
                    targetsCount++;
                }
            }
        }

        if (boxesCount != targetsCount)
        {
            return(false);
        }
        else
        {
            return(boxesCount > 0 ? true : false);
        }
    }
Exemplo n.º 4
0
        private static void DrawField(ElementType[,] field)
        {
            int numberOfRows    = field.GetUpperBound(0);
            int numberOfColumns = field.GetUpperBound(1);

            for (int rowIndex = 0; rowIndex <= numberOfRows; rowIndex++)
            {
                for (int columnIndex = 0; columnIndex <= numberOfColumns; columnIndex++)
                {
                    switch (field[rowIndex, columnIndex])
                    {
                    case ElementType.X:
                        Console.Write("|X|");
                        break;

                    case ElementType.O:
                        Console.Write("|O|");
                        break;

                    case ElementType.Blank:
                        int index = (numberOfColumns + 1) * rowIndex + columnIndex;
                        Console.Write("|" + index + "|");
                        break;

                    default:
                        break;
                    }
                }
                Console.WriteLine();
            }
        }
Exemplo n.º 5
0
Arquivo: Map.cs Projeto: kcpru/sokoban
    /// <summary>
    /// Returns cloned map.
    /// </summary>
    /// <returns></returns>
    public Map Clone()
    {
        ElementType[,] elements = (ElementType[, ])mapDefinition.Clone();
        Map map = new Map(name, elements, biomeType, difficulty);

        return(map);
    }
Exemplo n.º 6
0
 private static void InitializeField(int numberOfRows, int numberOfColumns,
                                     ElementType[,] field)
 {
     for (int i = 0; i < numberOfRows; i++)
     {
         for (int j = 0; j < numberOfColumns; j++)
         {
             field[i, j] = ElementType.Blank;
         }
     }
 }
Exemplo n.º 7
0
        private static void ImplementInput(ElementType[,] field, ElementType x, string input)
        {
            int rowIndex = -1;
            int colIndex = -1;

            int intInput = Convert.ToInt32(input);

            ConvertIndexToMatrix(intInput, ref rowIndex,
                                 ref colIndex, field.GetUpperBound(1) + 1);

            field[rowIndex, colIndex] = x;
        }
Exemplo n.º 8
0
    public void LoadMap(MapDescription desc)
    {
        mapSize = desc.Size;
        //加载地形
        m_Terrain.Size = MapSize;
        terrainLayer   = new TerrainType[MapSize.x, MapSize.y];
        generateTerrain(desc.terrainDict);

        //加载元素
        m_Element.Size = MapSize;
        elementLayer   = new ElementType[MapSize.x, MapSize.y];
        generateElement(desc.elementDict);
    }
Exemplo n.º 9
0
        private static bool CheckIfAvaibleSpaceLeft(ElementType[,] field)
        {
            int numOfRows = field.GetUpperBound(0) + 1;
            int numOfCols = field.GetUpperBound(1) + 1;

            for (int i = 0; i < numOfRows; i++)
            {
                for (int j = 0; j < numOfCols; j++)
                {
                    if (field[i, j] == ElementType.Blank)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Exemplo n.º 10
0
    /// <summary>
    /// Initializes new editor session and loads map with given size with elements from given 2D array.
    /// </summary>
    /// <param name="mapDefinition">Map elements</param>
    /// <param name="mapSize">Size of map</param>
    /// <param name="biomeType">Type of biome</param>
    /// <param name="difficulty">Difficulty of map</param>
    /// <param name="mapName">Name of map</param>
    public void InitializeEditor(ElementType[,] mapDefinition, Vector2Int mapSize, Biomes biomeType, Difficulty difficulty, string mapName)
    {
        if (!Directory.Exists(PathToMapsDir))
        {
            Directory.CreateDirectory(PathToMapsDir);
        }

        IsEditor       = true;
        this.mapSize   = mapSize;
        this.mapName   = mapName;
        this.biomeType = biomeType;
        nameField.SetValue(mapName);

        CameraSettings();

        editorUI.SetBool("show", true);
        CreateGrid(mapSize);

        elements     = new List <GameObject> [mapSize.y, mapSize.x];
        elementTypes = new ElementType[mapSize.y, mapSize.x];

        for (int y = 0; y < mapSize.y; y++)
        {
            for (int x = 0; x < mapSize.x; x++)
            {
                elementTypes[y, x] = ElementType.Air;
            }
        }

        for (int y = 0; y < mapSize.y; y++)
        {
            for (int x = 0; x < mapSize.x; x++)
            {
                elements[y, x] = new List <GameObject>();

                SelectElement(mapDefinition[y, x]);
                PlaceElement(new Vector3(x, 0f, -y));
            }
        }

        LevelManager.CurrentManager.SetBackgroundColor(biomeType);
        SelectElement(ElementType.Ground);
        SetButtons();
    }
Exemplo n.º 11
0
Arquivo: Map.cs Projeto: kcpru/sokoban
    /// <summary>
    /// Creates new map which contains given elements.
    /// </summary>
    /// <param name="map">Elements</param>
    public Map(string name, ElementType[,] map)
    {
        mapSize = new Vector2Int(map.GetLength(1), map.GetLength(0));

        if (!IsOnePlayer(ref map))
        {
            Debug.LogError("Map has to contain only one player element!");
            return;
        }

        if (!ValidateBoxes(ref map))
        {
            Debug.LogError("Count of boxes has to equal count of targets and must at least one");
            return;
        }

        this.name     = name;
        mapDefinition = (ElementType[, ])map.Clone();
    }
Exemplo n.º 12
0
        public Robot(Position position, int battery, string[] strategies,
                     FacingControl facingControl, MovingControl movingControl,
                     ElementType[,] terrainElementTypes, Stack <CommandType> stackCommandTypes)
        {
            Position          = position;
            Battery           = (battery > 0) ? battery : 0;
            NextStrategy      = 0;
            FacingControl     = facingControl;
            MovingControl     = movingControl;
            Strategies        = strategies;
            Terrain           = terrainElementTypes;
            StackCommandTypes = stackCommandTypes;
            VisitedCells      = new List <Location> {
                Position.Location
            };
            SamplesCollected = new List <ElementType>();

            SolutionStepByStep = new List <Result>();

            _robotMemento = new RobotMemento(position, battery, strategies, facingControl, movingControl);
        }
Exemplo n.º 13
0
        // Factory Method

        public static Robot Create(JToken initialPosition, JToken battery, string[] robotStrategies,
                                   FacingControl facingControl, MovingControl movingControl,
                                   ElementType[,] terrainElementTypes, Stack <CommandType> stackCommandTypes)
        {
            // Validate parameters, throw exceptions

            var locationObject = JObject.Parse(initialPosition.ToString())["location"];
            int x = (int)JObject.Parse(locationObject.ToString())["x"];
            int y = (int)JObject.Parse(locationObject.ToString())["y"];

            var facingObject = (JToken)JObject.Parse(initialPosition.ToString())["facing"];
            var facing       = (Facing)Enum.Parse(typeof(Facing), facingObject.ToString());

            Location location = new Location(x, y);

            Position position = new Position(location, facing);

            return(new Robot(position, battery.Value <int>(), robotStrategies,
                             facingControl, movingControl,
                             terrainElementTypes, stackCommandTypes));
        }
Exemplo n.º 14
0
        private static bool CheckIfInputIsValid(int fieldSize, string input, ElementType[,] field,
                                                int numOfCol, int numOfRow)
        {
            try
            {
                int intInput = Convert.ToInt32(input);

                int rowIndex = -1;
                int colIndex = -1;

                ConvertIndexToMatrix(intInput, ref rowIndex, ref colIndex, numOfCol);


                if (intInput >= field.Length)
                {
                    Console.Clear();
                    DrawField(field);
                    Console.WriteLine("{0} is not a valid index.", intInput);
                    return(false);
                }

                else if (field[rowIndex, colIndex] != ElementType.Blank)
                {
                    Console.Clear();
                    DrawField(field);
                    Console.WriteLine("That place is already occupied.");
                    return(false);
                }

                return(true);
            }

            catch (FormatException)
            {
                Console.Clear();
                DrawField(field);
                Console.WriteLine(input + " is not a number.");
                return(false);
            }
        }
Exemplo n.º 15
0
        private static bool CheckConsecutiveElements(ElementType[,] field, int numberOfCols, int numberOfRows, int i, int j, ElementType element)
        {
            //Case 1 left-right
            if (j + 2 < numberOfCols)
            {
                if (field[i, j + 1] == element && field[i, j + 2] == element)
                {
                    return(true);
                }
            }

            // Case 2 Right-Down Cross
            if (i + 2 < numberOfRows && j + 2 < numberOfCols)
            {
                if (field[i + 1, j + 1] == element && field[i + 2, j + 2] == element)
                {
                    return(true);
                }
            }

            // Case 3 Up-Down
            if (i + 2 < numberOfRows)
            {
                if (field[i + 1, j] == element && field[i + 2, j] == element)
                {
                    return(true);
                }
            }

            // Case 4 Left-Down Cross
            if (i + 2 < numberOfRows && j - 2 >= 0)
            {
                if (field[i + 1, j - 1] == element && field[i + 2, j - 2] == element)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 16
0
    /// <summary>
    /// Returns back to menu, note that it doesn't save map.
    /// </summary>
    public void BackToMenu()
    {
        editorUI.SetBool("show", false);
        ClearGrid();
        ClearElements();
        cam.transform.rotation = Quaternion.identity;
        LevelManager.CurrentManager.SetMainMenuBackgroundColor();
        Animator camAnim = cam.GetComponent <Animator>();

        camAnim.enabled = true;
        mainMenu.OpenPage(MainMenu.ModuleNumber == 2 ? 2 : 0);
        camAnim.SetTrigger("switch");

        elementTypes = new ElementType[0, 0];
        elements     = new List <GameObject> [0, 0];
        mapSize      = Vector2Int.zero;
        isPlayer     = false;
        mapName      = string.Empty;
        mapPath      = string.Empty;

        cam.GetComponent <MapEditorCamera>().DeactivateController();
    }
Exemplo n.º 17
0
Arquivo: Map.cs Projeto: kcpru/sokoban
    /// <summary>
    /// Checks whether the given map has only one player.
    /// </summary>
    /// <param name="map">Array to check.</param>
    public static bool IsOnePlayer(ref ElementType[,] map)
    {
        bool hasPlayer = false;

        for (int i = 0; i < map.GetLength(0); i++)
        {
            for (int j = 0; j < map.GetLength(1); j++)
            {
                if (hasPlayer && (map[i, j] == ElementType.Player || map[i, j] == ElementType.PlayerOnTarget))
                {
                    return(false);
                }

                if (!hasPlayer && (map[i, j] == ElementType.Player || map[i, j] == ElementType.PlayerOnTarget))
                {
                    hasPlayer = true;
                }
            }
        }

        return(true);
    }
Exemplo n.º 18
0
 /// <summary>
 /// Konstruktor
 /// </summary>
 /// <param name="map_width">ilosc komorek w poziomie mapy</param>
 /// <param name="map_height">ilosc komorek w pionie mapy</param>
 public RandomOperator(int map_width, int map_height)
 {
     this.map_width  = map_width;
     this.map_height = map_height;
     Map             = new ElementType[map_width, map_height];
 }
Exemplo n.º 19
0
 public Terrain(ElementType[,] map)
 {
     Map = map;
 }
Exemplo n.º 20
0
        /// <summary>
        /// Konwersja tablicy enum-ów na tablice obiektów MapObject
        /// </summary>
        /// <param name="map_obj">zwracana tablica po konwersji</param>
        /// <param name="objects">pobierana tablica int-ów</param>
        private void CovertIntToObjects(ref MapObject[,] map_obj, ElementType[,] objects)
        {
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    switch (objects[x, y])
                    {
                    case ElementType.AMEBA:
                        map_obj[x, y] = new DestroyableObjects.Ameba(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.BLOB:
                        map_obj[x, y] = new Characters.Blob(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.CHODZACABOMBA:
                        map_obj[x, y] = new Characters.ChodzacaBomba(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.CIEZKIMUR:
                        map_obj[x, y] = new NonDestroyableObjects.CiezkiMur(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.DYNAMIT:
                        map_obj[x, y] = new Weapon.Dynamit(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.GIGANTYCZNYSZCZUR:
                        map_obj[x, y] = new Characters.GigantycznySzczur(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.GOBLIN:
                        map_obj[x, y] = new Characters.Goblin(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.KAMIEN:
                        map_obj[x, y] = new DestroyableObjects.Kamien(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.LEKKIMUR:
                        map_obj[x, y] = new DestroyableObjects.LekkiMur(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.MAGICZNYMUR:
                        map_obj[x, y] = new NonDestroyableObjects.MagicznyMur(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.MARMUROWYKAMIEN:
                        map_obj[x, y] = new NonDestroyableObjects.MarmurowyKamien(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.PEKDYNAMITOW:
                        map_obj[x, y] = new Weapon.PekDynamitow(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.POLESILOWE:
                        map_obj[x, y] = new Weapon.PoleSilowe(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.PUSTE:
                        map_obj[x, y] = new NonDestroyableObjects.Puste(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.RACKET:
                        map_obj[x, y] = new Weapon.Racket(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.RADIOAKTYWNYGLAZ:
                        map_obj[x, y] = new NonDestroyableObjects.RadioaktywnyGlaz(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.VANDAL:
                        this.vandal   = new Characters.Vandal(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        map_obj[x, y] = vandal;
                        break;

                    case ElementType.ZIEMIA:
                        map_obj[x, y] = new DestroyableObjects.Ziemia(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.CELMISJI:
                        map_obj[x, y] = new DestroyableObjects.CelMisji(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y, gameLevel);
                        break;

                    case ElementType.BECZKAZGAZEM:
                        map_obj[x, y] = new DestroyableObjects.BeczkaZGazem(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    case ElementType.NIESTABILNABECZKA:
                        map_obj[x, y] = new DestroyableObjects.NiestabilnaBeczka(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;

                    default:
                        map_obj[x, y] = new DestroyableObjects.Ziemia(content, new Rectangle(x * tile_size, y * tile_size, tile_size, tile_size), x, y);
                        break;
                    }
                }
            }
        }
Exemplo n.º 21
0
 public Level(int width, int height)
 {
     this.Width = width;
     this.Height = height;
     arrTile = new ElementType[Width, Height];
 }