Excelオセロゲーム作りへの挑戦

「【プログラミング】オセロを1時間で作ってみた【実況解説】」 という動画に触発され、「Excelオセロゲーム作り」に挑む……。 そんな挑戦の過程と結果を、今後の備忘録として、後日振り返られるようにまとめてみました。 続きを読む
5
センリツキ@C96 3日目 西3O43b @senritsuki

Excel2010、ユーザインターフェースがガラっと変わってるね、Excel2003と比べると。 慣れるまでが大変そうだ。

2012-02-12 11:58:10
センリツキ@C96 3日目 西3O43b @senritsuki

さて、と。 最近読書ばっかりだったし、久々にプログラミングに挑戦するよ!

2012-02-12 14:28:19
センリツキ@C96 3日目 西3O43b @senritsuki

お題は「オセロゲーム」。 プラットフォームは「Windows7 + Excel2010」。 開発言語は「Visual Basic for Applications」。 では、作りはじめるよ!

2012-02-12 14:35:21
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(1) まず、ベースのデザインを決定。あとで変えるかもしれないけれど、とりあえずシンプルに。 http://t.co/juq7QHtO

2012-02-12 14:52:43
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(2) ベースのデザインを生成する関数。 これには、エクセルの「マクロを記録」機能が大活躍。幾つかコメントを追加するだけでOK。 http://t.co/HXPjMzQF

2012-02-12 15:01:49
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(3) オセロ盤のデータ構造の検討。 「空」「黒」「白」の3種の値を取り得る、8*8の配列を用意すればいいかな。

2012-02-12 15:07:18
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(4) グローバル定数とグローバル変数を用意。 それと、オセロボードの初期化と表示を行う関数を作成。 http://t.co/s9Nmdc2u

2012-02-12 15:17:09
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(5) 「出力」「データ管理」ときたら、次に作るべきは「入力」だね。ユーザが選んだマスに、石を置く関数を作ろう。

2012-02-12 15:21:05
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(6) 「ユーザが選んだマス」を、どう定義する……? ここではその定義を、「ユーザがダブルクリックしたマス」としよう。 すると、作るべきは「WorksheetのBeforeDoubleClick関数」だね。

2012-02-12 15:30:03
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(7) 現在オセロゲームを実行中か否か、実行中の場合、黒と白、どちらのターンなのかを管理するための変数を追加。 考え方はデザインパターンの「Stateパターン」だけど、実装はSwitch文です。 http://t.co/bQJy0flH

2012-02-12 16:14:14
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(8) Worksheet_BeforeDoubleClick関数。 ゲーム実行中状態であり、かつダブルクリックされたセルがオセロボードの範囲内であれば、そこにアクティブターン側の石を置き、相手ターンに移ります。 http://t.co/WyFgQHXA

2012-02-12 16:21:11
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(9) ただしこの実装では、ボード内であればどのマスにも石を置けてしまう。 なので、次は石を置けるマスと置けないマスを見分ける関数を作ります。

2012-02-12 16:23:41
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(10) マスの位置と置く石の色を指定したとき、相手の石を何個ひっくり返せるか?を調べる関数。 ポイントは4つ。 http://t.co/W9moyOks

2012-02-12 17:25:13
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(11) <1>既に石が置かれているマスには置けない。 続いて、上下左右斜めの八方向に対して、次の<2>~<4>の観点で、石をひっくり返せるか?を調査する。

2012-02-12 17:29:13
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(12) 相手の石があり、その先に「<2>自分の色の石」があれば、その石と置く石の間にある相手の石をひっくり返すことができる。 逆に、自分の色の石ではなく、「<3>ボードの外側」「<4>空白マス」に行き着いた場合、相手の石をひっくり返すことはできない。

2012-02-12 17:36:17
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(13) Worksheet_BeforeDoubleClickで、石を置けるマスを、相手の石を1個以上ひっくり返すことが出来るマスのみに制限。そして、置くと同時に相手の石をひっくり返すように修正。 http://t.co/6Wc03k92

2012-02-12 17:43:42
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(14) ここまでで、お互いに石をひっくり返し合って遊ぶことが出来るようになりました! けれど、遊ぶからには勝敗はきっちり付けたいところ。 というわけで次は、ゲーム終了時の勝敗判定処理を作ります。 http://t.co/ysczBFF6

2012-02-12 17:47:07
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

しまった、「Dim othello_board(8, 8)」だと、9*9=81の二次元配列が出来てしまうのか! そして「For i = 0 to Board_Size」かつ「Board_Size = 8」だと、Forのループ回数は8回ではなく9回。

2012-02-12 19:46:37
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(15) ふぅ、ようやく完成! 何度か作業を中断しているとはいえ、だいぶ時間がかかってしまいました。 http://t.co/pi6dMk7M

2012-02-12 21:22:06
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(反省1) 定数宣言、変数宣言、ゲーム開始処理、ゲーム終了処理。 課題:プレイヤーの種類(人間かコンピュータか、コンピュータのアルゴリズムはどれにするか)を、ゲーム開始時に選択できるようにしたい。 http://t.co/4kAeYFGK

2012-02-12 21:31:07
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(反省2) メインループ処理。ゲーム開始から終了まで、このループを回りつつターンを進めます。 ユーザのターンであれば、ユーザのダブルクリックを待つために一時的にループを脱出。そして……、 http://t.co/eK9DrXwU

2012-02-12 21:34:25
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(反省3) ユーザからのダブルクリック入力を受け取ったら、ユーザのターンを実施。 ダブルクリックされたマスに石を置けるならば、石を置いて相手の石をひっくり返し、相手のターンに移ります。 http://t.co/zjUW06LP

2012-02-12 21:39:58
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(反省4) ターン変更処理とゲーム終了処理。ターン変更ごとに次プレイヤーの石の置き場の有無を調べ、あればターン変更、無ければスキップ。互いのプレイヤーが連続スキップしたならば、置ける場所ナシによりゲームセット。 http://t.co/CaJJiA8i

2012-02-12 21:45:19
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

(Excelオセロ作り)(反省5) 「ボード上に石を置けるマスが幾つあるか調べる」「指定位置に石を置いたとき、相手の石を幾つひっくり返せるか調べる」関数。実際にひっくり返すのもここ。地味ながらゲーム進行に欠かせず、かつバグが出やすい部分。 http://t.co/uV4j1W38

2012-02-12 21:55:10
拡大
センリツキ@C96 3日目 西3O43b @senritsuki

ボードの初期化や描写は、最初に載せたときからほぼそのままなので、飛ばすとして……、

2012-02-12 21:57:28