Jump to content

Elin:解析/共通処理: Difference between revisions

ダイスロールなどを新設。Dice.csのうちのどこまでを書くかは未定
m (抑制回数の値の説明が不十分だったのを修正)
(ダイスロールなどを新設。Dice.csのうちのどこまでを書くかは未定)
Line 54: Line 54:


関数の曲線の傾きは徐々に小さくなり、最終的には<code>(抑制比率 / 100)^10</code> となります。
関数の曲線の傾きは徐々に小さくなり、最終的には<code>(抑制比率 / 100)^10</code> となります。
==ダイスロールなど==
{{EA 23.109 Stable Patch 2}}
public class Dice
{
    public static Dice Null = new Dice();
    public int num;
ダイスの数量です。
    public int sides;
日本語で言うとダイスの面数です。
    public int bonus;
おそらくダイスロール結果に定数を加算するものです。
    public Card card;
ここから、メインのRollの定義が述べられます。
    public static int Roll(int num, int sides, int bonus = 0, Card card = null)
    {
        int a = 1;
        bool flag = true;
        int num2 = 0;
        if (card != null)
        {
            int num3 = card.Evalue(78);
            flag = num3 >= 0;
            a = 1 + Mathf.Abs(num3 / 100) + ((Mathf.Abs(num3 % 100) > rnd(100)) ? 1 : 0);
        }
Evalue(78)は運であり、flagは運が0より大きいことを示す役割のようです。
aはリロール回数を示す整数で、基本的には、初期値1に、運を100で割った絶対値を足したものですが、(運を100で割ったあまり)%の確率でそれにさらに1が足されます。
       
        for (int i = 0; i < Mathf.Min(a, 20); i++)
        {
            int num4 = Roll();
            if (i == 0 || (flag && num4 > num2) || (!flag && num4 < num2))
            {
                num2 = num4;
            }
        }
        return num2;
ここでは実際にダイスが振られます。
まず、ダイスロールが繰り返される回数はiが0からa-1もしくは20-1<ref>整数なので、i<20のときi=20は認められない。</ref>まで増えていくまでなので、
'''a回、ただし上限20'''です。
後述する関数であるroll()で出た値は、条件を満たせばnum2として記憶されます。
その条件は、繰り返し回数0の初のロールであるとき、もしくは運が正かつ、前のnum2より大きい値が出たとき、もしくは運が負かつ、前のnum2より小さい値が出てしまったときです。
最後に、運が正であれば繰り返した中で最大のものを表し、運が負のときでは繰り返した中で最小のものを表すnum2が提示されます。
       
        int Roll()
        {
            int num5 = 0;
            for (int j = 0; j < num; j++)
            {
                num5 += rnd(sides) + 1;
            }
            return num5 + bonus;
        }
    }
これはnumの回数だけ、num5にrnd(sides) + 1を加えるというプログラムなので、
言い換えると個数numで、面数がsidesのサイコロを投げて出た目の総和です。
なお、この結果にbonusが足し算されてrollの値が決まります。
    public static int RollMax(int num, int sides, int bonus = 0)
    {
        return num * sides + bonus;
    }
これは複数のサイコロを投げて出る目の総和の最大値にbonusを足したものです。
    public static int rnd(int a)
    {
        return Rand.Range(0, a);
    }
Elinの解析で頻出の、rnd(a)= ”0からa-1までのランダムな値”
となる関数です。
{{DEFAULTSORT:カイセキ,キョウツウショリ}}
{{DEFAULTSORT:カイセキ,キョウツウショリ}}
[[Category: Elin Spoiler]]
[[Category: Elin Spoiler]]
[[Category: JA]]
[[Category: JA]]