Моногамный 2D сверху вниз AI врага
Я пытаюсь создать простой ИИ для игры сверху вниз, которая следует за игроком, но не сразу выбирает правильный путь к нему. Моим врагам нужно двигаться за 100 пикселей, прежде чем они решат сделать еще один шаг. Я собрал то, что сделал то, что хотел. Он смотрел на координаты игрока и двигался к нему, но был также шанс, что он принял другое направление.
Теперь я добавил несколько врагов через класс EnemyManager, и они, к сожалению, точно следуют за движениями друг друга. Я знаю, что это может быть связано с тем, что функция Random основана на времени ее выполнения. Как я могу это исправить?
Я также совершенно уверен, что метод, который я использую, не является эффективным:
public void decideAImovement(Vector2 heroPosition)
{
Random random = new Random();
int forwardChance = 10;
int backChance = 10;
int leftChance = 10;
int rightChance = 10;
if (position.Y > heroPosition.Y)
{
backChance += 50;
}
else if (position.Y < heroPosition.Y)
{
forwardChance += 50;
}
if (position.X > heroPosition.X)
{
leftChance += 50;
}
else if (position.X < heroPosition.X)
{
rightChance += 50;
}
backChance = random.Next(backChance);
rightChance = random.Next(rightChance);
leftChance = random.Next(leftChance);
forwardChance = random.Next(forwardChance);
int vergelijkingUD,vergelijkingLR,vergelijking;
vergelijkingUD = Math.Max(forwardChance, backChance);
vergelijkingLR = Math.Max(leftChance, rightChance);
vergelijking = Math.Max(vergelijkingLR, vergelijkingUD);
if (vergelijking == vergelijkingLR) //Left Right
{
if (vergelijkingLR == leftChance)
{
state = EnemyState.walkLeft;
}
else
{
state = EnemyState.walkRight;
}
}
else //Up Down
{
if (vergelijkingUD == backChance)
{
state = EnemyState.walkBack;
}
else
{
state= EnemyState.walkForward;
}
}
}
public void moveEnemy(Vector2 heroPosition)
{
distanceWalked += 2;
if (distanceWalked == gridDimensions || state == EnemyState.stop)
{
distanceWalked = 0;
decideAImovement(heroPosition);
}
switch (state)
{
case EnemyState.walkRight:
position.X += 2.0f;
break;
case EnemyState.walkLeft:
position.X -= 2.0f;
break;
case EnemyState.walkBack:
position.Y -= 2.0f;
break;
case EnemyState.walkForward:
position.Y += 2.0f;
break;
case EnemyState.stop:
break;
}
}