さて、得意の長い前置きはともかくとして、言いたかったのは、今回のオセロソフトは、コンピューターとの対戦を目的としたものではなくて、あくまで人間2人が対戦するためのオセロ盤を目的としていると言うことです。
設 計
どんな「ちょっとしたプログラム」でも、何をしたいかが明確で無ければ始められない。プログラミングとは自分の「思想」や「意志」を記号化する作業だからである。などと偉そうに言って、今までは完成予想図をここに見せていた訳ですが、何せ今回はオセロ盤ですから、絵を見なくても誰でも想像できるでしょう。 もう一つは、NSObjectのサブクラスにMyDelegateと言うのを定義してインスタンス化してあります。これはお決まりのFilesOwnerのデリゲートとして、初期化メソッドであるapplicationDidFinishLaunchingを実行するつもりでこう言う名前にしたのですが、それだけでなく、myOutletが一番左上のボタンに配線してあって、一番右下のボタンのmyOutletからはこのインスタンスに配線がしてあります。また、ラジオボタンやテキストフィールド、リセットボタンなども、このインスタンスと配線されています。
例えば、盤面の白の数と黒の数を集計しろと、一番左上のボタンにメッセージを送ると、64個ぐるっと巡って、自分に集計結果が帰ってくる仕組みになっています。これをテキストボックスに書き込む訳です。
「MyButton部」のコーディング
クラス変数(定数)の解説NSMutableArray *buttonArrayインスタンス変数の解説
64個のボタンに0〜63の連番を付けて、その番号のボタンオブジェクトへのポインタが初期化処理で格納される配列。int dir[]={ 1,-7,-8,-9,-1,7,8,9 }
自分から見て、右側を方向0として、反時計回りに8つの方向に対して0〜7の数字を割り振った場合に、方向0へ行くと言うことは連番を1増やすことであり、方向1へ行くと言うことは連番を7減らすことである。このような考えのもとに、方向を示す数字と、連番の増減値を対応表にした配列。int userState
プレーヤーが白ならば整数値'W'、黒ならば整数値'B'がセットされる。
int myStateメソッド(関数)の解説
自分が空白なら0、白ならば整数値'W'、黒ならば整数値'B'がセットされる。int myNumber
連番の自分の番号
BOOL isOkToGoto( int m, int i )
自分の位置からある方向を見たとき、それがオセロ盤の外ではないことを返す関数。- (id)initWithFrame:(NSRect)fRect
ボタンの初期化。ここで重要なのは、自分がクリックされた時に、自分の中のmyActionメソッドが呼び出されるように定義していることです。- (void)myInit
64個のボタンを順番に全て巡って、自分のオブジェクトへのポインタをクラス定義の配列buttonArrayに登録し、自分の連番上の番号を知り、盤面を初期状態の表示にする、初期化処理。- (void)setUserState:(int)bw
プレーヤーの色をクラス変数に登録して、みんなで見れるようにする。全ボタンに実装される機能であるが、一番左上のボタン以外はこの機能は利用されない。[ buttonArray objectAtIndex: (myNumber+dir[dirToGo]) ]
プログラム中に何回も出てくるので解説しておく。自分から見て、方向dirToGoにあるボタンと言う意味である。- (void)myAction
自分がクリックされた時の処理。自分が空白なら、自分の周り8方向を順に見回して、それがオセロ盤の外ではないなら、あなたを裏返して良いですか(canIReverceYou)と聞いて、もしOKだったら、さあ裏返しましょう(letsReverce)とメッセージを送る。一つでも裏返すことができたら自分をプレーヤーの色にして(iCanSet)、盤面に変化を与えたと言うメッセージ(didSetSome)を送る。- (BOOL)canIReverceYou:(int)dirToGo
裏返して良いですかと聞かれたので、自分が空白だったり、既にプレーヤーの色だったらNOと答える。そうではなくて、もう1個となりがまだオセロ盤の外ではないなら、もう1個となりに裏返して良いですか(canIReverceYouNext)と聞いて、オセロ盤の外ならNOと答える。- (BOOL)canIReverceYouNext:(int)dirToGo
自分が空白ならNOと答える。自分がプレーヤーの色ならYESと答える。そうではなくて、もう1個となりがまだオセロ盤の外ではないなら、もう1個となりに裏返して良いですか(canIReverceYouNext)と聞いて、オセロ盤の外ならNOと答える。- (void)letsReverce:(int)dirToGo
さあ裏返しましょうと言うことで、自分が相手の色であるなら、プレーヤーの色に変わり、お隣にも、さあ裏返しましょう(letsReverce)とメッセージを送る。- (void)didSetSome:(int)us
盤面に変化を与えたと言うメッセージを、一番右下のボタンまでリレーで伝える。- (void)countWhite:(int)sumW black:(int)sumB
自分が白なら白の、黒なら黒の合計値を1増やして、一番右下のボタンまでリレーで伝える。
「MyDelegate部」のコーディング
メソッドの解説- (void)applicationDidFinishLaunching: (NSNotification *)aNote
FilesOwnerのデリゲートとしての初期化メソッドです。ウィンドウ上のリセットボタンと同じ働きをする。- (IBAction)myActionInit:(id)sender
ウィンドウ上のリセットボタンのアクションで、ボタンの連番作成などをやったmyInitのメッセージの送り手。- (void)myInit
ボタンの全てを巡って、myInitのメッセージがここに帰ってきてしまいますので、形式的に受け取って何もしません。- (IBAction)myActionBW:(id)sender
プレーヤーの黒と白の切り替わりによって、ラジオボタンからくるアクション。- (void)didSetSome:(int)us
盤面に変化があったと言うメッセージを最終的に受け取って、プレーヤーの黒と白を切り替えるラジオボタンを自動で押してあげます。そして、盤面のコマの白と黒の数の集計をボタンにお願い(countWhite:black:)する。- (void)countWhite:(int)sumW black:(int)sumB
盤面のコマの白と黒の数の集計を最終的に受け取って、テキストボックスに表示。
サンプルソフトのダウンロード
このページ、全く絵無しに作ってしまいました。気になるなら、どんなソフトかUPしておきますので煮るなり焼くなりして下さい。でも こんどは16KB! ソースのみですので、まずは「Project Builder」でコンパイルして下さい。今日はここまで、2002.2.3
かっこいい出来栄えのバージョンは...、いつになることやら。
サンプルソフトのダウンロード(2)
2週間もかけてこんなのかい、と思いっきり非難を受けそうですが、一応仕事で出張してたとか風邪引いてたとか言い訳はあるんですが..。とにかく、いつまでも「素材です」と言ってばかりもいられないので、数行直して(数行だけ?)、デフォルトのOn/Offボタンの色変化を利用して完成品にしてみました。Aquaインターフェースの素晴らしさで、何かこのままで良いかなと思ってしまったりします。今日はここまで、2002.2.17
本当にかっこいい出来栄えの、アニメとかサウンドとか使っちゃうバージョンは...、いつになることやら。