マクロVBAのFor文で作るパズル(演習)乱数生成③

VBA入門
スポンサーリンク

みなさん、こんにちは。マクロVBA入門の10回目(演習)です。

前回はパズルが揃った(完成した)場合の処理について紹介しました。

マクロVBAのFor文で作るパズル(演習)②
ForNextステートメンとIfThenステートメントを使ってパズルを作成する方法について紹介しています。今回はパズルの整列の確認コードです。Excelダウンロードファイルを使ってブログ記事を読み進めながら一緒に作成することができます。

今回は、揃ったパズルを再びバラバラにするリセット処理を紹介します。

「パズル演習」学習用Excelファイルのダウンロードはこちらから↓

マクロVBA入門講座|ワイエム
「ブログ記事とオリジナルレジュメを使ってマクロVBAの基礎を学ぼう!!」ということで、ブログにてVBA基礎の習得を目指した記事をアップしていきます。最終目標は”私がVBA習得のきっかけとなった”YouTubeチャンネル:Mr.ラビットのにょきにょきパソコン講座にて題材となってパズルを作成することです!!YouTubeを...

今回のパズル演習記事はYouTubeチャンネル「Mr.ラビットのにょきにょきパソコン講座」の動画を題材にしています。

スポンサーリンク
スポンサーリンク

コード解説(揃ったパズルをバラバラにするリセット処理)

Sub reset()
    Dim 値 As Integer
    Dim i As Long
    Randomize
    
    For i = 1 To 50
        値 = Int(4 * Rnd + 1) 
        
        Select Case 値
        
            Case  1
                Call moving(-1, 0)
            Case  2
                 Call moving(1, 0)
            Case  3
                Call moving(0, 1)
            Case Else
                Call moving(0, -1)
        
        End Select
    Next i
End Sub

  1. 1~4までのランダムな整数を生成する。
  2. 「1」の場合:上、「2」の場合:下、「3」の場合:右、「4」の場合:左に動く条件分岐を設定
  3. 1と2を50回繰り返す

ForNextステートメントを使って、パズルの上下左右の動きを自動化します。

スポンサーリンク

乱数の生成

最小値最大値を設定して乱数を生成したい場合は以下のように記述します。

Int((最大値-最小値+1)* Rnd +最小値))

Rnd関数

Rnd関数・・・0以上1未満の乱数を返します。

Rnd関数の動きを確認するため、下図のような10行10列の範囲に0から1未満の数字をランダムに入力します。

2重ループを使って、各セルにランダム数値を代入します。

Sub 乱数生成()
    Dim r As Long
    Dim c As Long
    For r = 1 To 10
        For c = 1 To 10
            Cells(r, c) = Rnd '各セルにランダム数値を代入
        Next c
    Next r
End Sub

Int関数

Int関数・・・数値の小数点以下を切り捨てて、整数部分を返します。

例)5.857 ⇒ 5を返します。6.597 ⇒ 6を返します。

これらを踏まえて、先ほどのコード(Int((最大値-最小値+1)* Rnd +最小値)))に、最大値と最小値を公式に数字を当てはめるように数字を入力すると、特定の範囲内でランダム数値を生成してくれます。

最小値:1 最大値:4でランダム数値を生成してみます。

Sub 乱数生成_整数()
    Dim r As Long
    Dim c As Long
    For r = 1 To 10
        For c = 1 To 10
            Cells(r, c) = Int(4 * Rnd + 1) 'ランダム数値をセルに代入
        Next c
    Next r
End Sub

Randomize

Rnd関数はブックを開き直すたびに同じ乱数値が発生します。ランダム数値がパターン化されると困ります。

Randmaizeステートメントを使用することで初期化して乱数の再現性をなくすことができます。

スポンサーリンク

Select Case(条件分岐)

Select Caseは複数の条件分岐を使用する時に使うと便利です。

Select Case 変数
    Case  "○"
       変数が○の時の処理
    Case "×"
         変数が×の時の処理
    Case  "△"
         変数が△の時の処理       
    Case Else
         変数が上記以外の処理
End Select

Select Caseの後に、条件となる値を設定します。

