ただし,この学習方法には,問題の周辺のことも身に付けようという,好奇心旺盛な態度が必要になります。
そこで今回は,神経衰弱などのゲームができる「カード・ゲームの元」(図1[拡大表示])を題材に*1,プログラミングの課題を小分けに出して,一つひとつ解決しながら学習を進めようと思います。周辺のことがらについてもできるだけ触れるようにします。自分でも調べて理解を深めるようにしてください。
トランプのカードに共通の性質は何かを考える
まず前回のオブジェクト指向の説明を思い出しながら,カード・ゲームの性質を考えてみましょう。カード・ゲームでは,カード(トランプ)を使います。当然ですね。何枚のカードを使うかはゲームによって違うかもしれませんが,以下のような共通の性質があることは理解できると思います。
(1)カードには,マーク(スーツとも言う)と数字の情報がある。例えばハートのA(エース)のマークはハート,数字は1である。マークはハート,クラブ,ダイヤ,スペードのいずれかで,数字は2から10,またはエース,ジャック,クイーン,キングのどれかである
(2)カードには表と裏がある。(1)の情報は表に書かれており,裏にすると見えない
(3)カードは,表から裏へ,またはその逆にひっくり返すことができる
もちろん,カードの性質としてほかにも挙げられるでしょうが,プログラミングが複雑になるので,今回はこの三つの性質に留めます。
では,カードの“クラス”を考えてみましょう。前回のオブジェクト指向プログラミングを思い出してください。エース,ジャックなどの記号は単純化のため見送り,すべて数字で1から13までということにします。さて,どうなるでしょう。ここから先を読む前に,できれば自分でクラスを設計してみましょう。
いかがですか? 上記の(1)~(3)の性質を考えると,裏なのか表なのかを示すメンバー変数,数字とマークをそれぞれ格納するメンバー変数,裏返すためのメソッドの四つを備えたクラスが設計できませんか(リスト1[拡大表示])。といっても,まだピンとこないかもしれませんね。でも大丈夫。クラスの設計については,いったんここでストップして,先にカード・ゲームの画面周りについて考えましょう。クラスについては,もう一度後で説明しますので,どのようにすればよいか,それまでに考えながら次を読み進めてください。
フォームにGUI部品を貼り付ける
VS .NETには,多くの画面表示用の部品が用意してあります*2。今回はカード・ゲームということで,トランプの絵柄を表示させたいので,Labelコントロールを使います。
画面表示用のGUI部品はLabelコントロール以外にも,たくさんの種類があります。フォーム・デザイナの「ツールボックス」を見てみましょう。この中には,ユーザーに文字を入力させるためのTextBoxコントロール,ボタンの役割を持つButtonコントロール,クリックしてボックス内を選択状態にするCheckBoxコントロールなど,入力処理や画面表示のための様々な部品があります。これらはすべてツールボックスからフォームにドラッグアンドドロップするだけで,作成しているアプリケーションで利用できるようになります*3。
まず,何はともあれゲームを開始するためのスタート・ボタンを作りましょう。Buttonコントロールを選択してフォーム上にドラッグアンドドロップしてください(図2[拡大表示])。次にButtonコントロールを選択して,プロパティボックス内の「Text」プロパティを「START」に変更します。ツールバーにある右向き三角マークの「実行」ボタンをクリックしてみましょう。すると「START」という名前のButtonコントロールが付いたフォームが表示されたはずです(図3)。
画面が表示されたということは,それに対応するソースコードが記述されたということでもあります。ソースコード内の「Windowsフォームデザイナで生成されたコード」と書かれた部分に自動的に作られています。ここでは詳しく説明しませんが,どんなコードなのか見ておいてください*4。
Buttonコントロールを設定する
ボタンの位置を変更してみましょう。これはマウス操作だけでできます。マウスを選択状態のボタンの上に移動させると,クロスの両向き矢印になるはずです。そのままドラッグして,目的の場所でドロップすると,Buttonコントロールを移動できます*5。Buttonコントロールはフォームの右下の方に設置しておいてください。
ボタンの大きさも,マウス操作で変更できます。Buttonコントロールの端の部分にマウスを移動させると,上下または左右,斜めなどの両向き矢印になります。その状態でドラッグアンドドロップすると大きさを変更できます*6。
Buttonコントロールを目的の位置に配置できたら,Anchorプロパティを使ってその位置に固定します。これはフォームの大きさが変更されたときに,フォームのどの辺からの距離を保つかを決めるプロパティです。デフォルトでは左と上に設定されていて,フォームが右下に引き伸ばされてもボタンは移動せず,右下に大きな空白ができてしまいます(図4(a)[拡大表示])。Anchorプロパティを右と下に設定すると,ボタンは常にフォームの右下に固定されるようになります*7(図4(b)[拡大表示])。
ボタンに機能を持たせる
次に,貼り付けたButtonコントロールに機能を持たせます。まず,フォーム・デザイナの画面でButtonコントロールをダブルクリックします。すると,自動的に画面がコード・ビューに変わって,「private void button1_Click(object sender, System.EventArgs e)」と書かれたメソッドの内部にカーソルが移動します。
button1_ClickというメソッドはVS .NETが自動的に作成したものです。button1のオブジェクトがクリックされると,このメソッドを実行せよという設定もVS .NETによって自動的に追加されています*8。
つまりこのメソッド内にコードを記述すれば,ボタンをクリックしたときに何らかの処理を実行できるというわけです。例えばメッセージボックスを表示させて見ましょう。
MessageBox.Show("ゲームスタート");
などと入力し,実行してボタンをクリックしてみてください。「ゲームスタート」と書かれたメッセージボックスが表示されたはずです(図5)。
カードを完成させる
さて,先ほど中断していたカード・クラスの設計に戻りましょう。良い案は浮かんだでしょうか。読者の皆さんなら,Labelコントロールを使うということと,ここまでで説明したButtonコントロールの使い方をヒントにしていいアイデアが思い付いたのではないでしょうか。
ここでは一つのアイデアとして,cardクラスをLabelクラスから“継承”*9させる案を紹介します。具体的にはリスト1の先頭を
class card : Label
とするだけです。これでcardクラスはLabelコントロールと同じ機能を持つようになります。Labelコントロールは,Textプロパティで設定した文字を画面に表示したり,Imageプロパティで指定した画像を背景にしたりできます。つまり,カードの数字をTextプロパティに設定して,ハートなのかダイヤなのかといったマークの画像を背景にすればトランプらしくなります。また裏になっている場合は,何か好きな模様を選んで表示させて,Textプロパティを空文字にしておけば,カードの中身がわからないようになります。
このことから,カード・クラスのturnメソッドも実装できるようになるでしょう。つまり,turnメソッドでは,TextプロパティとImageプロパティの表の状態と裏の状態とを入れ替えればよいわけです(リスト2[拡大表示])*10。
リスト2にはswitch~caseという構文が登場しています。これは複数の選択肢に応じた処理を実行するためのステートメントです。switchの( )の中に書いた変数の値と,caseに書かれた値が等しいときに,caseに続くコードをbreakまで実行します。caseはいくつでも設定できます。どのcaseにも当てはまらなかった場合はdefaultに続くコードが実行されます。
カードの初期状態を設定する
もう少しリスト2を見てみましょう。cardクラスの中にcardメソッドを作ってあります(2)。これはコンストラクタと呼ぶもので,cardクラスからオブジェクトが作成されると,このメソッドが無条件に実行されます。ここにはcardオブジェクトの初期状態を設定するためのコードを記述します。最初に裏にしておくこと,カードの大きさ,色の指定を指定しています。
さて,これだけではまだ足りません。クリック操作でカードを裏返しする処理が必要です。そこで,クリック・イベントの処理を実装します。クリックなどのイベントに対応して実行する処理はイベントハンドラと呼びます。VS .NETにはこれを自動的に作ってくれる機能が備わっています。試してみましょう。
コンストラクタの最後の行で、「this.click +=」*11と記入します。すると,ツールチップに「new EventHandler(card_Click);(挿入するには,TABキーを押してください)」と表示されます(図6[拡大表示])。そこで促されるままTABキーを押すと,表示されていた文字が挿入され,今度はcard_Clickが選択された状態になります。そして今度は「このクラスでハンドラ‘card_Click’を作成するには,TABキーを押してください」というツールチップが表示されます(図7[拡大表示])。同様にTABキーをクリックすると,自動的にクラス内にcard_Clickメソッドが作成されます(図8[拡大表示])。イベントハンドラは,メソッドに渡す値などが決まっており,これらを間違えると正しく動作しません。この機能を使えばTABキーを2度押すだけでイベントハンドラを正確に作ることができます。
このメソッド内には,カードを裏返す処理
turn();
だけを書きます。こうしておくとクリックしたときに,カードが裏返るようになります。
さあ,これでカード・クラスは完成しました。このクラスを基にして作成したオブジェクトをウィンドウに配置すれば,トランプのカードができます。試しに1枚だけ配置してみましょう。先に作ったbutton1_clickメソッドの中をリスト3[拡大表示]のようにしてください。これでプログラムを実行させると図9のようになるはずです。カードをクリックすると,裏返ることも確認しておいてください。