Перейти к содержанию

Создание хищника в Microsoft Terrarium

Материал из Викиверситета
Основная статья: Microsoft Terrarium

Создание хищника

[править]
using System;
using System.Drawing;
using System.Collections;
using System.IO;
using OrganismBase;
//Это существо - хищник. Оно будет поджидать других существ, и, когда они попадут
//в поле его видимости, есть их.

[assembly: OrganismClass("CSharpCreatures.SimpleCarnivore")]//Название класса организма
[assembly: AuthorInformation("Your Name", "someone@microsoft.com")]//Информация об авторе

namespace CSharpCreatures 
{
    //Указание на то, что существо - хищник. 
    [CarnivoreAttribute(true)]
    // Сделаем существ достаточно большими, но не очень, чтобы быстрее размножались. 
    [MatureSize(30)]

    // Пусть существа будут скорпионами
    // Пусть они отображаются на миникарте синим цветом
    [AnimalSkin(AnimalSkinFamily.Beetle)]
    [MarkingColor(KnownColor.Blue)]

    // Сделаем существам высокий уровень атаки, среднюю скорость и зрение
    [MaximumEnergyPoints(0)]       
    [EatingSpeedPoints(0)]        
    [AttackDamagePoints(52)]     
    [DefendDamagePoints(0)]         
    [MaximumSpeedPoints(28)]        
    [CamouflagePoints(0)]           
    [EyesightPoints(20)]            
    public class SimpleCarnivore : Animal 
    {
        AnimalState targetAnimal;

        protected override void Initialize() 
        {
            Load += new LoadEventHandler(LoadEvent);
            Idle += new IdleEventHandler(IdleEvent);
        }
        void LoadEvent(object sender, LoadEventArgs e)

        {
            try 
            {
                if(targetAnimal != null) 
                {
                    //Поиск еды (животных)
                    targetAnimal = (AnimalState) LookFor(targetAnimal);
                }
            }
            catch(Exception exc) 
            {
                // При ошибках выдать сообщение
                WriteTrace(exc.ToString());
            }
        }

        void IdleEvent(object sender, IdleEventArgs e) 
        {
            try 
            {
                //Размножаться, когда возможно
                if(CanReproduce)
                    BeginReproduction(null);

                // Если существо атакует, либо передвигается, либо ест, то ничего не делать.
                if ( IsAttacking || IsMoving || IsEating ) 
                {
                    return;
                }

                // Поиск еды
                if(targetAnimal == null) 
                {
                    FindNewTarget();
                } 

                // Если найдено существо... 
                if(targetAnimal != null ) 
                {
                    // проверить живо ли оно...
                    if ( targetAnimal.IsAlive ) 
                    {
                        // если живо, то проверить, достаточно ли оно близко...
                        if ( WithinAttackingRange(targetAnimal) ) 
                        {
                            BeginAttacking(targetAnimal);//если да, то атаковать...
                        } 
                        else 
                        {
                            MoveToTarget();// иначе двигаться к цели.
                        }
                    } 
                    else 
                    {
                        // Если существо неживое, попробовать съесть его.
                        if ( WithinEatingRange(targetAnimal) ) 
                        {
                            if (CanEat) 
                            {
                                BeginEating(targetAnimal);
                            } 
                        } 
                        else 
                        {
                            //Если оно слишком далеко, то приблизиться к нему.
                            MoveToTarget();
                        }
                    }
                } 
                else 
                {
                    // Если вокруг нет существ, то оставаться на месте, и ждать их.
                    StopMoving();
                }
            } 
            catch(Exception exc) 
            {
                WriteTrace(exc.ToString());//сообщить об ошибке, если она возникнет.
            }
        }
        // Поиск существ
        void FindNewTarget() 
        {
            try 
            {
                ArrayList foundAnimals = Scan();

                // Просматриваем найденные организмы.
                if(foundAnimals.Count > 0) 
                {
                    foreach(OrganismState organismState in foundAnimals) 
                    {
                        // Если найденный организм животное, и не принадлежит к тому же виду, что и
                        // наш организм, то сделать организм целевым.
                        if(organismState is AnimalState && !IsMySpecies(organismState)) 
                        {
                            targetAnimal = (AnimalState) organismState;
                        }
                    }
                }
            }
            catch(Exception exc) 
            {
                WriteTrace(exc.ToString());//Если возникнут ошибки, сообщить о них.
            }
        }

        // Движение к цели
        void MoveToTarget() 
        {
            try 
            {
                // Если нет целевого существа, то ничего не делать...
                if ( targetAnimal == null ) 
                {
                    return;
                }

                // иначе двигаться к целевому существу.
                BeginMoving(new MovementVector(targetAnimal.Position, Species.MaximumSpeed));
            }
            catch(Exception exc) 
            {
                WriteTrace(exc.ToString()); //Если возникнут ошибки, сообщить о них.
            }
        }

        public override void SerializeAnimal(MemoryStream m) 
        {
        }

        public override void DeserializeAnimal(MemoryStream m) 
        {
        }
    }
}