【ExcelVBA】マルバツゲームを作ってみる。ifやforなど基本的なステートメントでできます。

スポンサーリンク




趣味のプログラム

プログラミングの腕試しとしてマルバツゲームを作ろうと考えた。

  • ExcelVBAでどんな事ができるのか知りたい
  • 基本的なプログラムの構造を知りたい

こんな方に読んでもらいたいです。

スポンサーリンク

使うもの

メインで使ったのはSelectionChangeというセルを選択したときに動作する機能。

あとは基本的なものだけ

  • if
  • for
  • array
  • Range
  • Goto

ルール

  • 左上の3*3のマスのみを使用する
  • プレイヤーが先行の○(枠外を選択すればCPUが先行になる)
  • 先に3列揃えば勝利
スポンサーリンク

動き

1手目
右下に○を付けると、すぐさま真ん中に×を付けるCPU

2手目
左上に○を付けると、すぐさま右中に×を付けるCPU

3手目
左中に○

4手目
右上に○

5手目
下中に○を付けて引き分け

すぐさま画面をクリアして引き分けのメッセージボックスが表示される。

コード

開発-Visual Basic

画面左にあるプロジェクトのSheet1をダブルクリック

開いたウインドウの左上に(General)となっている部分をプルダウンからWorksheetを選択

後はプログラムウインドウに下のコードを貼り付ければOK

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    '不正な場所
    If Target.Value <> "" Then
        Exit Sub
    End If
    If Target.Row > 3 Or Target.Column > 3 Then
        Exit Sub
    End If
    
    Target.Value = "〇"
    Dim ライン構成セル(1 To 8) As Variant
    Dim ライン防御判定(1 To 8) As Variant
    Dim ライン非攻撃レベル(1 To 8) As Variant
    
    ライン構成セル(1) = Array("A1", "B1", "C1")
    ライン構成セル(2) = Array("A2", "B2", "C2")
    ライン構成セル(3) = Array("A3", "B3", "C3")
    ライン構成セル(4) = Array("A1", "A2", "A3")
    ライン構成セル(5) = Array("B1", "B2", "B3")
    ライン構成セル(6) = Array("C1", "C2", "C3")
    ライン構成セル(7) = Array("A1", "B2", "C3")
    ライン構成セル(8) = Array("C1", "B2", "A3")

    '勝っているか確認
    For i = 1 To 8
        For Each セル In ライン構成セル(i)
            If Range(セル) = "〇" Then
                勝利カウンタ = 勝利カウンタ + 1
            End If
        Next
        If 勝利カウンタ = 3 Then
            MsgBox "あなたの勝利です"
            Cells.Clear
            Exit Sub
        End If
        勝利カウンタ = 0
    Next
    '全て埋まっている場合は勝敗を確認
    For Each セル In Range("A1:C3")
        If セル <> "" Then
            飽和カウント = 飽和カウント + 1
        End If
    Next
    If 飽和カウント = 1 Then
        If Range("B2") = "" Then
            Range("B2") = "×"
            GoTo 勝敗判定
        End If
    End If
    
    If 飽和カウント = 9 Then
        GoTo 勝敗判定
    End If
    '一手勝ち確認
    For i = 1 To 8
        攻勢カウンタ = 0
        勝利のセル = ""
        For Each セル In ライン構成セル(i)
            If Range(セル) = "×" Then
                攻勢カウンタ = 攻勢カウンタ + 1
            End If
            If Range(セル) = "〇" Then
                Exit For
            End If
            If Range(セル) = "" Then
                勝利のセル = セル
            End If
            If 攻勢カウンタ = 2 And 勝利のセル <> "" Then
                Range(勝利のセル) = "×"
                GoTo 勝敗判定
        End If
        Next
    Next
    '一手負け防御
    For i = 1 To 8
        劣勢カウンタ = 0
        敗北のセル = ""
        For Each セル In ライン構成セル(i)
            If Range(セル) = "〇" Then
                劣勢カウンタ = 劣勢カウンタ + 1
            End If
            If Range(セル) = "×" Then
                Exit For
            End If
            If Range(セル) = "" Then
                敗北のセル = セル
            End If
            If 劣勢カウンタ = 2 And 敗北のセル <> "" Then
                Range(敗北のセル) = "×"
                GoTo 勝敗判定
            End If
        Next
    Next
    '〇が多いラインを確認
    For i = 1 To 8
        ライン非攻撃レベル(i) = 0
        For Each セル In ライン構成セル(i)
            If Range(セル) = "×" Then
                ライン防御判定(i) = True
            End If
            If Range(セル) = "〇" Then
                ライン非攻撃レベル(i) = ライン非攻撃レベル(i) + 1
            End If
        Next
        If ライン防御判定(i) Then
            ライン非攻撃レベル(i) = 0
        End If
    Next
    '防ぐラインを決定
    暫定防衛ライン非攻撃レベル = -1
    For i = 1 To 8
        飽和カウント = 0
        For Each セル In ライン構成セル(i)
            If Range(セル) <> "" Then
                飽和カウント = 飽和カウント + 1
            End If
        Next
        If 飽和カウント = 3 Then
            GoTo コンテニュー
        End If
        ランダム = Int(2 * Rnd)
        If ライン非攻撃レベル(i) > 暫定防衛ライン非攻撃レベル Then
            暫定防衛ライン = i
            暫定防衛ライン非攻撃レベル = ライン非攻撃レベル(i)
        ElseIf ライン非攻撃レベル(i) = 暫定防衛ライン非攻撃レベル And ランダム > 0 Then
            暫定防衛ライン = i
            暫定防衛ライン非攻撃レベル = ライン非攻撃レベル(i)
        End If
