Как обнаружить агрессивность игрока в игре? - PullRequest
3 голосов
/ 16 апреля 2009

Я пишу игру для продвинутого игрока и реализую базовый ИИ в форме бинарного дерева поиска. Есть 1 человек-игрок и 1 компьютерный игрок. Мне нужно найти способ сказать, насколько агрессивно человек атакует компьютер. Человек нажмет кнопку для атаки (и должен находиться в определенном радиусе от компьютера), поэтому моей первой мыслью было увидеть, насколько велико количество атак по сравнению с количеством итераций, которые прошел мой основной цикл while , Это кажется плохим способом сделать это, потому что это число будет зависеть от частоты кадров, которая может колебаться. У кого-нибудь есть идеи для лучшего способа сделать это?

Ответы [ 4 ]

13 голосов
/ 16 апреля 2009

Почему бы просто не вести подсчет количества моментов, когда игрок-человек может атаковать компьютер-плеер? Я имею в виду, что вы, очевидно, должны проверить, находится ли он в диапазоне, так почему бы не проверить, находится ли он в диапазоне, и если он есть, увеличить счетчик could_have_attacked. Затем, если он действительно атакует, увеличьте счетчик attacked. Затем вы можете сравнить, как часто игрок атакует, как часто он имеет такую ​​возможность.

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

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

1 голос
/ 16 апреля 2009

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

0 голосов
/ 16 апреля 2009

Я думал о чем-то вроде подсчета среднего времени между боями и подсчета средней скорострельности в бою. Для этого вам понадобится 5 переменных, например:

float avgTimeWithoutCombat;
float currentTimeWithoutCombat;

float avgRateOfFire;
int shotsFired;
float combatTimeElapsed;

Пока игрок не сражается, вы учитываете "мирное" время в currentTimeWithoutCombat. Когда он выстрелит, добавьте его в avgTimeWithoutCombat и разделите его на 2, чтобы получить среднее значение.

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

Теперь у вас есть два значения для измерения агрессивности игрока:

  • avgTimeWithoutCombat: чем больше это число, тем менее агрессивен игрок.
  • avgRateOfFire: чем больше это число, тем агрессивнее игрок.
0 голосов
/ 16 апреля 2009

Для этого вы можете использовать псевдослучайный генератор. Допустим, у вас есть функция rnd (), которая возвращает значение от 0 до 1 - большее значение соответствует большей агрессивности. Вы вводите коэффициент от 0 до 1. Каждый раз, когда вам нужно определить, будет ли персонаж атаковать, вы вызываете rnd () и сравниваете значение с коэффициентом. Если оно больше - атакуй, иначе нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...