オセロを作りながらマクロVBAを学ぼう4
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第4回です。
石を置ける場所の定義を、前回は文章で書きました、
今回は、それをもとにマクロVBAのプログラミングをしていきます。
まずは、前回のまとめの確認です。
自分の石を置ける場所の判定の整理
・8方向は、
For i = -1 To 1
For j = -1 To 1
これをネストする
・1方向に向かって順に置かれている石を判定
終了条件は、
・空白(石が置かれていない)
・自分の石が置かれている
自分の石が置かれていて終了した時、それまでに相手の石があるか
・8方向のいずれか一つでも、上記条件を満たせば、自分の石が置ける
セルをダブルクリックした時、
そこに石が置けるかどうかを判定し、メッセージボックスを表示するようにしてみます。
シート「オセロ」のシートモジュールにダブルクリックのイベントプロシージャーを追加します。

Sheet1(オセロ)
ここをダブルクリックします。
または、右クリックから「コードの表示」

この下にダブルクリックのイベントプロシージャーを追加します。

プロシージャーが追加されます。
左オブジェクト選択のドロップタ゜ウンを「Worksheet」を選択した時点で、
「Worksheet_SelectionChange」これが追加されてしまいます。
残したままでも特に問題はありませんが、削除しておきましょう。
以下のコードを追加してください。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean) Set TarggetSheet = Sheet1 Set 置く石 = Range("L2") Set 相手石 = Range("L3") If is置ける全方向(Target) Then MsgBox "置ける" Else MsgBox "置けない" End If Cancel = True End Sub |
引数の、
TargetはRangeオブジェクトです。
ダブルクリックしたセルになります。
標準モジュールに石が置けるかの判定を作ります。

Module1
ここをダブルクリック
または、右クリックから「コードの表示」
Option Explicit
これだけが入っているはずなので、その下に以下のコードを追加してください。
Public TarggetSheet As Worksheet Public 置く石 As Range Public 相手石 As Range Function is置ける全方向(ByVal Target As Range) As Boolean Dim i As Long Dim j As Long '既に石が置いてある場合は置けない If Target.Value <> "" Then is置ける全方向 = False Exit Function End If '8方向を順に判定 For i = -1 To 1 For j = -1 To 1 If is置ける1方向(Target, i, j) Then is置ける全方向 = True End If Next Next End Function Function is置ける1方向(ByVal Target As Range, _ ByVal i As Long, _ ByVal j As Long) As Boolean Dim r As Long Dim c As Long Dim is置く石 As Boolean Dim is相手石 As Boolean '石を置くセルの行列位置 r = Target.Row c = Target.Column With TarggetSheet '空白or置く石と同じ石が出てくるまで判定 Do r = r + i c = c + j '空白(石が置かれていない) If .Cells(r, c) = "" Then Exit Do End If '自分の石が置かれている If .Cells(r, c).Font.Color = 置く石.Font.Color Then is置く石 = True Exit Do End If '相手の石が置かれている If .Cells(r, c).Font.Color <> 置く石.Font.Color Then is相手石 = True End If Loop End With '自分の石が置かれていて終了した時、それまでに相手の石があるか If is置く石 = True And is相手石 = True Then is置ける1方向 = True End If End Function |
良く使うオブジェクトをオブジェクト変数のパプリック変数として定義しています。
Public TarggetSheet As Worksheet ・・・ オセロ盤があるシート
Public 置く石 As Range ・・・ 置く石が設定されているセル
Public 相手石 As Range ・・・ 相手の石が設定されているセル
「Worksheet_BeforeDoubleClick」
この中で、パブリック変数を設定してから、 「is置ける全方向」を呼び出します。
Cancel = True
これは、ダブルクリックの後にセル編集状態にならないように、イベントを終了させるためのものです。
Functionプロシージャー
プログラム内で特定の作業を実行し、値を返すプロシージャです。
Functionプロシージャーの括弧()の中に引数が指定されています。
これは、プロシージャーに引数を渡しています。
「is置ける全方向」
これで8方向を判定できるようにしています。
実際には3×3=9方向なのですがも行0列0の移動は石を置きたい場所なので、
既に石が置いてある場合は置けない判定で直ぐに判定が終了しています。
If is置ける1方向(Target, i, j) Then
これで、1方向でも「置ける」判定であれば、「置ける」と返すようにしています。
「is置ける1方向」
ここでは、「is置ける全方向」から渡された方向について判定をします。
If is置く石 = True And is相手石 = True Then
これで、相手の石があって、その先に置く石があることを判定しています。
.Font.Color
この違いで判定しているので、少しわかりずらいかもしれませんが、
個々のステートメントは極めて基本的なものだけとなっています。
変数の型として、Boolean(ブール型)を多用しています。
ブール型は、True,Falseの2値をとる変数です。
つまり、ON,OFFや有,無等々の状態判定に使います。
判定に必要な項目の状態を、その項目ごとにTrue,Falseを先に判定し設定しておくことで、
その後に、複数の項目の状態を判定し、全体として条件を満たしているかどうかを判定しています。
これは、判定が複雑な場合に良く使う手法ですので、ぜひマスターして下さい。
「自分の石を置ける場所の判定の整理」
この文章と、VBAコードを見比べて下さい。
参考程度ではありますが、VBA内にコメントを書いておきました。
実際に、オセロ盤をダブルクリックして動作確認してみて下さい。
石の配置を変更する場合は、シート保護を解除してからコピペで石を配置してください。
今回は、文章をVBAコードにする部分に注力しました。
これで、オセロゲームの根本的な部分のロジックができましたので、
次回からは、ゲームとしての機能を一つずつ追加していきます。
5へ続きます。
全体の目次
1.シートの用意と標準モジュールの挿入
2.ブックを開いたときの処理と初期配置
3.自分の石を置ける場所の判定の整理
4.自分の石を置ける場所の判定の実装
5.シート機能を拡張して今後の準備
6.黒石白石を交互に打って相手の石をひっくり返す
7.パス確認、終局確認、石数取得
8.石を置ける場所の表示とアニメーション
9.PC対戦の実装
10.置く場所に重みを付けて少しだけ強く
11.相手の応手を評価してさらに強く
12.PC対PCの対戦で強さを確認
13.パラメーターと重みを調整してさらに強く
14.やはり「待った」が欲しい
15.棋譜で対局を再現
16.これまでを振り返りつつ全体のまとめ
ここまでのサンプルファイルのダウンロード
同じテーマ「マクロVBAサンプル集」の記事
エクセルでファイル一覧を作成
アメブロの記事本文をVBAでバックアップする1
数独(ナンプレ)を解くVBAに挑戦1
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証1
ナンバーリンク(パズル)を解くVBAに挑戦1
ナンバーリンクを解くVBAのパフォーマンス改善1
オセロを作りながらマクロVBAを学ぼう
他ブックへのリンクエラーを探し解除
Excelシートの複雑な計算式を解析するVBA
新着記事 ・・・新着記事一覧を見る
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)
参照設定、CreateObject、オブジェクト式の一覧|VBA技術解説(1月20日)
VBAでファイルを規定のアプリで開く方法|VBA技術解説(1月20日)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)|VBA技術解説(1月19日)
他ブックへのリンクエラーを探し解除|VBAサンプル集(1月15日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.繰り返し処理(For Next)|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。