プログラミングの腕試しとしてマルバツゲームを作ろうと考えた。
- ExcelVBAでどんな事ができるのか知りたい
- 基本的なプログラムの構造を知りたい
こんな方に読んでもらいたいです。
使うもの
メインで使ったのはSelectionChangeというセルを選択したときに動作する機能。
あとは基本的なものだけ
- if
- for
- array
- Range
- Goto
ルール
- 左上の3*3のマスのみを使用する
- プレイヤーが先行の○(枠外を選択すればCPUが先行になる)
- 先に3列揃えば勝利
動き
1手目
右下に○を付けると、すぐさま真ん中に×を付けるCPU
2手目
左上に○を付けると、すぐさま右中に×を付けるCPU
3手目
左中に○
4手目
右上に○
5手目
下中に○を付けて引き分け
すぐさま画面をクリアして引き分けのメッセージボックスが表示される。
コード
開発-Visual Basic
画面左にあるプロジェクトのSheet1をダブルクリック
開いたウインドウの左上に(General)となっている部分をプルダウンからWorksheetを選択
後はプログラムウインドウに下のコードを貼り付ければOK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | 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プロパティを使うことでシートの内容を書き換えることができます。
こんなことでもないとマルバツゲームをやる機会はありません。
マルバツゲームを楽しんでください。