第2回 とりあえず、ゲームでも「3.Palmとサイコロ」

2−3 Palmとサイコロ

 とりあえず、ざぁ〜っと変数を紹介してきましたが、ここまではよろしいでしょうか?
値を入れたり参照したりする名前の付いた入れ物で、それは、おいてある場所によって見えたり見えなかったりする。という程度に理解しておけば良いでしょう。

次は、ちょっとお遊び、Palmにサイコロを振らせて見ましょう。

BASICには「乱数」を発生させる関数があります。NS Basicの場合「Rand()」という関数で、説明には「0から1.0の間の乱数(乱数)をfloat値で戻します。」とあります。
ちなみに関数とは、一般的に「何らかの値を与えて、何らかの値が返ってくるもの」ですが、Rand()関数の場合は「何も与えなくても、値が返ってきます」。
こう言う種類の関数には、例えば、時刻や日付などがあり、特に何も与えなくても値が返ってくるモノもあります。
では、ちょっと組み込んでみましょう。
先ほどのサンプルで十分ですので、適当なボタンに次のプログラムを入力して下さい。
      Dim fx as float
      fx = Rand()
      MsgBox Str(fx)
ボタンをタップする度に、でたらめな数が表示されるでしょうか?これが「でたらめな数」つまり乱数です。
このような乱数は、様々な場面で使われます。例えばゲームで敵の動きを決めたり、また、ロトやナンバーズなどの数字選択式くじの予想に使ったりと、予想のできない値を得たいときに使う関数です。

最後の行のMsgBox Str(fx)のStr()関数ですが、これは、数値を文字列に変換する関数です。
MsgBoxは文字型しか受け付けませんので、このように変換して表示しています。ちょっと変数の中身を確認したいときは、MsgBoxと組み合わせてこの方法を使うと便利です。

さて、Rand()という関数は、0〜1の間の乱数ということですが、もう少し厳密に言うと「0以上1未満の数」なのです。
「以上」とか「未満」とか、ややこしいですが、数学風に書くと「0≦Rand()<1」ですね。

では、この乱数を使って「サイコロ」を振ってみたいと思います。
サイコロとは、1〜6の数字が振られた立方体で、イカサマ師でなければ思った通りの目が出ないものなので、まさに乱数といえます。 この中で、肝心なのは1〜6の数字を決めるところですね。
今回は先に正解を言ってしまいましょう。正解はRand()を6倍して整数化して1加えればサイコロになります。

順番に説明してみます。
Rand()は、0以上1未満の数字なので次のように表されますね。

    0≦Rand()<1

これを6倍するので

    0≦Rand()*6<6

ですね。よろしいですか?Rand()*6は、0〜5.99999999…の値になるわけです。尚、"*"は掛け算の記号です(割り算は"/"です。)
それを整数化すれば、Rand()*6は、0,1,2,3,4,5のどれかになります。そして、最後に1を加えますから、結果1,2,3,4,5,6のいずれかの値になるという仕組みです。
整数化する関数にInt()があります。IntegerのIntですが、これを使えば、

    0 ≦ Int(Rand()*6) ≦ 5 {0,1,2,3,4,5}
    1 ≦ Int(Rand()*6)+1 ≦ 6 {1,2,3,4,5,6}

がサイコロの目、ということになります。
ちょっと、ハンドブックを読んでいて気が付いたのですが、本当の整数化というのは「その数値を超えない最大の整数」を返すことです。

    

例えば、Int(3.4)は、超えない最大の整数「3」を返しますし、Int(-3.4)は、超えない最大の整数「-4」を返します。-3を返すと、超えてしまいますからね。
しかし、NS BasicのInt()は、単純に小数点以下の数値を切り捨ててしまいますので、注意が必要です。これは、ハンドブックを読むまで気が付きませんでした。
NS Basicでは、Int()の他に、Ceiling()やFloor()という整数化する関数が用意されています。
        Int(3.4)    =3     Int(-3.4)    =-3  小数点以下の数字を消すだけ
        Ceiling(3.4)=4     Ceiling(-3.4)=-3  超えた最初の数字を返す
        Floor(3.4)  =3     Floor(-3.4)  =-4  超えない最大の数字を返す
VBAなどの一般的なInt()はNS BasicではFloor()に相当するようですので、負の数を取り扱う場合は、注意が必要です。

さて、サイコロに戻りましょう。
        Dim fx as float
        fx = Int(Rand()*6)+1
        MsgBox Str(fx)
こんなプログラムになりますね。実行すると、ボタンをタップする度に、1〜6の数字が表示されるようになりました。

ここでチョットしたテクニックです。
Int()を使って、わざわざ整数化しなくても、勝手に整数化される便利な方法です。
        Dim fx as Integer
        fx = Rand()*6+1
        MsgBox Str(fx)
変数fxを実数型(float)で定義してしましたが、これを整数型(Integer)にします。
すると、fxには、小数点以下の数字が格納できませんから、その整数部分だけが取り出されて代入される、という仕組みです。
したがって、2行目のInt()は不要になります。
通常は、代入する側とされる側の型をできるだけ合わせますが、わざと型を合わせないテクニックを使うことができます。

注意すべき点は、文字型変数に数値を代入したり、日付型変数に文字を代入したりと、コンパイルエラーが出なくても、結果が正常でない可能性がある点です。
また、このテクニックは、BASICの種類によっても動作が異なります。十分に確認してから使うようにしましょう。

いかがでしたか?とりあえず、Palmにサイコロを振らせることができました。ちょっと寄り道でしたが、次はサイコロを使って、チョットしたゲームを作ってみましょう。

前へ     目次へ     次へ

第2回 とりあえず、ゲームでも「3.Palmとサイコロ」