コンテニュー:
    Next
    '防ぐラインへ×を入れる
    For Each セル In ライン構成セル(暫定防衛ライン)
        ランダム = Int(2 * Rnd)
        If Range(セル) = "" And 暫定空きセル <> "" And ランダム > 0 Then
            Range(セル).Value = "×"
            GoTo 勝敗判定
        ElseIf Range(セル).Value = "" Then
            暫定空きセル = セル
        ElseIf 暫定空きセル <> "" Then
            Range(暫定空きセル).Value = "×"
            GoTo 勝敗判定
        End If
    Next
    If 暫定空きセル <> "" Then
        Range(暫定空きセル) = "×"
        GoTo 勝敗判定
    End If
    '勝敗の確認
勝敗判定:
    For i = 1 To 8
        For Each セル In ライン構成セル(i)
            If Range(セル) = "〇" Then
                勝利カウンタ = 勝利カウンタ + 1
            End If
            If Range(セル) = "×" Then
                敗北カウンタ = 敗北カウンタ + 1
            End If
        Next
        If 勝利カウンタ = 3 Then
            MsgBox "あなたの勝利です"
            Cells.Clear
            Exit Sub
        ElseIf 敗北カウンタ = 3 Then
            MsgBox "あなたの負けです"
            Cells.Clear
            Exit Sub
        ElseIf 飽和カウント = 9 Then
            MsgBox "引き分けです"
            Cells.Clear
            Exit Sub
        End If
        勝利カウンタ = 0
        敗北カウンタ = 0
    Next
End Sub

 

スポンサーリンク

最後に

forで繰り返す、ifで分岐するというプログラムの基本的な流れを見ることができたと思います。
またExcelVBAは文字通りエクセルなのでRangeプロパティを使うことでシートの内容を書き換えることができます。
こんなことでもないとマルバツゲームをやる機会はありません。
マルバツゲームを楽しんでください。

最後まで読んで頂き、ありがとうございます。

「この記事が参考になった」「お礼でコーヒー代をプレゼントしよう」という方がいましたらチップ(15円〜)をお願いいたします。

Amazonギフト券- Eメールタイプ - Amazonベーシック

メールのあて先は 「mizusibuki8080@gmail.com」です。
※上記のアドレスは投げ銭受け取り専用です。他のメールは受け取れない設定にしてあるのでご注意ください。

趣味のプログラム
ネットワークエンジニアになった人
タイトルとURLをコピーしました