На сайте онлайн (человек): 87 
|  |
|
 | |
Сейчас поскриплю мозгами. Мдя... Не столько сложен расчет, сколь трудн... |  |
|  |
 | |
|
Terran Conflict (X3TC) / Форум / Форум по игре X3 Terran Conflict (X3TC) / X3 Земной конфликт / Абордаж. Продолжение.
|
| eliseeff писал(а):Сейчас поскриплю мозгами. |
| |
Мдя...
Не столько сложен расчет, сколь трудно его объяснить без построения квадратиков. С квадратиками - все довольно просто, но, блин, рисовать их... 
Итак, все сводится к двум числовым осям, на одной из которых защита (пусть будет по горизонтали), а на другой - атака. Нетрудно понять, что диагональ и все, что выше/левее - это успех, а то, что ниже/правее - провал. Диагональ причисляется к успеху, поскольку равенство показателей означает успешную прорезку.
Попытки наши представляют из себя прямоугольники, лежащие на этих числовых осях в зависимости от начальных значений атаки и защиты. Если атака больше защиты - прямоугольник вытянут вверх. Если наоборот - вытянут по горизонтали. И только если они равны, то мы получим квадрат, с которым проще всего, но об этом позже.
Ширина прямоугольника всегда равна (HullDefence(max) - HullDefence(min) + 1). Высота - (HullAttack(max) - HullAttack(min) + 1). А его площадь, соответственно, равна произведению ширины на высоту, а самое главное - это и есть количество всех возможных вариантов рандома на этом этапе, т.е это значение всегда будет нашим знаменателем в подсчете вероятности.
// Здесь и далее я сократил "Boarding" в своих названиях переменных, но смысл, думаю, понятен. Название переменной из таблицы, естественно, осталось без изменений.
Как же могут лежать эти прямоугольники? Я не придерживался пропорций, но схематично это выглядит примерно так (примерно в порядке сложности расчета):

Вариант 1. Удача стопроцентная, все поют и пляшут. Происходит, если HullAttack(min) больше или равно HullDefence(max). Считать ничего не нужно, Шанс = 100%.

Вариант 2. Гарантированный провал. Пичалька, переходящая в горюшко. Происходит, когда HullDefence(min) превышает HullAttack(max). Считать снова ничего не нужно, Шанс = 0.

Вариант 3. Квадрат. Происходит, когда HullDefence = HullAttack. Соответственно, минимальный и максимальный показатели у них тоже совпадают, поэтому считать можно только один из них, а подсчет вероятности совсем прост.


Варианты 4 и 5. Вот здесь будет уже посложнее, чем с квадратиком, но все равно ненамного. Мы с этим справимся.
Итак, с чего мы начнем, чтобы не делать лишних телодвижений? Прежде всего следует посчитать расовые и прочие модификаторы для базовых значений атаки и защиты. Берем из таблицы BoardingHullDefence, если земляне или АОГ, то удваиваем, а в случае наличия поляризатора еще и увеличиваем на 150. Полученное значение назовем HullDefence.
Теперь складываем механику двух лучших механиков и, если они в аб. капсуле, удваиваем результат. Результат назовем HullAttack.
Рассчитать пределы изменений хотя бы одного из базовых значений нам придется все равно. Ну, пусть это будет защита.
HullDefence(min) = HullDefence - [0.1*HullDefence] HullDefence(max) = HullDefence + [0.1*HullDefence] - 1
ОК. Теперь сравниваем HullDefence с HullAttack. Если они равны, то все просто. Мы получили наш квадрат из первого варианта. Главное - не забывать, что это все-таки не геометрия, а квадрат - числовой.
Довольно неплохо это проиллюстрирует довольно простая табличка:
5 | 5:1 | 5:2 | 5:3 | 5:4 | 5:5 | 4 | 4:1 | 4:2 | 4:3 | 4:4 | 4:5 | 3 | 3:1 | 3:2 | 3:3 | 3:4 | 3:5 | 2 | 2:1 | 2:2 | 2:3 | 2:4 | 2:5 | 1 | 1:1 | 1:2 | 1:3 | 1:4 | 1:5 | Атака/Защита | 1 | 2 | 3 | 4 | 5 |
|
Сколько здесь наших непроигранных результатов (ничья ведь в нашу пользу)? Да очень просто. Посчитаем А = (Атака(max) - Атака(min) + 1). Тогда наш искомый икс равен ((А2 - А) / 2 + А). А всего сколько "розыгрышей" было? А2. И какова в итоге вероятность не проиграть? ((А2 - А) / 2 + А) / А2)
Вот так и считаем: А = (HullDefence(max) - HullDefence(min) + 1)
Шанс = ((А2 - А) / 2 + А) / А2) = ... = (A + 1) / (2 * A)
И все-таки ничто мне не заменит листок бумаги с карандашом. Посидел, помусолил и упростил...
Если же HullDefence не равен HullAttack, то нам придется уже считать пределы изменения атаки.
HullAttack(min) = HullAttack - [0.1*HullAttack] HullAttack(max) = HullAttack + [0.1*HullAttack] - 1
Теперь следует определить, что все-таки больше, атака или защита и исходя из этого плясать дальше.
Если HullDefence больше HullAttack, то:
Если HullDefence(min) > HullAttack(max), то Шанс = 0; end (not happy) Если HullDefence(min) =< HullAttack(max), то переходим к этапу "считаем треугольнички" (далi буде)
Если HullDefence меньше HullAttack, то:
Если HullAttack(min) >= HullDefence(max), то Шанс = 100%; [happy]end Если же HullAttack(min) < HullDefence(max), то опять-таки переходим к этапу "считаем треугольнички" (далi буде)
А теперь, как и было обещано, считаем треугольнички.


Прямоугольники у нас хоть и не являются квадратами, но отсекаемый треугольник всегда является, так сказать, "равносторонним". И считается почти так же, как мы считали в свое время квадрат. Разница лишь в том, что в одном случае у нас треугольник (включая диагональ) является успехом, а в другом (исключая диагональ) - провалом. Начнем с первого.
Итак, если HullDefence больше HullAttack, то мы видим следующую картинку:

Несложно догадаться, что сторона треугольника равна:
А = (HullAttack(max) - HullDefence(min) + 1)
Площадь прямоугольника равна:
S = (HullDefence(max) - HullDefence(min) + 1) * (HullAttack(max) - HullAttack(min) + 1)
Тогда вероятность успеха у нас в этом случае:
Шанс = ((А2 - А) / 2 + А) / S = ... = (А2 + А) / (2 * S)
Теперь рассмотрим случай, когда HullDefence меньше HullAttack.

Здесь у нас сторона треугольника равна:
А = (HullDefence(max) - HullAttack(min) + 1)
Площадь прямоугольника по-прежнему:
S = (HullDefence(max) - HullDefence(min) + 1) * (HullAttack(max) - HullAttack(min) + 1)
А вероятность успеха:
Шанс = (S - (А2 - А) / 2) / S = ... = 1 - ((А2 - А) / (2 * S)) |
|
дерево темы → Абордаж. Продолжение.
Абордаж. Продолжение. »
Список игр
|  |
|  |
 |  |  | |
| | | |
|  |