ExcelマクロVBAサンプル集
オセロを作りながらマクロVBAを学ぼう№16

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2017-12-06

オセロを作りながらマクロVBAを学ぼう№16


ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第16回です。


15回に渡って、オセロ作成をしてきました、
マクロVBAコードはかなりの量になっています。
今回は最終回として、これまでを振り返ってみます。

№1.シートの用意と標準モジュールの挿入
シートの用意と、標準モジュールの挿入という、
マクロをやった事のない人にもわかるレベルから始めました。

№2.ブックを開いたときの処理と初期配置
イベントプロシージャーを作りました。
こういうソフト(ゲーム)の場合には、避けて通れないのがイベントになります。
イベントを完全に理解するのは、少々大変かもれませんが、
記事では、操作中心に記載しました。

№3.自分の石を置ける場所の判定の整理
自分の石を置ける場所の判定
これをじっくり解説しました。
本シリーズで最も伝えたい部分になります。
やりたいことを整理して、簡潔にまとめる
これこそが、マクロVBA上達に一番大切な事です。

№4.自分の石を置ける場所の判定の実装
文章で書いたものを、マクロVBAで記述する。
まさに、一番苦労する部分でもあります。
ここを乗り切るのは大変です。
その為にも、先にしっかりと文章化しておくことが重要だという事です。

№5.シート機能を拡張して今後の準備
名前定義をしました。
VBAで、セル番地を直接書くと、分かりずらい事とセル位置の変更が大変です。
名前定義をすることで、VBAを読みやすく、そして、シートの変更に柔軟に対応できるようにしています。

№6.黒石白石を交互に打って相手の石をひっくり返す
追加した機能は、
・ダブルクリックされた位置に手番の石を置く。
・相手の石を挟んでいたら、その相手の石を手番の石に取り替える。
・手番を交代します。
機能は難しそうですが、VBAコードの追加は割と少なくて済みました。
それまでに作成したプロシージャーがしっかりしていたという事です。


№7.パス確認、終局確認、石数取得
パスとは
終局とは
これらの定義をしてから、マクロVBAコードを作成しています。
定義をしっかりしないと、このような処理はVBAコードを書くことが出来ません。

№8.石を置ける場所の表示とアニメーション
ゲームとしての雰囲気も大事なので、
オセロに限らず、ゲームは楽しさが必要だと思います。

№9.PC対戦の実装
まずは、置ける場所からランダムに石を置くという機能で実装しました。
いきなり完成形を作ろうとせず、最低限の機能を実装して、動作確認しています。
これは、ゲームに限らず、ソフト作成時には常に意識すべき手順になります。

№10.置く場所に重みを付けて少しだけ強く
オセロとして、少しはまともなゲームが出来るようにしました。
オセロ初心者は、この置く場所の重みを少し意識するだけである程度強くなれます。
ソフトとしても、間違いなく強くなッたはずです。

№11.相手の応手を評価してさらに強く
テーブルゲームに勝つための最大の要素は、
相手の手を考えることです。
相手に良い手を打たせない、そのように自分が打つことが勝利への近道です。
悪手とは、相手に対応する良い手があるという事なのです。
相手の可能な応手を数値化して判定するようにしました。
これで、かなり強くなったはずです。

№12.PC対PCの対戦で強さを確認
ソフトの強さを判定するには、実際に戦わせてみるのが一番です。
というか、ゲームなので、実際に戦ってみないと強さは分からないです。
何十戦、何百戦と、PC同士で戦わせた結果をみられるようにしました。

№13.パラメーターと重みを調整してさらに強く
自分の打つ手、相手の応手、
これを数値化する部分の調整と、
新たに、評価項目を追加して、より強くしました。
強くなったかは、実際にPC同士で戦わせて確認します。
確実に強くなったことが確認出来ました。

№14.やはり「待った」が欲しい
あくまで個人で楽しむソフトなので、楽しめるような機能を追加しました。

「待った」が楽しいかどうかは疑問もありますが・・・
「待った」の実装の為には、棋譜も必要なので保存できるようにしました。

№15.棋譜で対局を再現
棋譜があつかえるようになったので、
せっかくなので棋譜とおりに対局を再現できるようにしました。
1手ずつ見ていくことで、敗因・勝因もわかるようになる・・・かも
これにより、他で作成された棋譜(があれば)も再現できるはずです。


最後の機能追加
シートの見出しが邪魔な感じがします。

マクロVBAサンプル

オセロの座標と、エクセルの行列見出しがあり、
ちょっと勘違いしやすくなってしまっています。
この見出しを消すには、

マクロVBAサンプル

表示→見出し
このチェックを外します。
そこで、ブックを開いたら、マクロでそれをやってしまいましょう。

ActiveWindow.DisplayHeadings = False

この一文を、
ThisWorkbook内のWorkbook_Openイベントに追記します。
追記する場所は、どこでも良いのですが、

      .AddItem "PC5"
      .AddItem "PC6"
    End With
    ActiveWindow.DisplayHeadings = False
    .Protect
  End With
End Sub

シート保護する直前に入れました。



作成したソフトの最強でも、私には勝てません。
今回のソフトは、
自分が打つ→相手が打つ
ここまでしか判断していません。
中盤までは、場所の重みと相手の手までを考えれば、とりあえずは十分ですが、
終盤近くになると、もう少し先を考えないと勝てなくなります。
私ですと、
自分が打つ→相手が打つ→自分が打つ
終盤では、最低でもここまでは考えます。
従って、私に勝つには、最低でももう1手先まで評価する必要があります。
しかし、
置ける場所が8箇所だとしたら、
3手先は、
8×8×8=512
この中から最善手を選ぶことになりますので、かなり高度な判定が必要になります。
プログラミングテクニックも高度なものが必要となってきます。
プログラミングテクニックはともかく、
オセロとしての、効率的な最善手の判定方法は調べなければ私にはわかりません。
私自身、それほどオセロが強いわけではありません。
今回作成したソフトのロジックは、私がオセロを打つときに考えていることをVBAコードにしただけであり、
しかも、先読みも2手先までとなっているので、そんなに強くなるはずがありません。
今後時間が取れて、良い案が出たら続きを作成するかもしれませんが、多分ないと思います。

今回のシリーズとしての目的は、
思考を論理的に整理し、それをプログラミング言語に表す
オセロを打つとは、どういう事か
オセロで勝つためには、どのように打てば良いか
これらを、自分で考えて、それをマクロVBAで書くととどうなるか
今回の記事は、ここに注力して書いてみました。


全体の目次


ここまでのサンプルファイルのダウンロード




同じテーマ「マクロVBAサンプル集」の記事

エクセルでファイル一覧を作成
アメブロの記事本文をVBAでバックアップする№6
数独(ナンプレ)を解くVBAに挑戦№5
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№4
ナンバーリンク(パズル)を解くVBAに挑戦№8
ナンバーリンクを解くVBAのパフォーマンス改善№3
オセロを作りながらマクロVBAを学ぼう№9
他ブックへのリンクエラーを探し解除するマクロ(変更前)
Excelシートの複雑な計算式を解析するVBAの関数構文


新着記事NEW ・・・新着記事一覧を見る

Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • オセロを作りながらマクロVBAを学ぼう№16

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