Я бы выяснил, что вы хотите, чтобы шансы «гарантированного попадания» и «гарантированного промаха» были равны (то есть шансы, что котенок ударит дракона, а дракон пропустит котенка). Сохраните свой случайный результат, и перед применением различий в мощности отметьте удар, если он находится в этих пределах. Это предотвратит проблему 100% вероятности попадания / промаха ... хотя есть еще один вариант всегда предоставлять шанс попадания, подробно описано ниже.
D & D - это «плоская» система, где вероятность равномерно распределена по возможным результатам броска. Другие системы используют более искривленное распределение, обычно достигаемое путем бросания нескольких кубиков и добавления их. Довольно просто создать такую кривую (на ум приходит rand () + rand ()) / 2).
Другая возможность - это «взрывающаяся кость». В таких системах, как Shadowrun и Savage Worlds, бросание максимально возможного результата броска позволяет вам перебросить этот бросок и добавить новый результат. В вашей игре вы должны проверить, был ли ваш случайный результат выше определенного порогового значения, и если это так, снова выполнить бросок. Если вы позволите кости взорваться на неопределенный срок, то даже у самого низкого гоблина есть шанс ударить бога, и вам не нужна явная механика «гарантированного удара».
Таким образом, один из возможных подходов с изогнутым броском, гарантированным шансом пропадания и взрывом игральных костей будет выглядеть примерно так:
function getRoll():Number
{
var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
return result;
}
function attackHits():Boolean
{
var roll:Number = getRoll();
if(roll < 0.25) return false; //Guaranteed chance of miss
else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
(player.luck - enemy.luck) + roll) >= 10; //Your original test.
}
Конечно, это не проверено и не сбалансировано; Вы хотели бы настроить все эти магические числа, пока они не почувствовали себя хорошо.
Что касается дословного копирования правил, то здесь есть юридические и этические проблемы. Вы прекрасно черпаете вдохновение из D & D и других настольных игр; Вот как все они были разработаны в первую очередь. Вам также не нужно показывать игроку, как именно работают правила, и вы можете обнаружить, что использование плавной кривой кости с плавающей запятой дает лучшее ощущение, чем ограничение себя целочисленными ограничениями физических кубиков.
Я предполагаю, что это вопрос баланса игры, а не вопрос кодирования, и есть много способов справиться с этим. Из вашего существующего алгоритма, я подозреваю, что вы делаете его более сложным, чем должно быть (три атрибута И случайное число создают чрезвычайно грязную систему с точки зрения игрока). Мой первый инстинкт - это упрощение!
Любимые атрибуты, которые делают несколько вещей, а не результаты, которые определяются несколькими атрибутами. DEX прекрасно работает как основной фактор вероятности попадания; добавление всего остального лишь усложняет баланс. Подумайте об этом следующим образом: ожидаемый урон игрока при каждом попадании - это его процент попадания, умноженный на его средний урон при попадании. Как вы планируете рассчитать «ожидаемый» или «типичный» процент попадания с таким количеством переменных?
Я вижу еще одну проблему, которая заключается в том, что ваша формула не масштабируется, и это, вероятно, то, что вы испытываете. Если предположить, что DEX, LUCK и SPEED имеют тенденцию к увеличению в течение игры, различия между игроком и монстром в этих показателях также будут увеличиваться. Например, если DEX ранней игры игрока находится в диапазоне от 4 до 6, и монстры тоже, это модификатор попадания на 10-20%. Если на более поздних стадиях игры диапазон больше похож на 10-20, то это модификатор до 100%.
Один из способов исправить это - сохранить статистику. Диапазоны игроков и монстров одинаковы на протяжении всей игры, и получить что-то вроде +1 DEX - огромное дело, крайне редкое явление, и к нему относятся так (если оно вообще существует). Тогда ваша формула будет отлично работать на протяжении всей игры, и вы увидите, что игрок с примерно одинаковым шансом попадания в течение всей игры.
Другой способ состоит в том, чтобы изменить это жестко закодированное «10» для масштабирования с уровнем, так что, возможно, это «10 + уровень монстра» или «10 + уровень подземелья» или что-то, что вызывает небольшое увеличение сложности по мере прохождения игры, если игрок не повысит уровень их статистика соответственно.
Третий способ, как уже говорили другие, состоит в том, чтобы установить жесткие ограничения на самый высокий и самый низкий допустимый процент попаданий и просто сказать «если вычисленное значение меньше X, используйте вместо него X».
Для полноты картины я укажу, что не существует абсолютного закона, согласно которому вы ДОЛЖНЫ включать бросок на попадание в первую очередь. Действие в игре, которая неэффективна, не особенно увлекательно и не добавляет опыта, за исключением редких случаев. Альтернатива состоит в том, чтобы позволить игрокам ВСЕГДА наносить удары и просто возиться с диапазоном урона, чтобы иногда они наносили гораздо меньше урона, чем другие. Помните, что сложные системы более интересны для дизайнера, чем для игрока.
источник
Возможно, вы захотите добавить критические удары (обычно не можете пропустить, бонусный урон) и критические промахи (постоянный шанс пропустить, несмотря ни на что, возможно, ошеломляет игрока).
источник
Во многих играх используется пятипроцентное изменение попадания независимо от всех факторов в дополнение к обычной формуле попадания.
источник