математическое уравнение для боя

У меня есть следующий код для боя, но пользователь выиграет примерно в 99,9% случаев (проверено с 5000 случайных циклов)

У меня есть следующие переменные, которые влияют на бой

сила | защита | ловкость | повреждение | сложность портала (всегда +1 для остановки * на 0) | критический

Это то, что у меня есть до сих пор

//player variable 
//(int) player.itemDamage = 20
//(int) player.itemStr = 2
//(int) player.itemDex = 4

            int defense = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + 5) / 2, 0);
            int damage = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + player.itemDamage), 0);
            int str = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + player.itemStr), 0);
            int dex = (int)Math.Round((((portal + 1) * ((rand.NextDouble() + 0.5))) + player.itemDex), 0);
while(true)
{
for (int i = 0; i < 10; i++)
                {
                    critical += rand.NextDouble();
                }
                eHP -= (int)Math.Round((((player.itemDamage + player.itemStr) - defense) * critical) / 2, 0);
                critical = 1;

                for (int i = 0; i < 10; i++)
                {
                    critical += rand.NextDouble();
                }
                HP -= (int)Math.Round((((damage + str) - 5) * critical) / 2, 0);

                if (eHP <= 0)
                {
                    return;
                }
else if (HP <= 0)
                {
                    return;
                }
                }

Что я могу изменить в следующем коде, чтобы пользователь (HP) выигрывал в 70% случаев. Могу ли я получить некоторые предложения, пожалуйста? Я ужасно разбираюсь в алгоритмах. Изменить: хотя я хочу, чтобы пользователь выигрывал в 70% случаев, я все же хочу, чтобы он был круглым на основе урона, а не с использованием простого утверждения if (0 > 70) win else, потому что это не было бы очень интересный бой.


person Jordan Trainor    schedule 25.11.2012    source источник
comment
Объяснение было бы неплохо   -  person John Dvorak    schedule 25.11.2012
comment
Я дал всю информацию в коде, что вам нужно знать?   -  person Jordan Trainor    schedule 25.11.2012
comment
Я могу сказать вам, что он делает, но не то, что он должен делать.   -  person John Dvorak    schedule 25.11.2012
comment
Что я могу изменить в следующем коде, чтобы пользователь (HP) выигрывал в 70% случаев. Могу ли я получить некоторые предложения, пожалуйста? я ужасен в алгоритмах   -  person Jordan Trainor    schedule 25.11.2012
comment
Одно предложение: if(rand.nextDouble()<0.7) win(); else lose();   -  person John Dvorak    schedule 25.11.2012
comment
@JordanTrainor Удалите код и сделайте это снова. Пожалуйста, отредактируйте вопрос и объясните словами, какова должна быть логика.   -  person Andrei    schedule 25.11.2012


Ответы (3)


Если серьезно, понятно, почему у вас возникают проблемы с этим, исходя из того, как вы подходите к этому с кодом. Вместо этого вы должны относиться к нему как к математической функции.

Создайте чистую функцию f из набора входов (x, y, ..., z) в boolean выход. В этой функции не должно быть никакого использования rand. Если вам нужен случайный ввод, передайте его в функцию. Попробуйте сначала сделать это, не перезаписывая существующие переменные (не используйте +=/-=). Для каждого (x, y, z), f(x, y, z) всегда должен приводить к одному и тому же результату. Если вы сделаете это, должно быть довольно легко использовать математику для нахождения пропущенных значений.

person drstevens    schedule 25.11.2012

Как говорит drstevens, вашу реализацию лучше разделить на более мелкие, чистые функции.

В частности, количество потерянных очков жизни пропорционально значению critical. Код, который вы даете, не показывает значение critical при запуске цикла, но после первой итерации значение будет примерно на 5 выше при уменьшении очков жизни «врага», чем при уменьшении очков жизни «пользователя» в предыдущей итерации, потому что вы не устанавливаете его в 1 перед добавлением к нему десяти случайных чисел. Поскольку critical для пользователя обычно составляет около 11, а для врага около 6, для победы потребуется сильный враг (например, тот, у которого defence больше, чем сила пользователя и урон предмета, поэтому он получает очки жизни, если вы наносите ему удар!) .

Если бы вы написали чистую функцию, которая вычисляла бы либо critical, либо количество вычитаемых очков жизни, этой ошибки бы не произошло.

person Pete Kirkham    schedule 25.11.2012

person    schedule
comment
+1 Это прекрасно указывает на двусмысленность вопроса спрашивающего И соответствует требованиям. - person John Dvorak; 25.11.2012