Расчет итогов сражения
| |
wcpt | Дата: Понедельник, 19 Ноября 2012, 19:35 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Не нашел, куда еще задать подобный вопрос. Делаю свою игру - пошаговую стратегию. Вот допустим, идет сражение, которое игрок контролировать не может. В одном отряде например, 100 юнитов одного типа, и 50 другого. При этом первый юнит в два раза сильнее второго. В другом отряде 500 и 300 юнитов соответственно. Кроме того, есть несколько факторов, влияющих на исход сражения - боевой дух и проч. Как же все-таки рассчитать исход сражения? Вот например 100*2+50*1=450 - "сила" первого отряда, 500*2 + 300*1 = 1300 - сила второго отряда - как считать, сколько юнитов останется у каждого отряда после сражения? Я пробовал уменьшать кол-во вот так:
сила2/кол-во1 - некоторое значение "удельной силы" для первого отряда
сила1/кол-во2 -для второго
ну и затем
кол-во1 юнитов первого типа -= (сила2/кол-во1)*кол-во1 юнитов первого типа/кол-во1
так же и со вторым, в конце округлить значения - потом по результатам потерь уменьшить боевой дух, тот у кого его значение меньше критического - проиграл.
Только такой расклад мне не подходит - исход сильно зависит от "входного" количества!
|
|
| |
wcpt | Дата: Понедельник, 19 Ноября 2012, 19:58 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| неправильно? Как же тогда?
|
|
| |
noname | Дата: Понедельник, 19 Ноября 2012, 22:29 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Quote (wcpt) Как же все-таки рассчитать исход сражения? это можно сделать очень по-разному. оригинальная система боя может стать изюминкой стратегической игры.
1-й вариант
исходя из заданных условий, могу предложить следующее(допустим, сторона А атакует сторону Б): 1. если у стороны А осталось 10 или менее солдат, то выбираем их всех, иначе- выбираем наугад 10-ть солдат стороны А 2. если у стороны Б осталось 10 или менее солдат, то выбираем их всех, иначе- выбираем наугад 10-ть солдат стороны Б 3. подсчитываем суммарную силу выбранных солдат стороны А и прибавляем бросок шестигранного кубика 4. подсчитываем суммарную силу выбранных солдат стороны Б и прибавляем бросок шестигранного кубика 5. если полученное число стороны Б больше, чем А, то погибают все выбранные солдаты стороны А, иначе погибают все выбранные солдаты стороны Б. 6. если живые солдаты ещё есть у обоих сторон, то к п1, иначе- кто-то уже победил))
я попробовал учесть всё что можно было понять об игре: сила солдат 1,2.., численность солдат измеряется десятками и сотнями, и т п.
в пп3 и 4 можно так же учесть и любые модификаторы. если хочется, чтобы боевой дух изменялся в ходе боя, то его можно изменять по результатам проверки в п5.
при данном алгоритме атакующая сторона имеет незначительное преймущество(в случае равенства сил случайно выбранных солдат, погибнут солдаты стороны Б).
да, и ещё один важный момент: в моей системе боя качественный состав отряда в-общем, важнее количества. дело в том, что играя в самых первых WarLords я выигрывал, клепая только самых дешёвых солдат. при моей системе боя так не получится, наоборот- важно иметь как можно б0льший процент высокоуровневых солдат.
доходит даже до неприятной крайности: отряд из 10-ти солдат силы N не может быть разбит отрядом никакой численности, в котором все солдаты имеют меньшую силу. чтобы сгладить этот эффект, можно вместо шестигранника кидать 20-ти гранник(случайное число от 1до20). так, пожалуй, будет лучше. впрочем- это целиком зависит от конкретной задумки, под которую подгоняется алгоритм.
------------------------------------------
2-й вариант
в качестве альтернативного варианта могу предложить совсем простую систему боя(отряд А атакует отряд Б): 1. пусть SA= суммарная сила всего отряда А(с учётом всех эффектов) 2. пусть SB= суммарная сила всего отряда Б(с учётом всех эффектов) 3. пусть RA= случайное число от 1 до SA включительно 4. пусть RB= случайное число от 1 до SB включительно 5. если RA<RB, то весь отряд А погибает, иначе- весь отряд Б погибает.
в данном случае бой всегда отыгрывается за 1раунд, и выйгравшая сторона не имеет потерь.
---------------------------------------------------------------
3-й вариант даёт хорошее преймущество более многочисленному отряду, но просчёт для тысяч солдат может оказаться слишком долгим:
отряд А атакует отряд Б. солдаты в отрядах могут иметь уровни,(силу) от 1до10: 1. выбираем наугад одного из солдат, участвующих в сражении (с б0льшей вероятностью это окажется солдат той стороны, у которой бойцов больше). 2. выбираем наугад одного из солдат другой стороны 3. прибавляем к уровню каждого солдата по шестигранному кубику 4. если у первого солдата(из п1) получившееся число больше или равно, то солдат противника погибает, иначе- никто не погибает.(суть этого пункта в том, чтобы дать преймущество более многочисленной стороне: выбранный в п1 солдат атакует, без боязни быть убитым). 5. если выжившие солдаты есть у обеих сторон, то - к п 1.
-------------------------------------------------------------------------------
и, да- это всё я выдал не особенно думая. для использования в игре, любой из предложенных вариантов придётся допиливать, а лучше- придумать на их основе свой.
можно придумать и совсем другие системы боя.
все правила форумной игры Дуэль Программистов
Сообщение отредактировал noname - Понедельник, 19 Ноября 2012, 22:54 |
|
| |
SEvg | Дата: Вторник, 20 Ноября 2012, 17:35 | Сообщение # 4 |
Алхимик
Сейчас нет на сайте
| Quote (noname) это можно сделать очень по-разному. оригинальная система боя может стать изюминкой стратегической игры. Согласен!!!
Можно добавить учет рельефа... Можно добавить такую фишку, что чем больше количество солдат в отряде, тем они становятся менее эффективными (мешают друг другу)... Элемент случайности я бы сделал в пределах 20%, чтоб всё таки результат был ожидаем...
|
|
| |
wcpt | Дата: Вторник, 20 Ноября 2012, 19:09 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| да добавить можно все, что угодно - но будет ли это работать? Забыл добавить - некоторые способы просто не будут нормально работать - например, если юнитов очень много(у меня так и есть!) Вот например: есть пехота, тяж. пехота, лучники, кавалерия и какой-нибудь спец. отряд, который добавляет немного "случайности". Пехота хороша против всех, кроме кавалерии и тяжелой пехоты, тяжелая пехота хороша против всех, кроме лучников, лучники хороши против тяжелой пехоты, но их уделывает кавалерия, кавалерия косит лучников и пехоту,спец отряд слаб против всех, но добавляет всем друзьям боевой дух. Если участников битвы очень много, то учет всего этого для каждого воина посредством перебора, понятное дело, мне не подходит. Можно подсчитать общее колво участников, взять какое либо число из них, по соотношению численности подсчитать долю каждого типа участника каждого отряда, подсчитать мощь той и той группы, и производить расчет до тех пор, пока боевой дух какого-либо отряда не достигнет критического значения, сражаться! Затем, уцелевшие в этой битве как бы становятся "отработанными" и выделяется следующая группа, и так пока все единицы всех отрядов не отработаются. У кого боевого духа меньше - проиграл. Я пытался так сделать, но результаты меня совсем не удовлетворили, что же я делал не так?
Добавлено (20.11.2012, 19:09) --------------------------------------------- Вот еще как я сделал - подсчитал отношение силы второго отряда к кол-ву первого, потом подсчитал долю юнитов опр. типа во всем отряде, отношение помножил на соотношение силы/кол-ва и уменьшил кол-во на это значение. Все бы ничего, но иногда выходит, что если численность войск отрядов не равна приблизительно, то численность меньшего отряда уменьшается слишком быстро и он мало чем может навредить другому отряду, даже если соотношение, допустим, 4/3. Как же быть?
Сообщение отредактировал wcpt - Вторник, 20 Ноября 2012, 19:12 |
|
| |
SEvg | Дата: Вторник, 20 Ноября 2012, 19:32 | Сообщение # 6 |
Алхимик
Сейчас нет на сайте
| Ввести какие то константы, которые будут корректировать итоги. Некоторые цифры которые будут подобраны опытным путём. Желательно провести тысячи тестов, с разным раскладом сил, чтоб достичь нужной сбалансированности. Баланс в стратегической игре - одна из важнейших составляющих. А что мешает вести расчёты для каждого юнита? Ведь современные процессоры в состоянии просчитать исход сражения для миллионов юнитов за несколько секунд... А тут речь о сотнях
Пробовать, пробовать и пробовать... Всё время поправляя баланс, пока результат не будет радовать глаз.
Да, я бы ещё добавил арбалетчиков и тяж. кавалерию.
Сообщение отредактировал SEvg - Вторник, 20 Ноября 2012, 19:34 |
|
| |
wcpt | Дата: Вторник, 20 Ноября 2012, 20:25 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| блин, ну знал бы я, как все это корректировать надо для лучшего баланса, вопрос бы не стоял! А так... Насчет арбалетчиков и проч. - с радостью бы добавил, если бы имелась возможность сделать бой намного более гибким и с возможностью просчета, кто на кого напал - арбалетчик на пехотинца, али наоборот
|
|
| |
noname | Дата: Вторник, 20 Ноября 2012, 20:32 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| поразмыслив на досуге, я придумал более хороший вариант: пусть из отряда А выбирается случайное число бойцов(от 1 до всех), и так же из отряда Б. затем силы выбранных групп сравниваются, и проигравшая группа погибает. ну и так далее- до победы одного из отрядов. этот алгоритм хорош тем, что в этом варианте один высокоуровневый боец уже не сможет раскидывать тысячи врагов, как в вариантах 1 и 2. а кроме того этот алгоритм адекватно работает как для единиц бойцов, так и для тысяч. пока что из всех предложенных мной вариантов, этот мне нравится больше всего.
Quote (wcpt) Пехота хороша против всех, кроме кавалерии и тяжелой пехоты, тяжелая пехота хороша против всех, кроме лучников, лучники хороши против тяжелой пехоты, но их уделывает кавалерия, кавалерия косит лучников и пехоту,спец отряд так это же совсем другой компот! изначально речь шла про то, что бойцы различаются только силой(уровнем), и ты даже пытался вычислять там что-то по формулам. а теперь оказывается вот такое дело. сходу дать хороший алгоритм затрудняюсь, так как в этом случае попросту невозможно сравнить силы двух отрядов(сила лучника зависит от того, на кого конкретно он нападает- на кавалериста или на тяжёлого пехотинца). а если выбирать солдат наугад и сравнивать попарно, то такой алгоритм может оказаться слишком долгим. короч- тут есть над чем подумать. мож отвечу на днях, если что придёт в голову.
Quote (wcpt) Я пытался так сделать, но результаты меня совсем не удовлетворили, что же я делал не так? ну, ты мог бы показать в разделе, посвящённом соответствующему языку/платформе, как работает то, что ты сделал, и что именно тебя не удовлетворяет. и получить совет.
Quote (SEvg) А что мешает вести расчёты для каждого юнита? Ведь современные процессоры в состоянии просчитать исход сражения для миллионов юнитов за несколько секунд попробуй как-нибудь прокрутить хотя бы пустой цикл на несколько миллионов операций на каком-нибудь современном процессоре...
все правила форумной игры Дуэль Программистов
Сообщение отредактировал noname - Вторник, 20 Ноября 2012, 20:33 |
|
| |
wcpt | Дата: Вторник, 20 Ноября 2012, 20:36 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| наверно все это нужно считать относительно доли опр. типа юнита в отряде. Допустим, если пехоты половина, то шанс встретить пехотинца строго говоря, 1/2+- случайность, шансы встретить других правятся так же в соотв. с этой случайностью+-случайность. С другой стороны, этот пехотинец может встретиться с юнитом другого отряда по аналогичной схеме.
Сообщение отредактировал wcpt - Вторник, 20 Ноября 2012, 20:39 |
|
| |
SEvg | Дата: Вторник, 20 Ноября 2012, 22:33 | Сообщение # 10 |
Алхимик
Сейчас нет на сайте
| Quote (noname) Quote (SEvg) А что мешает вести расчёты для каждого юнита? Ведь современные процессоры в состоянии просчитать исход сражения для миллионов юнитов за несколько секунд попробуй как-нибудь прокрутить хотя бы пустой цикл на несколько миллионов операций на каком-нибудь современном процессоре... Пустой цикл, компилятор скорее всего выкинет... Но я крутил цикл со сложением, умножением и т.д. Короче простые операции, на 30 миллионов раз, селерон на 1.7, укладывался (менее чем в секунду). С тех пор процессоры подросли Так что можно, на десятки тысяч бойцов пересчитать (правда за конструкторы и бейсики не поручусь...)
|
|
| |
atoris | Дата: Суббота, 24 Ноября 2012, 16:32 | Сообщение # 11 |
участник
Сейчас нет на сайте
| здравствуйте, не знаю может нашли решение данной проблемы, я нашел руководство по расчету урона для игры герои меча и магии с разными формулами, может пригодиться. http://heroes.ag.ru/heroes5/advices/01/
Вступайте в групу
|
|
| |
wcpt | Дата: Суббота, 24 Ноября 2012, 17:13 | Сообщение # 12 |
постоянный участник
Сейчас нет на сайте
| Спасибо, пригодится!
|
|
| |
|