Вот возможность: для всех шагов, которые может предпринять призрак, вычислите, приблизит ли этот шаг его к Пакману. Это можно сделать с помощью Манхэттенского расстояния , которое в двумерной сетке представляет собой просто x
расстояние + y
расстояние. Затем случайным образом выберите шаг с более высокой вероятностью, назначенной тем шагам, которые фактически приблизят его.
Если у вас есть массив steps
с первыми n_closing_in
шагами, представляющими шаги, которые приблизят призрака к Пакману, тогда вы можете присвоить им общую вероятность prob_closing_in
с помощью
double total_probility = 1.;
for (int i=0; i<n_closing_in; i++) {
step_prob[i] = prob_closing_in / n_closing_in;
total_probability -= prob_closing_in / n_closing_in;
}
Затем аналогичным образом распределите то, что осталось в total_probability
, по ступеням, которые уведут призрака дальше от Пакмана.
Step random_step(Step[] possible_steps, double[] step_prob) {
double r = Math.random();
int i;
for (i=0; i<possible_steps.length(); i++) {
if (r < step_prob[i])
break;
r -= step_prob[i];
}
return possible_steps[i];
}
Если лабиринт не слишком сложен и вероятность сближения равна >.5
, призраки будут преследовать Пакмана, но случайным образом.
Повышение prob_closing_in
в сторону 1.
усложнит игру.
(Весь приведенный выше код не протестирован и может содержать ошибки. Я не слишком хорош в Java.)