関数(ランダム)
ランダム
screen 0, 640, 480
HP = 200
;5回連続攻撃
repeat 5
mes "主人公は70のダメージ!"
HP = HP – 70
;HPをマイナスにしない
if(HP < 0){
HP = 0
}
mes "現在のHPは" + HP + "です\n"
;生死の判定
if(HP >= 1){
mes "まだ生きている\n"
}else{
mes "もう死んでいる\n"
break
}
loop
これは、前のページで作ったプログラムです。
このプログラムは、毎回ダメージが70で固定なので面白くないですね。
ダメージ量をランダムな値にしてみましょう。
まず、ダメージ量が変化するので「変数」にしなければなりませんね。
ひとまず、次のように修正しましょう。
:
:
;5回連続攻撃
repeat 5
damage = 70
mes "主人公は" + damage + "のダメージ!"
HP = HP – damage
:
:
ここまでは大丈夫でしょうか?
70という数値(定数)をそのまま使うのではなく、
damageという名前の箱(変数)に入れてから使っただけで
実行結果は変わりません。
さぁ、いよいよダメージをランダムにしてみましょう。
次のように修正します。
:
:
;5回連続攻撃
repeat 5
damage = rnd(100)
mes "主人公は" + damage + "のダメージ!"
HP = HP – damage
:
:
rndは、ランダムの略で「乱数(適当な数値)を作りなさい」という関数です。
関数とは何か?については下で説明しますが、
上のように書けば、変数damageには0~99のどれかの値が入ります。
仮に、damage = rnd(50) と書けば、damageは0~49のどれかになります。
最大値は、『( )の中に書いた値-1』になるので注意してください。
これで、主人公は毎ターン違うダメージを受けるようになったでしょう。
実行して確認してください。
関数
さて、関数とはなんでしょうか。
関数は命令に似ています。
「何かをさせる記述」という面では、関数も命令も同じです。
逆に、どこが違うかというと、次の2点です。
まずは、見た目の違い。
今まで学んだ命令は、命令の後ろにパラメーターをそのまま書いていましたが、
上のrnd関数を見てわかるとおり、関数はパラメータを( )で囲みます。
これによって、命令なのか、関数なのかを判断できるでしょう。
もう一つの違いは、関数とは「それ自体が何らかの値になる」というところです。
上の例では、rnd(100)という関数を変数damageに代入してますね。
「rnd(100)」という記述そのものが0~99のいずれかの値になるわけです。
HSPで使える関数はrndの他にもたくさんあります。
それらは追々紹介していきます。
乱数の制御
さて、話を乱数(ランダム)に戻します。
上で説明したように修正すれば、ダメージを0~99のいずれかにすることができます。
しかし、ちょっとバラつきが激しすぎますね・・・。
そこで、ダメージを80~99のいずれかの値になるようにしましょう。
残念ながら、rnd関数は0から指定した値までの乱数しか作れません。
そこで、次のように書きます。
:
:
repeat 5
damage = rnd(20)
damage = damage + 80
mes "主人公は" + damage + "のダメージ!"
:
:
まずは、rnd(20)を代入します。
これで、damageは0~19のいずれかになります。
それに80を足せば・・・・80~99になりますよね。
ただし、このように2行書くのは面倒です。
上で説明したとおり、関数はそれ自体が数値と同じものとして扱うことができます。
つまり・・・・
repeat 5
damage = rnd(20) + 80
mes "主人公は" + damage + "のダメージ!"
たとえば、サイコロのように1~6の乱数を求めたいときは、
rnd(6)+1と書きます。
サイコロの目は6パターンあるので( )の中は6、
最小値が1なので、1を足すことになります。
今回のポイント
- 変数に乱数(ランダムな値)を代入したい場合は
変数名=rnd(パターン数) + 最小値
と書く。 - 関数は・・・
○パラメータを( )で囲む
○それ自体が値(数値)と同じ扱い