250
edits
m (解析用ページのフォーマットに沿っていないのを修正) |
mNo edit summary Tags: Mobile edit Mobile web edit Visual edit |
||
| (3 intermediate revisions by 2 users not shown) | |||
| Line 28: | Line 28: | ||
</syntaxhighlight>「a」はCURVE関数で抑制を行う値(以下、<code>入力値</code> )です。 | </syntaxhighlight>「a」はCURVE関数で抑制を行う値(以下、<code>入力値</code> )です。 | ||
「start」はCURVE関数で抑制がかかりはじめるまでの閾値(以下、<code>抑制閾値</code> ) | 「start」はCURVE関数で抑制がかかりはじめるまでの閾値(以下、<code>抑制閾値</code> )です。例えば抑制閾値=150の場合、入力値が151以上であればCURVE関数による抑制が働きます。 | ||
「rate」は抑制の比率を百分率で表した数値(以下、<code>抑制比率</code> )です。抑制対象の数値はこの%分の値になるように計算されます。 | 「rate」は抑制の比率を百分率で表した数値(以下、<code>抑制比率</code> )です。抑制対象の数値はこの%分の値になるように計算されます。 | ||
| Line 47: | Line 47: | ||
4. 抑制値 <= 抑制段階 か 抑制回数 == 10 のどちらかを満たす場合、以下の式で算出される抑制結果を返却して終了します。 | 4. 抑制値 <= 抑制段階 か 抑制回数 == 10 のどちらかを満たす場合、以下の式で算出される抑制結果を返却して終了します。 | ||
抑制結果 = 抑制値 + 抑制閾値 + 抑制段階 × (抑制回数 - 1) | 抑制結果 = 抑制値 + 抑制閾値 + 抑制段階 × (抑制回数 - 1) | ||
5. | 5. 抑制対象値と抑制回数に以下の式の値を代入します。 | ||
抑制対象値 = 抑制値 - | 抑制対象値 = 抑制値 - 抑制段階 | ||
抑制回数 = 抑制回数 + 1 | |||
6. 値が返却されるまで3~5を繰り返します。 | 6. 値が返却されるまで3~5を繰り返します。 | ||
| Line 54: | Line 55: | ||
関数の曲線の傾きは徐々に小さくなり、最終的には<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:カイセキ,キョウツウショリ}} | |||
[[Category: Elin Spoiler]] | |||
[[Category: JA]] | [[Category: JA]] | ||
edits