예제 #1
0
        public LIList <Message> GetVisibleMessages(Element c)
        {
            LIList <Message>         res_messages = new LIList <Message>();
            LinkedListNode <Message> messageNode;

            if (c is Ant)
            {
                messageNode = Map.GetTile(c.Position).messages.First;
                while (messageNode != null)
                {
                    res_messages.AddLast(messageNode.Value);
                    messageNode = messageNode.Next;
                }
            }
            else if (c is Rain)
            {
                for (int i = 0; i < AntHillConfig.rainWidth; i++)
                {
                    for (int j = 0; j < AntHillConfig.rainWidth; j++)
                    {
                        messageNode = Map.GetTile(c.Position.X + i, c.Position.Y + j).messages.First;
                        while (messageNode != null)
                        {
                            if (!res_messages.Contains(messageNode.Value))
                            {
                                res_messages.AddLast(messageNode.Value);
                            }
                            messageNode = messageNode.Next;
                        }
                    }
                }
            }
            return(res_messages);
        }
예제 #2
0
        public void CitizenTest()
        {
            Worker          worker1 = new Worker(new Position(2, 2));
            Worker          worker2 = new Worker(new Position(3, 3));
            XmlReaderWriter reader  = new XmlReaderWriter();

            reader.ReadMe("..\\..\\tests\\test-RAIN-anthill.xml");


            AHGraphics.Init();
            /*test AddSet() function*/
            Simulation tmp_isw = new Simulation(new Map(AntHillConfig.mapColCount, AntHillConfig.mapRowCount, AntHillConfig.tiles));

            //Message message = new Message(new Position(2, 2), MessageType.FoodLocalization, new Position(0,0));
            tmp_isw.CreateMessage(new Position(2, 2), MessageType.FoodLocalization, new Position(0, 0));
            tmp_isw.ants.AddLast(worker1);
            tmp_isw.ants.AddLast(worker2);

            //tmp_isw.messages.AddLast(message);
            //worker1.AddToSet(message,2);
            //worker1.SpreadSignal(tmp_isw);

            LIList <Message> list  = tmp_isw.GetVisibleMessages(worker2);
            bool             check = list.Count != 0;

            Assert.IsTrue(check, "problem with adding messages");

            /*test GetNearestFood()*/
            LIList <Food> foodList = new LIList <Food>();

            foodList.AddLast(new Food(new Position(4, 4), 1));
            foodList.AddLast(new Food(new Position(8, 8), 3));
            foodList.AddLast(new Food(new Position(2, 3), 3));
            foodList.AddLast(new Food(new Position(1, 1), 3));
            Food nFood = worker1.testGetNearestFood(foodList);

            Assert.AreEqual(new Position(2, 3), nFood.Position, "finding nearest food problem");

            /*test ReadMessage()*/
            Worker worker3 = new Worker(new Position(4, 4));

            worker3.AddToSet(new Message(new Position(5, 5), MessageType.FoodLocalization, new Position(0, 0)), 1);
            worker3.AddToSet(new Message(new Position(1, 1), MessageType.FoodLocalization, new Position(0, 0)), 3);
            worker3.AddToSet(new Message(new Position(3, 3), MessageType.FoodLocalization, new Position(0, 0)), 2);
            Message nMessage = worker3.testReadMessage(MessageType.FoodLocalization);

            Assert.AreEqual(new Position(1, 1), nMessage.Position, "ReadMessage function problem in Citizen");
        }
예제 #3
0
        public LIList <Food> GetVisibleFood(Element c)
        {
            LIList <Food>         res_food = new LIList <Food>();
            LinkedListNode <Food> foodNode = food.First;

            if (c is Spider || c is Ant) //same radius
            {
                int radius2 = AntHillConfig.antSightRadius * AntHillConfig.antSightRadius;
                while (foodNode != null)
                {
                    int dx = foodNode.Value.Position.X - c.Position.X;
                    int dy = foodNode.Value.Position.Y - c.Position.Y;
                    if (dx * dx + dy * dy <= radius2)
                    {
                        if (_map.CheckVisibility(c.Position, foodNode.Value.Position))
                        {
                            res_food.AddLast(foodNode.Value);
                        }
                    }
                    foodNode = foodNode.Next;
                }
            }
            else if (c is Rain)
            {
                while (foodNode != null)
                {
                    if (_map.GetTile(foodNode.Value.Position).TileType == TileType.Outdoor &&
                        ((Rain)c).IsRainOver(foodNode.Value.Position))
                    {
                        res_food.AddLast(foodNode.Value);
                    }
                    foodNode = foodNode.Next;
                }
            }
            return(res_food);
        }
