Я предполагаю, что это вопрос баланса игры, а не вопрос кодирования, и есть много способов справиться с этим. Из вашего существующего алгоритма, я подозреваю, что вы делаете его более сложным, чем должно быть (три атрибута И случайное число создают чрезвычайно грязную систему с точки зрения игрока). Мой первый инстинкт - это упрощение!
Любимые атрибуты, которые делают несколько вещей, а не результаты, которые определяются несколькими атрибутами. DEX прекрасно работает как основной фактор вероятности попадания; добавление всего остального лишь усложняет баланс. Подумайте об этом следующим образом: ожидаемый урон игрока при каждом попадании - это его процент попадания, умноженный на его средний урон при попадании. Как вы планируете рассчитать «ожидаемый» или «типичный» процент попадания с таким количеством переменных?
Я вижу еще одну проблему, которая заключается в том, что ваша формула не масштабируется, и это, вероятно, то, что вы испытываете. Если предположить, что DEX, LUCK и SPEED имеют тенденцию к увеличению в течение игры, различия между игроком и монстром в этих показателях также будут увеличиваться. Например, если DEX ранней игры игрока находится в диапазоне от 4 до 6, и монстры тоже, это модификатор попадания на 10-20%. Если на более поздних стадиях игры диапазон больше похож на 10-20, то это модификатор до 100%.
Один из способов исправить это - сохранить статистику. Диапазоны игроков и монстров одинаковы на протяжении всей игры, и получить что-то вроде +1 DEX - огромное дело, крайне редкое явление, и к нему относятся так (если оно вообще существует). Тогда ваша формула будет отлично работать на протяжении всей игры, и вы увидите, что игрок с примерно одинаковым шансом попадания в течение всей игры.
Другой способ состоит в том, чтобы изменить это жестко закодированное «10» для масштабирования с уровнем, так что, возможно, это «10 + уровень монстра» или «10 + уровень подземелья» или что-то, что вызывает небольшое увеличение сложности по мере прохождения игры, если игрок не повысит уровень их статистика соответственно.
Третий способ, как уже говорили другие, состоит в том, чтобы установить жесткие ограничения на самый высокий и самый низкий допустимый процент попаданий и просто сказать «если вычисленное значение меньше X, используйте вместо него X».
Для полноты картины я укажу, что не существует абсолютного закона, согласно которому вы ДОЛЖНЫ включать бросок на попадание в первую очередь. Действие в игре, которая неэффективна, не особенно увлекательно и не добавляет опыта, за исключением редких случаев. Альтернатива состоит в том, чтобы позволить игрокам ВСЕГДА наносить удары и просто возиться с диапазоном урона, чтобы иногда они наносили гораздо меньше урона, чем другие. Помните, что сложные системы более интересны для дизайнера, чем для игрока.