Разработка модели поведения животного




Описание поведения животного

 


Сбор и анализ статистики животного

 


Заключение

 

В рамках данного курсового проекта была поставлена задача разработки компонента для игры Microsoft Terrarium, который моделирует поведение животного–травоядного. При этом основным моментом являлось возможность собираться в стада с выделением вожака на основе опыта.

После разработки было проведено тестирование животного. Во время тестирования собиралась статистика по численности живых организмов на данный момент, количеству организмов, когда-либо существовавших в экосистеме, количеству убитых организмов, количеству умерших от старости.


Список литературы

 

1. The Terrarium Ecosystem Overview – материалы страницы https://www.windowsforms.net/Terrarium

2. Фаулер М., Скотт К. UML. Основы. – Пер. с англ. – СПб: Символ-плюс, 2002. – 192 с., ил.

3. Марков С.М., Шалыто А.А.Система управления травоядным существом для игры «Terrarium».С.П.,2003: Санкт-Петербургский государственный институт точной механики и оптики, кафедра «Компьютерные технологии».

4. Нейгель, Кристиан, Ивьен, Билл, Глин, Джей, и др. C# для профессионалов. – М.: Издательский дом «Вильямс», 2006 – 1376 с.

5. Ларман, Крег. Применение UML и шаблонов проектирования. 2-е издание. – М.: Издательский дом «Вильямс», 2004. – 624 с.

 

 


Приложение

Листинг

using System;

using System.Collections;

using System.Drawing;

using System.IO;

using OrganismBase;

 

[assembly: OrganismClass("Exercise1.MyAnimal")]

[assembly: AuthorInformation("Юра", "YuG.Ermolaev@vorkuta.ru")]

 

namespace Exercise1

