Смекни!
smekni.com

Разработка модели анализа и объектно-ориентированного компонента для игры Terrarium 2.0 (стр. 2 из 2)

[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)

{

}

}

}