Пример #1
0
        public bool ReadFromFile(string fName)
        {
            if (fName != "")
            {
                if (System.IO.File.Exists(fName))
                {
                    XmlReaderSettings settings = new XmlReaderSettings();
                    settings.ConformanceLevel = ConformanceLevel.Fragment;
                    settings.IgnoreWhitespace = true;
                    settings.IgnoreComments   = true;
                    XmlReader reader = XmlReader.Create(fName, settings);

                    while (reader.Read())
                    {
                        if (reader.IsStartElement("mainInfo"))
                        {
                            reader.ReadStartElement("mainInfo");

                            reader.ReadStartElement("width");
                            width = reader.ReadContentAsInt();
                            reader.ReadEndElement();

                            reader.ReadStartElement("heigth");
                            heigth = reader.ReadContentAsInt();
                            reader.ReadEndElement();

                            levelItems = new List <Item> [width, heigth];
                        }
                        else
                        if (reader.IsStartElement("Item"))
                        {
                            reader.ReadStartElement("Item");

                            reader.ReadStartElement("x");
                            int x = reader.ReadContentAsInt();
                            reader.ReadEndElement();

                            reader.ReadStartElement("y");
                            int y = reader.ReadContentAsInt();
                            reader.ReadEndElement();

                            reader.ReadStartElement("code");
                            int code = reader.ReadContentAsInt();
                            reader.ReadEndElement();
                            if (levelItems[x, y] == null)
                            {
                                levelItems[x, y] = new List <Item>();
                            }
                            Item newItem = ItemsCollection.GetItemByCode(code);
                            newItem.XPos = x;
                            newItem.YPos = y;
                            levelItems[x, y].Add(newItem);
                        }
                    }
                    reader.Close();
                    return(true);
                }
            }
            return(false);
        }