{

[Carnivore(false)]

[MatureSize(28)]

[AnimalSkin(AnimalSkinFamily.Beetle)]

[MarkingColor(KnownColor.Yellow)]

 

[MaximumEnergyPoints(14)] // Максимальное количество энергии

[EatingSpeedPointsAttribute(0)] // Скорость еды

[AttackDamagePointsAttribute(0)] // Ущерб,наносимый противнику при атаке

[DefendDamagePointsAttribute(0)] // Эффективность защиты

[MaximumSpeedPointsAttribute(18)] // Максимальная скорость

[CamouflagePointsAttribute(18)] // Умение прятаться

[EyesightPointsAttribute(50)] // Дальнозоркость

 

// CLASS


public class MyAnimal: Animal

{ private PlantState targetPlant = null; // Растение

// private AnimalState targetAnimal = null; // Животное

AnimalState attackerAnimal = null; // Кто атакует

const int cruisingSpeed = 5; // Скорость нормального хода

const int fleeingSpeed = 40; // Скорость при беге

 

protected override void Initialize()

{Idle += new IdleEventHandler(IdleEvent);

// Load += MyAnimal_Load;

Attacked += new AttackedEventHandler(AttackedEvent);

MoveCompleted += new Move Completed Event Handler(Move Completed Event);

}

 

// // Загрузка организма

// private void MyAnimal_Load(object sender, LoadEventArgs e)

// {

// }

 

void IdleEvent(object sender, IdleEventArgs e)

{ try

{ MyWriteTrace();

if (CanReproduce)

{ WriteTrace("Я размножаюсь");

BeginReproduction(null);

}

// Если мы можем есть и имеем еду, то мы едим

if (CanEat)

{ WriteTrace("Я голодный.");

if (!IsEating)

{ WriteTrace("Нет еды: Ищем еду?");

if (targetPlant!= null)

{ WriteTrace("Да, я вижу еду.");

if (WithinEatingRange(targetPlant))

{ WriteTrace("Имеем еду, старт поедания.");

BeginEating(targetPlant);

if (IsMoving)

{ WriteTrace("Остановимся, пока едим.");

StopMoving();

}

}

else

{ if (!IsMoving)

{ WriteTrace("Перемещаемся к еде");

BeginMoving(new MovementVector(targetPlant.Position, cruisingSpeed));

}

}

}

else

{WriteTrace("Не могу найти растение.");

if ((!ScanForTargetPlant())&&(!TraceScan()))

if (!IsMoving)

{if (!TraceScan())

{int RandomX = OrganismRandom.Next(0, WorldWidth - 1);

int RandomY = OrganismRandom.Next(0, WorldHeight - 1);

BeginMoving(new MovementVector(new Point(RandomX, RandomY), cruisingSpeed));

}


}

else

{WriteTrace("Перемещаемся и смотрим...");

}

}

}

else

{

WriteTrace("О! Еда.");

if (IsMoving)

{ WriteTrace("Остановимся пока кушаем.");

StopMoving();

}

}

}

else

{ WriteTrace("Воот: ничего не делаем.");

if ((IsMoving)&&(!TraceScan()))

StopMoving();

TraceScan();

}

}

catch (Exception exc)

{ WriteTrace(exc.ToString());

}

// if (!IsMoving)

// {

// Int32 RandomX = OrganismRandom.Next(0, WorldWidth - 1);

// Int32 RandomY = OrganismRandom.Next(0, WorldHeight - 1);

// BeginMoving(new MovementVector(new Point(RandomX, RandomY), 4));

// }

// else

// {

// };

}

 

void MyWriteTrace()

{ WriteTrace("Мой возраст = ", State.TickAge, " хода."); }

 

private bool ScanForTargetPlant()

{ try

{ ArrayList foundCreatures = Scan();

// TraceScan();

if (foundCreatures.Count > 0)

{ // Всегда двигаемся подле самого близкого растения или ремовим его

foreach (OrganismState organismState in foundCreatures)

{ if (organismState is PlantState)

{ targetPlant = (PlantState)organismState;

BeginMoving(new MovementVector(organismState.Position, cruisingSpeed));

return true;

}

}

}

}

catch (Exception exc)

{ WriteTrace(exc.ToString());

}

return false;

}

 

// Вызывается, когда существо было атаковано

void AttackedEvent(object sender, AttackedEventArgs e)

{

if (e.Attacker.IsAlive)

{ Vector newVector = Vector.Subtract(attackerAnimal.Position,Position);

Vector newPositionVector = newVector.Scale(10);

Point newPosition = Vector.Add(Position, newPositionVector);

BeginMoving(new MovementVector(newPosition, fleeingSpeed));

}

}

 

// Запускается, когда закончили двигаться.

private void MoveCompletedEvent(object sender, MoveCompletedEventArgs e)

{ TraceScan();

}

 

private bool TraceScan()

{ WriteTrace("СКАНИРУЮ():");

ArrayList OrgArr = Scan();

Int32 ii=0;

Int32 Tick = State.TickAge;

for (Int32 I = 0; I < OrgArr.Count; I++)

{ OrganismState Org = OrgArr[I] as OrganismState;

String S;

if (Org is PlantState)

S = "Растение ";

else

{

if ((Org as AnimalState).AnimalSpecies.IsCarnivore)

S = "Хищник ";

else

{ WriteTrace("Смотрю кто старше");

if (((Org as AnimalState).TickAge > Tick) && (Org.Species.IsSameSpecies(this.Species)))

{ ii = I;

Tick = (Org as AnimalState).TickAge;

}

S = "Травоядный ";

}

}

WriteTrace(S);

}

if (Tick > State.TickAge)

{ WriteTrace("Вижу вожака на основе опыта. Иду следом");

OrganismState Org = OrgArr[ii] as OrganismState;

BeginMoving(new MovementVector((Org as AnimalState).Position, cruisingSpeed));

return true;

}

else

{ return false;

}

}

 

public override void SerializeAnimal(MemoryStream m)

{

}

 

public override void DeserializeAnimal(MemoryStream m)

{

}

 

}

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-10-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: