ランダム性を持たせる

この記事は、「基本編」の内容を前提に記述しています。
先に、「基本編」を読んでください。

基本編では、ステータスを増減させたり、利用したりして、ゲームの基本的な要素を作ってきました。

ここでは、それらに、ランダム性を持たせてみます。

準備:乱数を取得できるようにする

ティラノスクリプトは、(v521c時点では、)標準で乱数の取得ができません。

可能にするために、「first.ks」に、以下のプログラムを貼り付けてください。場所は、一番下でなければ、どこでもよいはずです。

; ----------------------------------------------------------

; 乱数マクロ

; ----------------------------------------------------------



; [getrand var="XXX" min="XXX" max="XXX"]

; 一時変数 tf.rand に min 以上 max 以下の乱数(整数)をセットするマクロです。

; var には変数の名前を指定できます(var="f.a"のように)。

; 指定すると、tf.rand の内容をその変数にコピーします。

[macro name="getrand"]

  [iscript]

  var max = mp.max || '10'

  var min = mp.min || '1'

  max = Number(max)

  min = Number(min)

  tf.rand = min + Math.floor(Math.random() * (max - min + 1))

  if (mp['var']) eval(mp['var'] + ' = ' + tf.rand)

  [endscript]

[endmacro]



; [getrandname var="XXX" name="XXX" min="XXX" max="XXX"]

; 文字列 name の{R}部分を「min 以上 max 以下のランダムな整数」で置き換えた文字列を生成し、

; 一時変数 tf.randname にセットします。

; var には変数の名前を指定できます(var="f.a"のように)。

; 指定すると、tf.randname の内容をその変数にコピーします。

[macro name="getrandname"]

  [iscript]

  var name  = mp.name || '*Label{R}'

  var max   = mp.max  || '10'

  var min   = mp.min  || '1'

  max = Number(max)

  min = Number(min)

  var rand    = min + Math.floor(Math.random() * (max - min + 1))

  tf.randname = name.replace('{R}', rand)

  if (mp['var']) eval(mp['var'] + ' = "' + tf.randname + '"')

  [endscript]

[endmacro]

ちなみにこれは、公式のテクニックサンプル集からコピペしたものです。

乱数の使い方・取得方法

以下ようなのコードを使います。

[getrand var="f.○○" min="1" max="10"]

これは、「変数『f.○○』の数値を、1から10までのどれかにする」というものです。

もちろん、変数の名前や、最小値(min)・最大値(max)は、お好きなようにしてください。

ランダムな要素を追加したい場合は、上のコードを最初に書き、そこで設定した関数を利用していくことが基本になります。

公式の機能デモがわかりやすいので、詳しくは、それを見てください。

ステータスをランダムに変化させる

ここからは、育成コマンドを作るで挙げた例を応用して、ランダム性を持たせてみます。

ランダムな数値を増減させる

*筋トレ
[getrand var="f.増加値" min="1" max="5"]

[eval  exp="f.パワー = f.パワー + f.増加値"  ]

パワーが
[emb exp="f.増加値"]
上がった[l][cm]

[jump target="*育成画面"  ]

これは、「『筋トレ』すると、『パワー』が『1~5』上がる」というもの。

ついでに、増加した数字が、文字でもわかるようにしました。

確率で増減する数値を変える

上では単純すぎるという方は、こんなシステムにしてみてはどうでしょう。

*筋トレ
[getrand var="f.確率" min="1" max="10"]

[if  exp="f.確率 <= 7" ]
[eval exp="f.増加値 = 1" ]
[else]
[eval exp="f.増加値 = 5" ]
[endif]

[eval  exp="f.パワー = f.パワー + f.増加値"  ]

[if  exp="f.増加値 == 1"  ]
いつも通りの練習だった。[l][cm]
[else  ]
今日は調子が良かった![l][cm]
[endif]

パワーが
[emb exp="f.増加値"]
上がった[l][cm]

[jump target="*育成画面"  ]

これまでの解説と、簡単な数学の知識でわかるとは思いますが、「7割の確率でパワーが1上がり、残りの3割で5上がる」というものです。

前のコマンドでは、「1~5」でしたが、こうすることで「1か5」にすることができます。

ついでに、増加した数値ごとに、表示するメッセージも変えてみました。

乱数の最大値を増やしたり、「IF」部分を工夫したりすれば、より詳細な条件にすることができます。

勝敗・成功不成功をランダムに決定する

今度は、勝負・チャレンジ要素を作るで使った例に、ランダム性を持たせてみます。

基準値をランダムにする

*勝負
[getrand var="f.基準値" min="40" max="60"]

[if exp="f.パワー >= f.基準値"]
勝負に勝った![l][cm]
[else]
勝負に負けた…[l][cm]
[endif]

[jump target="*育成画面"  ]

「40~60までを基準値とし、パワーが基準値より高ければ勝ち」というものです。

確率で基準値を変える

*勝負
[getrand var="f.確率" min="1" max="10"]

[if  exp="f.確率 <= 5" ]
[eval  exp="f.基準値 = 30"  ]
[eval  exp="f.対戦相手 = '雑魚' "  ]

[elsif  exp="f.確率 <= 8" ]
[eval  exp="f.基準値 = 60"  ]
[eval  exp="f.対戦相手 = '幹部' "  ]

[else]
[eval  exp="f.基準値 = 100"  ]
[eval  exp="f.対戦相手 = 'ボス' "  ]

[endif]

[emb exp="f.対戦相手"]
と勝負![l][cm]

[if exp="f.パワー >= f.基準値"]
勝負に勝った![l][cm]
[else]
勝負に負けた…[l][cm]
[endif]

[jump target="*育成画面"  ]

一定確率ごとに、「基準値」と、「対戦相手」の名前を決定し、それをもとに、勝敗の判定や、メッセージの表示を行っています。

もしくは、こんな感じでもできます。↓

*勝負
[getrand var="f.確率" min="1" max="10"]

[if  exp="f.確率 <= 5" ]
[jump  target="*雑魚"  ]
[elsif  exp="f.確率 <= 8" ]
[jump  target="*幹部"  ]
[else]
[jump  target="*ボス"  ]
[endif]

[jump target="*育成画面"  ]

一定確率ごとに、ラベルに飛ぶようにしています。そのラベルごとに、「勝負」の内容を変えます。

こっちの方が、色々と自由に指定できるかも。

自分のステータスをランダムにする(補正値)

ここまでは、相手の数値(基準値)をランダムにしていましたが、今度は、自分のステータスにランダム性を持たせます。

*勝負
[getrand var="f.補正値" min="0" max="5"]

[eval  exp="f.実質パワー = f.パワー + f.補正値"  ]

[if exp="f.実質パワー >= 50"]
勝負に勝った![l][cm]
[else]
勝負に負けた…[l][cm]
[endif]
[jump target="*育成画面"  ]

「補正値」システムを、乱数を利用して実装してみました。

「0~5」の数値を「補正値」という変数に渡し、それと「パワー」の合計を「実質パワー」とし、それを使って、勝敗を判定します。

以上のアイデアを応用したり、組み合わせたりすれば、そこそこ本格的なゲームのシステムを作れるのではないでしょうか。いろいろ試してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です