Пример #2
0
        public void MoveAction(Graphics g, MoveDirections moveDirections)
        {
            if (finished)
            {
                return;
            }

            if (secondsCounterTimer.Enabled == false)
            {
                secondsCounterTimer.Enabled = true;
            }

            // проверяем есть ли кого двигать
            if (currManPosX == -1 || currManPosY == -1)
            {
                bool founded = false;
                // выполняем проход по элементам и ищем человечка
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < heigth; j++)
                    {
                        if (levelItems[i, j] != null)
                        {
                            foreach (Item itm in levelItems[i, j])
                            {
                                if (itm.ItemType == ItemType.Man)
                                {
                                    founded     = true;
                                    currManPosX = itm.XPos;
                                    currManPosY = itm.YPos;
                                }
                            }
                        }
                    }
                }
                if (!founded)
                {
                    throw new Exception("Некого двигать!");
                }
            }

            int offsetX = 0, offsetY = 0;

            switch (moveDirections)
            {
            case MoveDirections.Rigth:
                offsetX = 1;
                if (currManPosX + offsetX >= width)
                {
                    return;
                }
                break;

            case MoveDirections.Left:
                offsetX = -1;
                if (currManPosX + offsetX < 0)
                {
                    return;
                }
                break;

            case MoveDirections.Up:
                offsetY = -1;
                if (currManPosY + offsetY < 0)
                {
                    return;
                }
                break;

            case MoveDirections.Down:
                offsetY = 1;
                if (currManPosY + offsetY >= heigth)
                {
                    return;
                }
                break;
            }

            if (levelItems[currManPosX + offsetX, currManPosY + offsetY] != null)
            {
                foreach (Item item in levelItems[currManPosX + offsetX, currManPosY + offsetY])
                {
                    if (item.ItemType == ItemType.Wall) // стенка?
                    {
                        return;
                    }
                    if (item.ItemType == ItemType.Package) // коробка и ее необходимо сдвинуть...
                    {
                        bool move = false;
                        switch (moveDirections)
                        {
                        case MoveDirections.Rigth:
                            offsetX = 1;
                            if (currManPosX + (offsetX * 2) >= width)
                            {
                                return;
                            }
                            break;

                        case MoveDirections.Left:
                            offsetX = -1;
                            if (currManPosX + (offsetX * 2) < 0)
                            {
                                return;
                            }
                            break;

                        case MoveDirections.Up:
                            offsetY = -1;
                            if (currManPosY + (offsetY * 2) < 0)
                            {
                                return;
                            }
                            break;

                        case MoveDirections.Down:
                            offsetY = 1;
                            if (currManPosY + (offsetY * 2) >= heigth)
                            {
                                return;
                            }
                            break;
                        }
                        //проверяем возможность движения коробки вправо
                        // если коробку не куда двигать, отменяем действие
                        if (levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)] != null)
                        {
                            foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)])
                            {
                                if (itm.ItemType == ItemType.Wall) // стенка?
                                {
                                    return;
                                }
                                if (itm.ItemType == ItemType.Package) // другая коробка?
                                {
                                    return;
                                }
                            }
                            move = true;
                        }
                        if (move) // двигаем!
                        {
                            Item PckgToDel = null;
                            // у старой позиции удаляем коробку
                            foreach (Item itm in levelItems[currManPosX + offsetX, currManPosY + offsetY])
                            {
                                if (item.ItemType == ItemType.Package)
                                {
                                    PckgToDel = item;
                                }
                            }
                            if (PckgToDel != null)
                            {
                                levelItems[currManPosX + offsetX, currManPosY + offsetY].Remove(PckgToDel);
                            }
                            // добавляем коробку в новое положение
                            // проверяем есть ли во всех элементах goal, если есть то вид коробки нужно изменить
                            // создаем новый вид человечка в соответствии с направлением движения
                            Item newBoxItem;
                            switch (item.Code)
                            {
                            case 4:
                            case 6:
                                newBoxItem = new Item(ItemsCollection.GetItemByCode(4));
                                foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)])
                                {
                                    if (itm.Code == 5)
                                    {
                                        newBoxItem = new Item(ItemsCollection.GetItemByCode(6));
                                    }
                                }
                                break;

                            case 27:
                            case 29: newBoxItem = new Item(ItemsCollection.GetItemByCode(27));
                                foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)])
                                {
                                    if (itm.Code == 28)
                                    {
                                        newBoxItem = new Item(ItemsCollection.GetItemByCode(29));
                                    }
                                }
                                break;

                            case 30:
                            case 32: newBoxItem = new Item(ItemsCollection.GetItemByCode(30));
                                foreach (Item itm in levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)])
                                {
                                    if (itm.Code == 31)
                                    {
                                        newBoxItem = new Item(ItemsCollection.GetItemByCode(32));
                                    }
                                }
                                break;

                            default:
                                return;
                            }
                            newBoxItem.XPos = currManPosX + (offsetX * 2);
                            newBoxItem.YPos = currManPosY + (offsetY * 2);

                            levelItems[currManPosX + (offsetX * 2), currManPosY + (offsetY * 2)].Add(newBoxItem);
                            RedrawItemAtCoords(g, currManPosX + (offsetX * 2), currManPosY + (offsetY * 2));
                            break;
                        }
                        else
                        {
                            return;
                        }
                    }
                }
                Item ManToDel = null;

                // у старой позиции удаляем человечка
                foreach (Item item in levelItems[currManPosX, currManPosY])
                {
                    if (item.ItemType == ItemType.Man)
                    {
                        ManToDel = item;
                    }
                }
                if (ManToDel != null)
                {
                    levelItems[currManPosX, currManPosY].Remove(ManToDel);
                }
                RedrawItemAtCoords(g, currManPosX, currManPosY); // перерисовывает старую позицию уже без человечка

                // создаем новый вид человечка в соответствии с направлением движения
                Item newManItem = null;
                switch (moveDirections)
                {
                case MoveDirections.Rigth:
                    newManItem = new Item(ItemsCollection.GetItemByCode(23));
                    break;

                case MoveDirections.Left:
                    newManItem = new Item(ItemsCollection.GetItemByCode(24));
                    break;

                case MoveDirections.Up:
                    newManItem = new Item(ItemsCollection.GetItemByCode(22));
                    break;

                case MoveDirections.Down:
                    newManItem = new Item(ItemsCollection.GetItemByCode(25));
                    break;
                }
                currManPosX     = currManPosX + offsetX;
                currManPosY     = currManPosY + offsetY;
                newManItem.XPos = currManPosX;
                newManItem.YPos = currManPosY;

                // добавляем человечка на новой позиции
                levelItems[currManPosX, currManPosY].Add(newManItem);
                RedrawItemAtCoords(g, currManPosX, currManPosY);
                movesCnt++;
                isFinished();
            }
        }