第3回 画像でアプリをグレードアップ「4.ジャンケンぴょん!」

3−4 ジャンケンぴょん!

 次は、ボタンをタップしたら、自分の手が表示されるようにしましょう。
例えば、ぐーボタンだと、ぐー画像(ID 1008)を表示させれば良いので、
    Sub object1014()

        DrawBitmap 1008,88,55
    
    End Sub
になります。ま、これは直接描画してしまって構いませんので、DrawBitmapを使いました。
配置は、位置(88,55)にしてみましたが、この時同時に、Palmの手が表示されれば良いので、例えば、
Sub object1014()

    Dim mode_Palm as Integer
    
    mode_Palm = rand()*3+1
    
    DrawBitmap 1010+mode_Palm,8,20
    DrawBitmap 1008,88,55

End Sub
サイコロの時と同じく、変数mode_Palmに1,2,3の何れかの数字が乱数で入りますから、その結果に応じたPalm側の手が表示されますね。
そして、その値によって「1:ぐー」「2:ちょき」「3:ぱー」になります。

勝敗の判定ですが、この1014というビットマップは「ぐー」ボタンですから、
     mode_Palmが、1:あいこ
                  2:勝ち
                  3:負け
ですね。
ということで、"CHO","HAN"で使ったMid関数を使って次のようにしました(わざわざ勝敗を「Win!」「Lose」「Even」の4文字にしてありますね)
Sub object1014()

    Dim mode_Palm as Integer
    
    mode_Palm = rand()*3+1
      
    DrawBitmap 1010+mode_Palm,8,20
    DrawBitmap 1008,88,55
    
    Lbl1018.Label=Mid("EvenWin!Lose",mode_Palm*4-3,4)

End Sub 
あとは、勝率の表示ですが、これにはプログラム中のどこでも使える変数を用意する必要がありますね。
勝率は

    勝った数 ÷ 全試合数 × 100(%)

ですね。ただ、細かく考えると「あいこ」をどういう扱いにするか悩むところですが、今回は「勝った数」だけ取ることにしましょう。
必要な変数は、勝った数全試合数ですね。
変数を、Dimコマンドではなく、Globalコマンドで定義すれば、どこでも使える変数になることは、前回お話しましたね。なので、Startup Codeに次のような定義文を入れておきます。
Sub main()

    Global count_Game as Integer
    Global count_Win as Integer
    
End Sub
変数count_Gameが全試合数、変数count_Winが勝った数です。 試合数は、ジャンケンをする度に、勝った数は勝った時に1ずつ増えますので、それぞれ、該当するところで1ずつ加えて、ラベル(Lbl1017)に表示します。
Sub object1014()

    Dim mode_Palm as Integer
    
    mode_Palm = rand()*3+1
  
    count_Game = count_Game + 1
      
    DrawBitmap 1010+mode_Palm,8,20
    DrawBitmap 1008,88,55
    
    Lbl1018.Label=Mid("EvenWin!Lose",mode_Palm*4-3,4)

    If mode_Palm=2 Then
            count_Win = count_Win + 1
    End If

    Lbl1017.Label=Format(count_Win/count_Game * 100,"##0.0%")

End Sub 

試合数は、イベントが発生した時に無条件で+1ですね。勝った数は、勝った時という条件ですから、まあ、1つなのでIfを使えば良いでしょう。
なお、文中に出てきた新顔のFormat(x,y)は、xの値を yというフォーマット(書式)で表示させる関数です。
フォーマットは、次の文字列を組み合わせて指定します。
    0:あれば値から該当する1文字を、なければ0に置きかえる。
    n:あれば値から該当する1文字を、なければ空白に置きかえる。
    #:あれば値から該当する1文字を、なければなにもしない(表示は詰められる)
  .:小数点を指定
  +:値がマイナスならマイナス記号がつき、プラスなら何もしない
    -:値がマイナスならマイナス記号がつき、プラスならプラス記号がつく
    ,:カンマの指定
    その他の文字は、そのまま表示されます。
例えば、Format(x,"###.###")とした時に、x=0.51であれば、結果は「.51」に、Format(x,"000.000")であれば、「000.510」になります。
Formatを使うと、必要な桁数などを予め合わせて表示できますので、特に、小数点以下の数値を含む表示を扱う場合は便利です。
また、戻り値は「文字列」になりますので、Labelプロパティに直接代入できます。

さて、これをコンパイルすれば、「ぐー」だけ機能するジャンケンの出来上がりです。
ぐーボタンを押せば、Palmが手を出し、判定されて勝率が変化します。いかがでしょうか?

これを「ちょき」「ぱー」のボタンに同じようなコードを入れれば完成ですね。
この程度のコードであれば、コピー&ペーストを利用すれば、比較的簡単に入力することができますね。

あえて言うなら、ボタン毎に勝敗の判定が変わることに注意すれば大丈夫です。 例えば、Palmの手がグー(mode_Palm=1)のとき、自分がグーならあいこ、チョキなら負け、ですね。 それに合わせて、Mid()の中やIfの条件を変えてください。

これで、一応のジャンケンゲームの完成ですね。
画像を貼りつけてありますので、なんだかちょっと立派なアプリケーションに見えます。

NS Basic上で画像を描画する方法として、DrawBitmapコマンドで描画する方法と、ビットマップオブジェクトを使う方法を紹介しました。
また、Select CaseというIf Thenとは違う重要な条件分岐のコマンドと、書式を整えるFormat()関数を紹介しました。

今回は、ぐー、ちょき、ぱー、とほとんど同じ機能をボタンに同じようなBASICコードを記述しましたが、もっとスッキリとさせる方法があります。各ビットマップオブジェクトのコードに記述した内容を比較してみましょう。

前へ    目次へ    次へ

第3回 画像でアプリをグレードアップ「4.ジャンケンぴょん!」