2015-01-09 2 views
1

Во-первых, я хочу сказать, что я пишу это с намерением следовать рекомендациям самого веб-сайта, в котором говорится, что каждый может документировать свою работу, чтобы помочь облегчить возможность ее повторного использования в будущем. Вот скриншот того, где он говорит, что: enter image description hereКак сделать простую систему костей

вопрос довольно прост, как бы кто-то в надежде создать d20-стилизованную игру, создать кости класса роликового для боевых систем и общего пользования в рамках игр ?

ответ

2

Создание «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 ]); 
} 

И это все есть на него.