Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > [PHP] Небольшая формула


Автор: Baltazar5000 22.1.2010, 19:41
Имеется такое распределение:

количество воинов / их очки / общая сумма очков

например:

Стрелки                     Ракетчики                      Итп
10/5/50                       10/10/100                  5/20/100

Общий урон составил 117 очков(2 очка в конце можно отбросить)
Надо высчитать кто рандомным образом погиб.
Т.е. в данном случае 5 Итп 3 Стрелка или 3 Итп 5 Ракетчиков 1 стрелок.

Как реализовать данный алгоритм? Мучаюсь вторые сутки. Можно сделать примитивно без рандома. Заранее благадарю.

Автор: bars80080 22.1.2010, 19:59
по-моему, данная задача не имеет практической плоскости применения. то есть алгоритм составлен задом наперёд.
должно вначале определяться у кого какой урон, а затем суммироваться общее количество очков урона

Автор: skyboy 22.1.2010, 20:03
алгоритмическое предложение. я так понимаю, как раз с этим проблема, а не с арифметическими операциями "вычесть" и "разделить".
а у каждого типа нет своего показателя "защита"? тогда было бы не "рандомно погиб", а ущерб распространялся бы на группы войск обратнопропорционально мощности защиты. если же нет такого показателя, то следует определиться, какова конечная цель искомого алгоритма: минимальное количество погибших юнитов(сначала погибают самые живучие), "справедливость"(урон распределяется по всем группам пропорционально количеству юнитов), "полнота ущерба"(т.е. "израсходовать" все очки урона - так, чтоб минимизировать значение урона,"пропавшее впустую" - т.н. "задача о размене денег"), "сначала умирают самые слабые".
короче, мне кажется, что вариантов рассчета множество. впрочем, в РПГ я практически не играю. Возможно, там имеется некий "стандарт" рассчета урона.

Автор: Baltazar5000 23.1.2010, 17:35
skyboy, Ты говоришь правильные вещи =)) Но что-то я не могу сообразить чтоделать со всеми этими характеристиками (защита, атака, скорость и т.д.) можешь предложить конкретную формулу?

bars80080,  Видно ты не совсем меня понял) Каждый юнит составляет нное количество очков. По куче юнитов нанесли определённый урон в очках. Нужно вычесть рандомом кто погиб.

Вообще, на данной стадии развития проекта мне бы подощёл вариант "сначала погибают самые живучие" или наоборот. Конечно рандом интереснее. Кто может предложить решение данной задачи?

Автор: skyboy 24.1.2010, 00:09
Цитата(Baltazar5000 @  23.1.2010,  16:35 Найти цитируемый пост)
можешь предложить конкретную формулу?

нет, тебе нужна не формула. формула - это для рассчета чего-то. а последовательность действий: выбрать, вычесть, уменьшить общее количество - это уже алгоритм.
случайность будет бессмысленна, мне кажется. есть один танк и 10 лучников. урон таков, что танк не погибнет. разве это логично: бомбили клетку, выжили все лучники, только у танка здоровье немного уменьшилось? все же вариант с учетом "защиты" мне как-то логичнее кажется.
а насчет "предложить": что тут предлагать?
есть значение урона. есть набор элементов, разного здоровья и количества в каждой группе.
выберем стратегию "первыми погибают самые живучие". 
0. сортируем группы по значению здоровья одной единицы, чтоб проще было обрабатывать.
1. находим группу, с максимальным значением здоровья одной единицы, но так, чтоб это значение было меньше значения урона.
2. вычисляем количество "убитых" юнитов, уменьшаем значение урона и количество юнитов в соответствующей группе
3. если оставшееся значение урона меньше значения здоровья самой хилой единицы, прекращаем рассчет. если больше, повторяем с пункта 1.
недостаток - часть урона будет "пропадать". чтоб компенсировать этот недостаток(который не в алгоритме: такое будет при любой стратегии рассчета, если значенеи урона будет меньше количества здоровья самой слабой единицы) есть вариант, который лично я наблюдал в "героях меча и магии": у каждой армии есть кроме параметра "живучесть одной единицы" ещё параметр "здоровье недобитой единицы". типа, 10 танков по 100 единиц здоровья, но у 11 единицы как будто здоровья только 5 единиц осталось. Малейший урон - и из 11 танков остается 10.
в таком случае, урон не будет "пропадать впустую"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)