Excelオセロゲーム作りへの挑戦
- senritsuki
- 20493
- 0
- 0
- 0
Excel2010、ユーザインターフェースがガラっと変わってるね、Excel2003と比べると。 慣れるまでが大変そうだ。
2012-02-12 11:58:10お題は「オセロゲーム」。 プラットフォームは「Windows7 + Excel2010」。 開発言語は「Visual Basic for Applications」。 では、作りはじめるよ!
2012-02-12 14:35:21(Excelオセロ作り)(1) まず、ベースのデザインを決定。あとで変えるかもしれないけれど、とりあえずシンプルに。 http://t.co/juq7QHtO
2012-02-12 14:52:43(Excelオセロ作り)(2) ベースのデザインを生成する関数。 これには、エクセルの「マクロを記録」機能が大活躍。幾つかコメントを追加するだけでOK。 http://t.co/HXPjMzQF
2012-02-12 15:01:49(Excelオセロ作り)(3) オセロ盤のデータ構造の検討。 「空」「黒」「白」の3種の値を取り得る、8*8の配列を用意すればいいかな。
2012-02-12 15:07:18(Excelオセロ作り)(4) グローバル定数とグローバル変数を用意。 それと、オセロボードの初期化と表示を行う関数を作成。 http://t.co/s9Nmdc2u
2012-02-12 15:17:09(Excelオセロ作り)(5) 「出力」「データ管理」ときたら、次に作るべきは「入力」だね。ユーザが選んだマスに、石を置く関数を作ろう。
2012-02-12 15:21:05(Excelオセロ作り)(6) 「ユーザが選んだマス」を、どう定義する……? ここではその定義を、「ユーザがダブルクリックしたマス」としよう。 すると、作るべきは「WorksheetのBeforeDoubleClick関数」だね。
2012-02-12 15:30:03(Excelオセロ作り)(7) 現在オセロゲームを実行中か否か、実行中の場合、黒と白、どちらのターンなのかを管理するための変数を追加。 考え方はデザインパターンの「Stateパターン」だけど、実装はSwitch文です。 http://t.co/bQJy0flH
2012-02-12 16:14:14(Excelオセロ作り)(8) Worksheet_BeforeDoubleClick関数。 ゲーム実行中状態であり、かつダブルクリックされたセルがオセロボードの範囲内であれば、そこにアクティブターン側の石を置き、相手ターンに移ります。 http://t.co/WyFgQHXA
2012-02-12 16:21:11(Excelオセロ作り)(9) ただしこの実装では、ボード内であればどのマスにも石を置けてしまう。 なので、次は石を置けるマスと置けないマスを見分ける関数を作ります。
2012-02-12 16:23:41(Excelオセロ作り)(10) マスの位置と置く石の色を指定したとき、相手の石を何個ひっくり返せるか?を調べる関数。 ポイントは4つ。 http://t.co/W9moyOks
2012-02-12 17:25:13(Excelオセロ作り)(11) <1>既に石が置かれているマスには置けない。 続いて、上下左右斜めの八方向に対して、次の<2>~<4>の観点で、石をひっくり返せるか?を調査する。
2012-02-12 17:29:13(Excelオセロ作り)(12) 相手の石があり、その先に「<2>自分の色の石」があれば、その石と置く石の間にある相手の石をひっくり返すことができる。 逆に、自分の色の石ではなく、「<3>ボードの外側」「<4>空白マス」に行き着いた場合、相手の石をひっくり返すことはできない。
2012-02-12 17:36:17(Excelオセロ作り)(13) Worksheet_BeforeDoubleClickで、石を置けるマスを、相手の石を1個以上ひっくり返すことが出来るマスのみに制限。そして、置くと同時に相手の石をひっくり返すように修正。 http://t.co/6Wc03k92
2012-02-12 17:43:42(Excelオセロ作り)(14) ここまでで、お互いに石をひっくり返し合って遊ぶことが出来るようになりました! けれど、遊ぶからには勝敗はきっちり付けたいところ。 というわけで次は、ゲーム終了時の勝敗判定処理を作ります。 http://t.co/ysczBFF6
2012-02-12 17:47:07しまった、「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(Excelオセロ作り)(15) ふぅ、ようやく完成! 何度か作業を中断しているとはいえ、だいぶ時間がかかってしまいました。 http://t.co/pi6dMk7M
2012-02-12 21:22:06(Excelオセロ作り)(反省1) 定数宣言、変数宣言、ゲーム開始処理、ゲーム終了処理。 課題:プレイヤーの種類(人間かコンピュータか、コンピュータのアルゴリズムはどれにするか)を、ゲーム開始時に選択できるようにしたい。 http://t.co/4kAeYFGK
2012-02-12 21:31:07(Excelオセロ作り)(反省2) メインループ処理。ゲーム開始から終了まで、このループを回りつつターンを進めます。 ユーザのターンであれば、ユーザのダブルクリックを待つために一時的にループを脱出。そして……、 http://t.co/eK9DrXwU
2012-02-12 21:34:25(Excelオセロ作り)(反省3) ユーザからのダブルクリック入力を受け取ったら、ユーザのターンを実施。 ダブルクリックされたマスに石を置けるならば、石を置いて相手の石をひっくり返し、相手のターンに移ります。 http://t.co/zjUW06LP
2012-02-12 21:39:58(Excelオセロ作り)(反省4) ターン変更処理とゲーム終了処理。ターン変更ごとに次プレイヤーの石の置き場の有無を調べ、あればターン変更、無ければスキップ。互いのプレイヤーが連続スキップしたならば、置ける場所ナシによりゲームセット。 http://t.co/CaJJiA8i
2012-02-12 21:45:19(Excelオセロ作り)(反省5) 「ボード上に石を置けるマスが幾つあるか調べる」「指定位置に石を置いたとき、相手の石を幾つひっくり返せるか調べる」関数。実際にひっくり返すのもここ。地味ながらゲーム進行に欠かせず、かつバグが出やすい部分。 http://t.co/uV4j1W38
2012-02-12 21:55:10