Case その条件に合致した時の処理を指定します。

上記の場合、変数が○の場合、×の場合、△の場合、Case Elseはそれ以外の場合の処理を指定します。

Or条件

合致させる条件がOr条件の場合は、「,」(カンマ)区切りにします。

Select Case 変数
    Case  1,2
       変数が1または2の時の処理
    Case  3,4
         変数が3または4の時の処理
    Case  5,6
         変数が5または6の時の処理       
    Case Else
         変数が上記以外の処理
End Select

指定範囲

合致させる条件がある範囲の場合は、「To」を使います。

Select Case 変数
    Case  1 to 5
       変数が1または5の時の処理
    Case  6 to 10
         変数が6または10の時の処理
    Case  11 to 15
         変数が11または15の時の処理       
    Case Else
         変数が上記以外の処理
End Select
スポンサーリンク

パズルをランダムに動かすコード

For i = 1 To 50

値 = Int(4 * Rnd + 1)        
    Select Case 値
        
            Case  1
                Call moving(-1, 0)
            Case  2
                 Call moving(1, 0)
            Case  3
                Call moving(0, 1)
            Case Else
                Call moving(0, -1)
        
        End Select
 Next i

上記コードは、ランダムに生成した1~4までの整数を変数:値に代入します。

変数:値が1~4の場合の処理をそれぞれ記述します。

1の場合:上、2の場合:下、3の場合:右、4の場合:左に動くように、Callステートメントでmovingプロシージャに引数を付けて渡します。

For文でそれらの動作を繰り返します。

スポンサーリンク

全体コード

Sub move(y As Integer, x As Integer)
    
    Call moving(y, x)
    
    Call check
                
End Sub

Sub moving(y As Integer, x As Integer)
    Dim i As Integer
    Dim j As Integer
    For i = 2 To 4 'x軸
        For j = 2 To 4 'y軸
            If Cells(i, j) = "" Then
                Cells(i, j) = Cells(i + y, j + x)
                Cells(i + y, j + x) = ""
                Exit Sub
            End If
        Next
    Next
End Sub

Sub 右移動()
    Call move(0, -1)
End Sub

Sub 左移動()
    Call move(0, 1)
End Sub

Sub 上移動()
    Call move(1, 0)
End Sub

Sub 下移動()
    Call move(-1, 0)
End Sub

Sub check()
   Dim r As Long
   Dim c As Long
   Dim flag As Boolean
   Dim x As Long
        flag = True
    For r = 2 To 4
        For c = 2 To 3
            If Cells(r, c).value <> 8 Then
                If Cells(r, c).value <> Cells(r, c + 1).value - 1 Then
                    flag = False
                    Exit For
                End If
            End If
        Next c
    Next r
    If flag = True Then
        MsgBox "クリア!!"
        Call reset
    End If
End Sub

Sub reset()
    Dim 値 As Integer
    Dim i As Long
    Randomize
    
    For i = 1 To 50
        値 = Int(4 * Rnd + 1) 'Int((最大値-最小値+1)* Rnd +最小値))乱数の生成
        
        Select Case 値
        
            Case 1
                Call moving(-1, 0)
            Case 2
                 Call moving(1, 0)
            Case 3
                Call moving(0, 1)
            Case Else
                Call moving(0, -1)
        
        End Select
    Next i
End Sub

上記コードについて、

Movingプロシージャ:上下左右の移動
Checkプロシージャ:パズルの整列を確認する
resetプロシージャ:クリアした後、パズルをバラバラにする
moveプロシージャ:MovingプロシージャとCheckプロシージャをまとめたもの

reset(パズルをバラバラにする)場合は、check(整列確認)はいらないのでmoveプロシージャではなく、movingプロシージャに直接引数を渡しています。

・もっと学びたい方へ、ストアカもやっています↓↓

スポンサーリンク

まとめ

整列したパズルをバラバラにする処理について紹介しました。

  • ランダム整数の生成にRnd関数、Int関数を使う
  • SelectCaseステートメントで条件分岐を行いパズルをランダムに動かす

マクロVBA入門はこれで終了です。是非ご活用ください!

コメント

タイトルとURLをコピーしました