オセロを作りながらマクロVBAを学ぼう№7
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第7回です。
全部石が埋まっても、何も変化がない・・・
そもそも、どっちが勝っているのかもわからない・・・
・終局確認
・石数取得
先に、石数を表示するようにシートを少し変更しておきます。


N3 : 黒石の数を表示するセル、フォントと罫線を設定してください。
M4 : 「残り」と入力して、、フォントを設定してください。。
N4 : 数式を設定してください。「=64-N2-N3」

つまり、盤面の全てのセルで、
プロシージャー「is置ける全方向」の戻り値がFalseの状態
Sub パス確認()
Dim myRng As Range
Dim isPass As Boolean
With TargetSheet
isPass = True
For Each myRng In .Range("盤面")
If is置ける全方向(myRng, True) Then
isPass = False
Exit For
End If
Next
If isPass = True Then
If .Range("手番石").Font.Color = .Range("先番石").Font.Color Then
MsgBox "●先手番「" & Sheet1.cmb1.Text & "」" & vbLf & vbLf & "パス"
Else
MsgBox "○後手番「" & Sheet1.cmb2.Text & "」" & vbLf & vbLf & "パス"
End If
Call 手番交代
Call 置ける場所表示
Call 終局確認
End If
End With
End Sub
For Each myRng In .Range("盤面")
・・・
Next
これで、盤面の全てのセルを処理するようにして、
一つでもTrueが戻されれば石が置けるということです。
つまり、一つもTrueが返されない場合は、石を置く場所が無いという事です。
石を置く場所が無くパスの状態を、True
石を置く場所がある状態を、Flase
として使っています。
・黒石白石、どちらも置く場所がない状態
Sub 終局確認()
Dim myRng As Range
Dim isPass As Boolean
With TargetSheet
If WorksheetFunction.CountA(.Range("盤面")) = 64 Then
Call 終局処理
End
End If
isPass = True
For Each myRng In .Range("盤面")
If is置ける全方向(myRng, True) Then
isPass = False
End If
Next
If isPass = True Then
isPass = True
Set 置く石 = 相手石
For Each myRng In .Range("盤面")
If is置ける全方向(myRng, True) Then
isPass = False
End If
Next
If isPass = True Then
Call 終局処理
End
End If
End If
End With
Call 共通変数設定
End Sub
Sub 終局処理()
With TargetSheet
Select Case True
Case .Range("先番石").Offset(, 2).Value > .Range("後番石").Offset(, 2).Value
MsgBox "終局" & vbLf & vbLf & "●先手番「" & Sheet1.cmb1.Text & "」の勝ちです。"
Case .Range("先番石").Offset(, 2).Value < .Range("後番石").Offset(, 2).Value
MsgBox "終局" & vbLf & vbLf & "○後手番「" & Sheet1.cmb2.Text & "」の勝ちです。"
Case Else
MsgBox "終局" & vbLf & vbLf & "引き分けです。"
End Select
.Range("手番石").Clear
.Range("手番石").Offset(, 1).ClearContents
End With
End Sub
実際には、
「黒石白石、どちらも置く場所がない状態」というのは、
「64マス全てに石が置かれた状態」この状態も含んでいるので、
「黒石白石、どちらも置く場所がない状態」これだけの判定でもよいのですが、
形式的にも、全て打ち終わった場合の判定を入れておいた方が良いだろうと思って入れています。
WorksheetFunction.CountA
For Each myRng In .Range("盤面")
If is置ける全方向(myRng, True) Then
isPass = False
End If
Next
これで、盤面のどこにも石が置けない状態を判定できますので、
黒石と白石の両方で検査すれば良いという事です。
メッセージと手番石のクリア部分を別のプロシージャーにしているのは、
2箇所で必要になっているので、
無駄のないように別プロシージャーにしています。
勝敗の判定は、石数取得で設定しているセル数値数値を使っています。
L2セルL3セルに名前定義をしているので、そこから2列右ということで、
Offsetプロパティを使って、右に2列移動して取得しています。
石数取得
Sub 石数取得()
Dim myRng As Range
Dim cnt先番 As Long
Dim cnt後番 As Long
With TargetSheet
For Each myRng In .Range("盤面")
If myRng <> "" Then
If myRng.Font.Color = .Range("先番石").Font.Color Then
cnt先番 = cnt先番 + 1
Else
cnt後番 = cnt後番 + 1
End If
End If
Next
.Range("先番石").Offset(, 2) = cnt先番
.Range("後番石").Offset(, 2) = cnt後番
End With
End Sub
L2セルL3セルに名前定義をしているので、そこから2列右ということで、
Offsetプロパティを使って、右に2列移動したセルに設定しています。
そろそろ、PC対戦の機能を入れたいところですが、
PC対戦となると、結構複雑になります。
そこで、次回はPC対戦の機能を入れる前に、
気になる細かい部分を変更しておきます。
全体の目次
ここまでのサンプルファイルのダウンロード
新着記事NEW ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- オセロを作りながらマクロVBAを学ぼう№7
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。