Я рекомендую прогрессивную процентную систему, например Blizzard: http://www.shacknews.com/onearticle.x/57886
Как правило, вы запускаете RNG, затем сравниваете его к значению для определения успеха или нет. Это может выглядеть так:
if ( randNumber <= .2 ) {
//Critical
} else {
//Normal
}
Все, что вам нужно сделать, это добавить прогрессивное увеличение базового шанса ...
if (randNumber <= .2 + progressiveChance ) {
progressiveChance = 0;
//Critical
} else {
progressiveChance += CHANCE_MODIFIER;
//Normal hit
}
Если вам нужно, чтобы он был более причудливым его довольно легко добавить больше. Вы можете ограничить количество, которое progressiveChance может получить, чтобы избежать 100% -ной критической вероятности или сбросить его на определенные события. Вы также можете увеличить progressiveChance в меньших количествах с каждым повышением с помощью чего-то вроде progressiveChance + = (1 - progressiveChance) * SCALE, где SCALE & lt; 1.
делегат А является именованным типом, который определяет конкретный вид метода. Так же, как определение класса размечает всех участников для данного вида объекта, который это определяет, делегат размечает сигнатуру метода для вида метода, который это определяет.
На основе этого оператора, делегат является указателем функции, и он определяет то, на что похожа та функция.
яркий пример А для приложения реального мира делегата Предикат . В примере из ссылки Вы заметите тот Массив. Найдите , берет массив для поиска и затем предикат для обработки критериев того, что найти. В этом случае это передает метод ProductGT10, который соответствует подписи Предиката.
Одно общее использование делегатов к универсальным Спискам через делегатов Действия (или его анонимный эквивалент) для создания короткой foreach операции:
myList.Foreach( i => i.DoSomething());
я также нахожу делегата Предиката довольно полезным в поиске или сокращении Списка:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
я знаю, что Вы не сказали требуемого кода, но я нахожу легче выразить его полноценность через код.:)
События привязки к Обработчикам событий обычно являются Вашим первым введением в делегатов... Вы даже не могли бы знать об использовании их, потому что делегат обернут в классе EventHandler.
Если Вы интересуетесь наблюдением, как шаблон Делегата используется в реальном коде, посмотрите не далее, чем Какао на Mac OS X. Какао является предпочтительным инструментарием UI Apple для программирования в соответствии с Mac OS X и кодируется в Objective C. Это разработано так, чтобы каждый компонент UI был предназначен, чтобы быть расширенным через делегацию вместо разделения на подклассы или других средств.
Для получения дополнительной информации, я рекомендую проверить то, что Apple должна заявить о делегатах здесь .
У меня был проект, который использовал win32 Python.
из-за различных причин, некоторые модули использовали odbc.py для доступа к DB и другим модулям - pyodbc.py.
была проблема, когда функция должна была использоваться обоими видами модулей. Этому передали объект соединения ему как аргумент, но тогда это должно было знать, использовать ли dbi.dbiDate или дату и время для представления времен.
Это было то, потому что odbc.py ожидал, как значения в SQL-операторах, даты как dbi.dbiDate, тогда как pyodbc.py ожидал значения даты и времени.
Одна дальнейшая сложность была то, что объекты соединения, созданные odbc.py и pyodbc.py, не позволили устанавливать дополнительные поля.
Мое решение состояло в том, чтобы обернуть объекты соединения, возвращенные odbc.odbc (...) и pyodbc.pyodbc (...) классом делегата, который содержит желаемую функцию представления времени как значение дополнительного поля, и который делегирует все другие полевые запросы к объекту первоначального соединения.
Быстрый поиск Google придумал этот http://en.wikipedia.org/wiki/Delegation_pattern . В основном в любое время то, что Вы используете объект, что вперед это - вызовы к другому объекту тогда, Вы делегируете.
У меня был тот же вопрос, что и у вас, и я обратился к этому сайту за ответом.
Очевидно, я не понял его лучше, хотя и пролистал примеры в этой теме.
Теперь, когда я прочитал, я нашел отличное применение делегатам: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Это может показаться более очевидным для новых пользователей, потому что Forms намного сложнее передавать значения, чем ASP.NET сайты с POST/GET (QueryString) ...
В основном вы определяете делегат, который принимает "TextBox text" в качестве параметров.
// Form1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// РЕЗЮМЕ: Определите делегат, инстанцируйте новый класс Form2, назначьте функцию funData() делегату, передайте делегату ваш textBox. Покажите форму.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// РЕЗЮМЕ: Просто возьмите TextBox txtForm1 в качестве параметров (как определено в делегате) и присвойте text метки textBox'у.
Надеюсь, это поможет вам в использовании делегатов :) ..