みなさん、こんにちは。マクロVBA入門の10回目(演習)です。
前回はパズルが揃った(完成した)場合の処理について紹介しました。
今回は、揃ったパズルを再びバラバラにするリセット処理を紹介します。
「パズル演習」学習用Excelファイルのダウンロードはこちらから↓
今回のパズル演習記事は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~4までのランダムな整数を生成する。
- 「1」の場合:上、「2」の場合:下、「3」の場合:右、「4」の場合:左に動く条件分岐を設定
- 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入門はこれで終了です。是非ご活用ください!
コメント