예제 #4
0
        public LIList <Spider> GetVisibleSpiders(Element c)
        {
            LIList <Spider>         res_spiders = new LIList <Spider>();
            LinkedListNode <Spider> spiderNode  = spiders.First;

            if (c is Spider || c is Ant) //same radius
            {
                int radius2 = AntHillConfig.antSightRadius * AntHillConfig.antSightRadius;
                while (spiderNode != null)
                {
                    int dx = spiderNode.Value.Position.X - c.Position.X;
                    int dy = spiderNode.Value.Position.Y - c.Position.Y;
                    if (dx * dx + dy * dy <= radius2)
                    {
                        if (_map.CheckVisibility(c.Position, spiderNode.Value.Position))
                        {
                            res_spiders.AddLast(spiderNode.Value);
                        }
                    }
                    spiderNode = spiderNode.Next;
                }
            }
            else if (c is Rain)
            {
                while (spiderNode != null)
                {
                    if (_map.GetTile(spiderNode.Value.Position).TileType == TileType.Outdoor &&
                        ((Rain)c).IsRainOver(spiderNode.Value.Position))
                    {
                        res_spiders.AddLast(spiderNode.Value);
                    }
                    spiderNode = spiderNode.Next;
                }
            }
            return(res_spiders);
        }
예제 #5
0
 public bool CreateEgg(Position pos)
 {
     eggs.AddLast(new Egg(pos));
     return(true);
 }
예제 #6
0
 public bool CreateWarrior(Position pos)
 {
     ants.AddLast(new Warrior(pos));
     return(true);
 }
예제 #7
0
 public bool CreateSpider(Position point)
 {
     spiders.AddLast(new Spider(point));
     return(true);
 }
예제 #8
0
 public bool CreateFood(Position point, int quantity)
 {
     food.AddLast(new Food(point, quantity));
     return(true);
 }
예제 #9
0
        public Map(int w, int h, Tile[,] tiles)
        {
            this._width  = w;
            this._height = h;

            this._tiles = new Tile[w, h];
            for (int x = 0; x < w; x++)
            {
                for (int y = 0; y < h; y++)
                {
                    this._tiles[x, y] = new Tile(tiles[x, y].TileType, tiles[x, y].Position);
                }
            }

            _messagesCount = new MessageCount[_width, _height];

            LIList <Tile> indoorTilesTemp  = new LIList <Tile>(),
                          wallTilesTemp    = new LIList <Tile>(),
                          outdoorTilesTemp = new LIList <Tile>();
            Tile t;

            for (int y = 0; y < this._height; y++)
            {
                for (int x = 0; x < this._width; x++)
                {
                    switch ((t = tiles[x, y]).TileType)
                    {
                    case TileType.Outdoor:
                        outdoorTilesTemp.AddLast(t);
                        break;

                    case TileType.Indoor:
                        indoorTilesTemp.AddLast(t);
                        break;

                    case TileType.Wall:
                        wallTilesTemp.AddLast(t);
                        break;
                    }
                }
            }

            if (outdoorTilesTemp.Count == 0)
            {
                throw new Exception(Properties.Resources.noOutdoorTilesError);
            }
            if (indoorTilesTemp.Count == 0)
            {
                throw new Exception(Properties.Resources.noIndoorTilesError);
            }

            _indoorTiles       = new Tile[indoorTilesTemp.Count + wallTilesTemp.Count];
            _wallTiles         = new Tile[indoorTilesTemp.Count + wallTilesTemp.Count];
            _outdoorTiles      = new Tile[outdoorTilesTemp.Count];
            _indoorTilesCount  = indoorTilesTemp.Count;
            _wallTilesCount    = wallTilesTemp.Count;
            _outdoorTilesCount = outdoorTilesTemp.Count;

            RewriteTiles(_indoorTiles, indoorTilesTemp);
            RewriteTiles(_outdoorTiles, outdoorTilesTemp);
            RewriteTiles(_wallTiles, wallTilesTemp);
        }
예제 #10
0
파일: Message.cs 프로젝트: corefan/yad2
 public void AddPointWithIntensity(Tile t, int intensity, Map map)
 {
     points.AddLast(new PointWithIntensity(t, intensity));
     map.AddMessage(this.GetMessageType, t.Position);
 }