【Excel】VBAでマインスイーパー作ってみた(ソースコードあり)

以下、過去記事(別ブログ/記事削除済み)の追記修正版 です。

Excel VBAにトライしてみた

身近なところからプログラミングを始めたいという方におすすめのVBA。 Excelさえあればプログラムをつくる&動かすことができるので気軽に始められます。(一般的な言語だと開発環境を構築しないといけないので結構大変です)

以前、VBAの勉強会に参加した後、勉強がてらマインスイーパーを作っていたのでそれを公開したいと思います。

 

画面レイアウト

爆弾の設置箇所はランダム。セルをクリックすると、当該セルに隣接する爆弾の数に応じて数値を表示します。

f:id:window5296:20160611213552p:plain

爆弾をクリックしたら赤くなります。

f:id:window5296:20160611213557p:plain

 

?

ソースコード

いろいろとツッコミどころのあるコードですが書き直したくないのでこのまま晒します。

各自修正してくださいね。

標準モジュール



'初期化処理
Public Sub initialize()
    Randomize '乱数系列の初期化
    
    Range("A10").Select '初期選択セル
    Range("M2").Value = bomNum
    
    '対象セルを塗りつぶす & 爆弾解除
    For i = 1 To celNum
        For j = 1 To celNum
        
            Cells(i, j).Interior.Color = RGB(0, 115, 176)
            Cells(i, j).Font.Color = RGB(0, 0, 0)
            Cells(i, j).Value = ""
            
        Next
    Next

    '爆弾の設置箇所を決定する
    For i = 1 To bomNum
    
        Dim ranNum(2) As Integer
        ranNum(1) = Int((celNum) * Rnd + 1) '乱数 行
        ranNum(2) = Int((celNum) * Rnd + 1) '乱数 列
        
        '既に爆弾がセットされている場合
        If Cells(ranNum(1), ranNum(2)).Value = "A" Then
            
            'スキップ
            i = i - 1
            
        Else
        
            ' 爆弾セット
            Cells(ranNum(1), ranNum(2)).Value = "A"
            Cells(ranNum(1), ranNum(2)).Font.Color = RGB(0, 115, 176)
        
        End If
    
    Next
End Sub

' 爆発処理
Public Sub explosion()

    For i = 1 To celNum
        For j = 1 To celNum
        
            Cells(i, j).Interior.Color = RGB(255, 0, 0)
            Cells(i, j).Font.Color = RGB(0, 0, 0)
            
            If Cells(i, j).Value = "A" Then
                Cells(i, j).Value = "★"

            End If
            
        Next
    Next
        
End Sub

標準モジュール2


Global Const celNum = 9 'セル幅
Global Const bomNum = 15 '爆弾の数

Sheet


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    On Error Resume Next
    
    'リセットボタンだった場合
    If Target.Value = "R" Then
        Call initialize
        Exit Sub
    End If
    
    
    '爆弾だった場合
    If Target.Value = "A" Then
        Call explosion
        Exit Sub
    End If
    
    '範囲外
    If Target.Row > celNum Or Target.Column > celNum Then
        Exit Sub
    End If
    
    '通常セルの場合
    Dim rowN As Integer
    Dim columnN As Integer
    Dim count As Integer
    count = 0
    
    rowN = Target.Row
    columnN = Target.Column
    
    For i = -1 To 1
        For j = -1 To 1
        
            ' 選択セル同士の比較はしない
            If Not (i = 0 And j = 0) Then
            
                If Not (rowN + i < 1 Or rowN + i > celNum Or columnN + j < 1 Or columnN + j > celNum) Then
                    If Cells(rowN + i, columnN + j).Value = "A" Then
                        
                        count = count + 1
                        
                    End If
                    
                End If
            
            End If
        
        Next
    Next
    
    If Not count = 0 Then
        Target.Value = count
    End If
    
    Target.Interior.Color = RGB(142, 209, 224)
    
End Sub

ThisWorkBook


Private Sub Workbook_Open()
        
    Call initialize
    
End Sub

 

エディターもExcel搭載のもので、自動的にエラーチェックもしてくれます。

(Alt+F11で起動します)

f:id:window5296:20160611213601p:plain

 

だいぶ前に書いた記事であるにも関わらず、一定数のアクセスがあったため今回こちらのブログで再公開することになりました。意外に需要があるのかな。