オセロを作りながらマクロVBAを学ぼう№9
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第9回です。
さて、ここからはPC対戦の機能を入れていきます。
とにかく自動で打つことができる機能を入れてみます。
・「PC」が手番の時に打つべき場所を決める
・「PC」が手番の時に石を打つ
・PCが打つときは、少し待ち時間を作る
・PCvsPCの時は、待ち時間を無くす。
・PCvsPCの時は、パスのメッセージを表示しない。
打つべき場所を決める
ここになりますが、
今回は、打てる場所から適当に選択することにします。
適当に打つので、当然弱いのはあたりまえです。
とにかく、自動で打ち返してくれるようにします。
さらに、PCvsPCで、全自動対戦もできるようにしておきます。
標準モジュールを挿入して、
Module2
新規プロシージャーは、こちらに追記していくことにします。
手番がPCならTrueを返すFunctionを作成します。
Like "PC*"
このようにしたのは、
今後、PCの強さによって複数作った時のための布石になります。
Function isPC() As Boolean
isPC = False
With TargetSheet
If .Range("手番石").Font.Color = .Range("先番石").Font.Color Then
If Sheet1.cmb1.Text Like "PC*" Then
isPC = True
End If
Else
If Sheet1.cmb2.Text Like "PC*" Then
isPC = True
End If
End If
End With
End Function
Like "PC*"
このようにしたのは、
今後、PCの強さによって複数作った時のための布石になります。
既に、石が置けるかどうかの判定は出来ています。
is置ける全方向
これを使って、石が置ける場所を全て取得します。
配列を使っています、配列については、
配列の使い方について
石が置ける場所を、
is置ける全方向
これで取得したら、その場所(セル)を配列に入れます。
全ての置ける場所が取得出来たら、
配列のなかから、ランダムに1セルに決めます。
Rnd
これを使う前に、
Randomize
こちらを実行しておかないと、乱数表が更新されないので、結果として毎回同じになってしまいます。
配列の要素数内での乱数作成になります。
指定範囲内の乱数は、一般的には、
Int((最大値 - 最小値 + 1) * Rnd + 最小値))
となります。
今回の場合は、配列の最小値は0なので、数式が簡単になってます。
is置ける全方向
これを使って、石が置ける場所を全て取得します。
Function 次手候補() As Range
Dim ix As Long
Dim myRng As Range
Dim aryRng() As Range
With TargetSheet
ix = 0
For Each myRng In .Range("盤面")
If is置ける全方向(myRng, True) Then
ReDim Preserve aryRng(ix)
Set aryRng(ix) = myRng
ix = ix + 1
End If
Next
Randomize
ix = Int(Rnd * (UBound(aryRng) + 1))
Set 次手候補 = aryRng(ix)
End With
End Function
配列を使っています、配列については、
配列の使い方について
・配列とは ・1次元の配列 ・2次元の配列 ・3次元以上の配列 ・動的配列 ・動的配列 ・動的配列の要素数の取得 ・配列使用時の注意
動的配列・ReDimステートメント ・要素数の変更について ・配列について
これらのページを参照してください。is置ける全方向
これで取得したら、その場所(セル)を配列に入れます。
全ての置ける場所が取得出来たら、
配列のなかから、ランダムに1セルに決めます。
Rnd
これを使う前に、
Randomize
こちらを実行しておかないと、乱数表が更新されないので、結果として毎回同じになってしまいます。
配列の要素数内での乱数作成になります。
指定範囲内の乱数は、一般的には、
Int((最大値 - 最小値 + 1) * Rnd + 最小値))
となります。
今回の場合は、配列の最小値は0なので、数式が簡単になってます。
・PCが打つときは、少し待ち時間を作る
・PCvsPCの時は、待ち時間を無くす。
・PCvsPCの時は、パスのメッセージを表示しない。
ここは細かい修正になります。
赤太字が変更箇所です。
PCvsPCの判定と、
PCが先番の時に、直ぐに打ち始めるようにしています。
人間にしろPCにしろ、
石を置くときはは、このプロシージャーを経由させていますので、
次の手番がPCの時には、自動で撃たせるようにしています。
ここは、PCvsPCの時にメッセージを表示しないようにしているだけです。
赤太字が変更箇所です。
Option Explicit
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public TargetSheet As Worksheet
Public 置く石 As Range
Public 相手石 As Range
Public isPCvsPC As Boolean
Sub 対戦開始()
With TargetSheet
If WorksheetFunction.CountA(.Range("盤面")) > 4 Then
If MsgBox("対局途中です。" & vbLf & vbLf & _
"新規対局を開始してもよろしいですか?", _
vbYesNo, "確認") = vbNo Then
Exit Sub
End If
End If
If Sheet1.cmb1.Text Like "PC*" And Sheet1.cmb2.Text Like "PC*" Then
isPCvsPC = True
Else
isPCvsPC = False
End If
.Range("先番石").Copy Destination:=.Range("手番石")
.Range("手番石").Offset(, 1) = "の番です。"
.Range("盤面").ClearContents
Call 共通変数設定
Call 石を置く(.Range("盤面").Cells(4, 5), 置く石)
Call 石を置く(.Range("盤面").Cells(5, 4), 置く石)
Call 石を置く(.Range("盤面").Cells(4, 4), 相手石)
Call 石を置く(.Range("盤面").Cells(5, 5), 相手石)
Call 置ける場所表示
If isPC Then
Call 次手着手(次手候補)
End If
End With
End Sub
PCvsPCの判定と、
PCが先番の時に、直ぐに打ち始めるようにしています。
Sub 次手着手(ByVal Target As Range)
Call 共通変数設定
If is置ける全方向(Target, False) Then
Call 手番交代
Call 置ける場所表示
Call 終局確認
Call パス確認
If isPC Then
If Not isPCvsPC Then
Sleep 400
End If
Call 次手着手(次手候補)
End If
End If
End Sub
人間にしろPCにしろ、
石を置くときはは、このプロシージャーを経由させていますので、
次の手番がPCの時には、自動で撃たせるようにしています。
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 Not isPCvsPC Then
If .Range("手番石").Font.Color = .Range("先番石").Font.Color Then
MsgBox "●先手番「" & Sheet1.cmb1.Text & "」" & vbLf & vbLf & "パス"
Else
MsgBox "○後手番「" & Sheet1.cmb2.Text & "」" & vbLf & vbLf & "パス"
End If
End If
Call 手番交代
Call 置ける場所表示
Call 終局確認
End If
End With
End Sub
ここは、PCvsPCの時にメッセージを表示しないようにしているだけです。
大きな変更も無く、割と簡単にPC対戦を実装できました。
ルールだけ聞いた人が、いきなり始めたととしても大抵は勝てるレベルになります。
とにかく打てる場所に適当に置いているのですから仕方ありません。
次回は、置く場所を少し厳選してもう少し強くします。
全体の目次
はじめに
ExcelマクロVBAでオセロ(リバーシ)を作っていきながら、マクロVBAを学んで行きましょう。目的は、マクロVBAの学習であり、思考を整理しVBAでプログラミングする学習です。従って、強いソフトを作ることが目的ではありませんので、最近流行のAIなんちゃら…なんていうのは考えるつもりはありません。
№1.シートの用意と標準モジュールの挿入ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第1回です。まずはシートを用意しなければなりません、このシートの作り方で、その後の手間が随分と変わってきますので、しっかりと作ります。とはいえ、まずは一般的な感じで作ってみます、今後必要に応じて追加・変更していきます。
№2.ブックを開いたときの処理と初期配置ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第2回です。前回でシートの準備と標準モジュールを挿入しましたので、今回からは、マクロVBAをどんどん書き足していきます。まずは、イベントプロシージャーを作っていきます。
№3.自分の石を置ける場所の判定の整理ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第3回です。いよいよ自分の石を置いて、相手の石をひっくり返す処理に進むのですが、その前に、そもそも自分の石を置ける場所はどこなのか…。クリックしたセルは、自分の石を置いて良いセルなのかの判定が必要です。
№4.自分の石を置ける場所の判定の実装ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第4回です。石を置ける場所の定義を、前回は文章で書きました、今回は、それをもとにマクロVBAのプログラミングをしていきます。考え方は決定しているので、後はVBAに翻訳(コーディング)していくだけです。
№5.シート機能を拡張して今後の準備ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第5回です。前回で石を置ける場所の判定が完成しましたので、これからは、ゲームとしての機能を一つずつ追加していきます。まずは、石を置ける場所の色を変更してわかりやすくしてみます。
№6.黒石白石を交互に打って相手の石をひっくり返すExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第6回です。いよいよ今回は、黒石白石を交互に打てるようにします。もちろん、相手の石を挟んでいる場所は、自分の石に取り替えます。
№7.パス確認、終局確認、石数取得マクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第7回です。前回までで、黒石白石を交互に打つことができるようになりましたが、まだまた不都合な点があります。石を打つ場所がない時に、パスが出来ないから先に進まない… 全部石が埋まっても、何も変化がない… そもそも、どっちが勝っているのかもわからない……
№8.石を置ける場所の表示とアニメーションExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第8回です。前回までで大分ゲームらしくなってきました。そろそろ、PC対戦の機能を入れたいところですが、今回は、はPC対戦の機能を入れる前に、気になる細かい部分を変更しておきます。
№9.PC対戦の実装ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第9回です。前回までで人が打つのであれば不自由のない機能が実装できたと思います。さて、ここからはPC対戦の機能を入れていきます。
№10.置く場所に重みを付けて少しだけ強くExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第10回です。前回は、PCが自動で打つ機能を実装しました。強さはともかく、とにかくPCが勝手に売ってくれるようになりました。
№11.相手の応手を評価してさらに強くマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第11回です。前回の石を置く場所に重みを付けることで、超々初心者なら勝てるかもしれないというレベルにはなりました。ですが、ある程度オセロをやった事のある人なら、まあ負けることはないでしょう 今回は、自分の打つ場所ではなく、
№12.PC対PCの対戦で強さを確認ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、相手の応手を判定して、自分の置く場所を決められるようにしました。オセロソフトとしては、そこそこの強さになりました。
№13.パラメーターと重みを調整してさらに強くExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、PC1からPC5までの5段階の状態で、総当り対戦で強さを判定しましたが、PC5が最も強い事が確認出来ました。それでもPC5では、まだまだ、ある程度オセロをやった事のある人には勝てないレベルです。
№14.やはり「待った」が欲しいExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第14回です。前回で、6段階の強さのPCオセロが完成しました、一番強いPC6でも、まだまだそれほどの強さとは言えませんが、初心者の人なら苦戦するでしょうし、私も油断すれば負けてしまうくらいの強さにはなっています。
№15.棋譜で対局を再現ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第15回です。棋譜が扱えるようになり、「待った」の実装も出来ました。棋譜が扱えるようになったので、今回は、対局を再現できるようにします。
№16.これまでを振り返りつつ全体のまとめExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第16回です。15回に渡って、オセロ作成をしてきました、マクロVBAコードはかなりの量になっています。今回は最終回として、これまでを振り返ってみます。
ここまでのサンプルファイルのダウンロード
新着記事NEW ・・・新着記事一覧を見る
Excelの新機能「リストとセル内配列」:1つのセルに複数の値|エクセル入門(2026-09-28)
Excel関数クロスワード(2026-09-26)
Excelショートカットキークイズ(2026-09-23)
Excel関数名クイズ(2026-09-21)
気ままに一手|リレー将棋(2026-09-20)
ITエンジニアがトラブルを避けるための法律・契約入門|エクセル雑感(2026-09-18)
ITエンジニアなら知らないと恥ずかしい数学20選|エクセル雑感(2026-09-17)
ITエンジニアのための税金と社会保険のお話|エクセル雑感(2026-09-15)
ITエンジニアのための経理・会計・簿記入門|エクセル雑感(2026-09-12)
「Python in Excel」入門:コードを読むための基礎知識|エクセル関数応用(2026-09-10)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.Excelショートカットキー一覧|Excelリファレンス
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.マクロとは?VBAとは?VBAでできること|VBA入門
8.繰り返し処理(For Next)|VBA入門
9.メッセージボックス(MsgBox関数)|VBA入門
10.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- オセロを作りながらマクロVBAを学ぼう№9
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.
