第4回 プログラムは奥深く「2.Redrawで共通モジュール」

4−2 Redrawで共通モジュール

これは、前回のジャンケンゲームの共通モジュールですね。この部分をスクリーンのAfterに組み込んでいくわけです。
    Sub exec_JanKen(mode_my as Integer)

        Dim mode_Palm as Integer
        Dim f as Integer
            
        mode_Palm = rand()*3+1
          
        count_Game = count_Game + 1
                  
        f = Val(Mid("915591159",mode_my*3+mode_Palm-3,1))
    
        If f=1 Then
            count_Win = count_Win + 1
        End If

        DrawBitmap 1010+mode_Palm,8,20
        DrawBitmap 1008,88,55
        Lbl1018.Label=Mid("Win!LoseEven",f,4)
        Lbl1017.Label=Format(count_Win/count_Game * 100,"##0.0%")

    End Sub
共通モジュールのexec_Janken()をCallする時は、引数を渡していましたね。1ならグー、2ならチョキという値でした。
そして、受け取ったモジュール側では、変数mode_myに代入され処理されています。
見かけ上、直接exec_Janken()というモジュールに直接数字を渡しているように見えますが、一方のAfterのような場所に記述されるイベントモジュールには直接引数を渡すことができません。
ということは、何らかの別の手段が必要になりますが、この場合は「プログラムのどこでも使える変数」であるGlobal変数を使う方法を思い浮かぶのではないでしょうか。ちょうど、mode_myという名前にすれば、そのままで使いまわしが出来ますね。
まずは、Startupで、グローバル変数を定義します。

    Global mode_my as Integer

そして、Afterに組み込みます。
    Sub Form1004_after()
        
        Dim mode_Palm as Integer
        Dim f as Integer
            
        mode_Palm = rand()*3+1
          
        count_Game = count_Game + 1
                  
        f = Val(Mid("915591159",mode_my*3+mode_Palm-3,1))
    
        If f=1 Then
            count_Win = count_Win + 1
        End If

        DrawBitmap 1010+mode_Palm,8,20
        DrawBitmap 1008,88,55
        Lbl1018.Label=Mid("Win!LoseEven",f,4)
        Lbl1017.Label=Format(count_Win/count_Game * 100,"##0.0%")

    End Sub
これで、ボタン側の処理をCallで共通モジュールを呼ぶのではなく、Redrawに置きかえれば良いですね。例えば、グーボタンでは、
    Sub object1014()

        mode_my=1
        redraw
    
    End Sub
このようにRedrawを使って処理をする場合は、こんなイメージになるでしょうか?
共通モジュールを使った場合と比較してみてください。

    

そして、Redrawを使って共通モジュールを置き換えましたので、もう共通モジュールは必要なく、プロジェクトから削除しても構いません。削除は、Remove Moduleです。(削除と言っても、ファイルが消えるわけではありませんので、ご安心下さい。)

    

さて、1つ忘れていたことがあります。
Redrawを使って画面を再描画し、スクリーンのAfterイベントを意図的に利用しましたが、このイベントは起動時にも必ず発生していることを覚えているでしょうか?
そのため、それを回避する手立てが必要になります。

ジャンケンゲームの場合、自分の手がグー、チョキ、パーである必要があるのですが、それ以外であれば、基本的にジャンケンにはなりません。
つまり、変数mode_my=1,2,3以外の場合は、ジャンケンではないですから、それを利用します。
     Sub Form1004_after()
        
        If mode_my<>0 Then
            Dim mode_Palm as Integer
            Dim f as Integer
            
            mode_Palm = rand()*3+1
          
            count_Game = count_Game + 1
                  
            f = Val(Mid("915591159",mode_my*3+mode_Palm-3,1))
    
            If f=1 Then
                count_Win = count_Win + 1
            End If

            DrawBitmap 1010+mode_Palm,8,20
            DrawBitmap 1008,88,55
            Lbl1018.Label=Mid("Win!LoseEven",f,4)
            Lbl1017.Label=Format(count_Win/count_Game * 100,"##0.0%")
        End If

    End Sub
Startupで定義された変数mode_myは、起動時、つまり、定義された直後では、初期値の 0ですので、If〜Thenを使って、この処理を無効にして回避します。
If の条件は、等しい「=」だけでなく、未満「<」、以下「<=」、以上「>=」、より大きい「>」、等しくない「<>」という記号が使え、これらの記号を「比較演算子」と言います。

比較演算子意味
=X=YXとYは等しい
< 又は >XXXはY未満(YはXより大きい)
<= 又は =>X<=Y 又は、 Y=>XXはY以下(YはX以上)
<>X<>YXとYは等しくない
※BASICの仕様により、順序が決まっている場合があります。
本来<=と=<は同じ意味ですが、BASICによっては通らない場合があります。

この例の「mode_my<>0」の比較演算子は「<>」ですので、mmode_my=0の時は成り立ちません。よって、最初の起動時にはジャンケン処理が発生していないように見えています。
早速、実行してみましょう。
動作は、共通モジュール版と同じ動きになったと思います。

このように、NS BasicではRedrawを使って「意図的にイベントを発生させる手法」を使うことが出来ます。ちょっと特殊ですが、これを覚えておくと、できることがかなり広がります。


前へ     目次へ     次へ

第4回 プログラムは奥深く「2.Redrawで共通モジュール」