Создание «Dicebag» довольно просто; для его написания требуется совсем немного усилий. Однако перед тем, как продолжить, нужно еще кое-что описать. Смерть (множественные «кости») никогда не может быть нулевой или отрицательной, поэтому при написании класса мы должны подготовиться к этому. Мы перенесем перегрузку параметров с помощью нашего собственного перечисления «Dice», которое будет безоговорочно представлять собой целое число без знака. Это поможет сохранить все виды неопределенного поведения. Мы также добавим +1 к возвращаемому значению, чтобы гарантировать, что число никогда не будет 0, что, как я сказал, невозможно для достижения физической смерти.
Используя эти правила и законы, вот класс прописывают:
using System;
using System.Collections.Generic;
namespace Utilities {
/**
* Original Author: Gordon Kyle Wallace, "Krythic"
*
* This class is designed to emulate/facilitate the rolling of real-world
* dice within a d20 stylized game/system.
*
* License:
* There is not one; this snippet may be used/modified by anyone for
* any arbitrary reason. I, Gordon Kyle Wallace "Krythic", lay no claim upon
* this document, the program it ultimately produces, or the thought-patterns
* that may—or may not—emerge from using it.
*
* This disclaimer may be deleted at your whim.
*
* ~Krythic
*/
public class DiceBag {
public enum Dice : uint {
/// <summary>
/// This can be considered a double-sided coin;
/// used to delimit a 50/50 probability.
/// </summary>
D2 = 2 ,
/// <summary>
/// A Tetrahedron
/// A 4 Sided Die
/// </summary>
D4 = 4 ,
/// <summary>
/// A Cube
/// A 6 Sided Die
/// </summary>
D6 = 6 ,
/// <summary>
/// A Octahedron
/// A 8 Sided Die
/// </summary>
D8 = 8 ,
/// <summary>
/// A Pentagonal Trapezohedron
/// A 10 Sided Die
/// </summary>
D10 = 10 ,
/// <summary>
/// A Dodecahedron
/// A 12 Sided Die
/// </summary>
D12 = 12 ,
/// <summary>
/// A Icosahedron
/// A 20 Sided Die
/// </summary>
D20 = 20 ,
/// <summary>
/// A Rhombic Triacontahedron
/// A 30 Sided Die
/// </summary>
D30 = 30 ,
/// <summary>
/// A Icosakaipentagonal Trapezohedron
/// A 50 Sided Die
/// </summary>
D50 = 50 ,
/// <summary>
/// A Pentagonal Hexecontahedron
/// A 60 Sided Die
/// </summary>
D60 = 60 ,
/// <summary>
/// A Zocchihedron
/// A 100 Sided Die
/// </summary>
D100 = 100
};
private Random _rng;
public DiceBag() {
_rng = new Random();
}
/**
* The default dice-rolling method. All methods link to this one.
*/
private int InternalRoll(uint dice) {
return 1 + _rng.Next((int)dice);
}
/// <summary>
/// Rolls the specified dice.
/// </summary>
/// <param name="d">The d.</param>
/// <returns>The Number rolled.</returns>
public int Roll(Dice d) {
return InternalRoll((uint)d);
}
/// <summary>
/// Rolls the chosen dice then adds a modifier
/// to the rolled number.
/// </summary>
/// <param name="dice">The dice.</param>
/// <param name="modifier">The modifier.</param>
/// <returns></returns>
public int RollWithModifier(Dice dice , uint modifier) {
return InternalRoll((uint)dice) + (int)modifier;
}
/// <summary>
/// Rolls a series of dice and returns a collection containing them.
/// </summary>
/// <param name="d">The d.</param>
/// <param name="times">The times.</param>
/// <returns>A Collection Holding the dice rolls.</returns>
public List<int> RollQuantity(Dice d , uint times) {
List<int> rolls = new List<int>();
for(int i = 0 ; i < times ; i++) {
rolls.Add(InternalRoll((uint)d));
}
return rolls;
}
}
}
Как использовать этот класс:
Реализация класса довольно проста. Во-первых, вы должны создать экземпляр класса «Dicebag», а затем выбрать способ по вашему выбору. Вот пример, который катится 1d20 (One Twenty стороннего Die):
DiceBag bag = new DiceBag();
Console.WriteLine(bag.Roll(DiceBag.Dice.D20));
Как применить атрибут модификатора к рулону:
Опять же, это довольно просто. Мы будем использовать второй метод, называемый «RollWithModifier», и используя выбранные кости, также загружаем вторую перегрузку с любым беззнаковым целым по нашему выбору. Вот отрывок, который среди использования d20, добавит модификатор 22 до конечного рулона:
DiceBag bag = new DiceBag();
Console.WriteLine(bag.RollWithModifier(DiceBag.Dice.D20 , 22));
Вы также можете заметить, что я взял на себя смелость добавить вспомогательный метод для массовой кости прокатки. Что может оказаться полезным в определенных сценариях. Фрагмент кода ниже будет генерировать 131 бросков костей с помощью d20:
DiceBag bag = new DiceBag();
List<int> rolls = bag.RollQuantity(DiceBag.Dice.D20 , 131);
for(int i = 0 ; i < rolls.Count ; i++) {
Console.WriteLine(rolls[ i ]);
}
И это все есть на него.