1セットのトランプを作る

リスト4●番号に応じた数字とマークのcardオブジェクトを作るcardsクラス内のcreate-Card メソッド
リスト5●52枚のカードを順に作成するcreateCardsメソッド
図10●52枚のカードを整列して並べた
リスト7●指定した二つのplayingCardオブジェクトを入れ替える exchangeCardsメソッド
リスト8●1枚目から52枚目まで順に適当な位置のカードと置き換える ShuffleCardsメソッド
リスト9●ボタンを非表示にし,カードを混ぜる処理を追加したボタンの クリック・イベントハンドラ
図11●カードをシャッフルして並べた

 さて,トランプにはジョーカーを除いて52枚のカードがあります。今度はこれをすべて作ることを考えましょう。cardオブジェクトにマークと数字を一つずつ割り当てて,52個作ればよいことになります。また,これらに1番目のカード,2番目のカード,n番目のカードといったように番号を指定して,そのカードが何なのかをわかるようにします。オブジェクトに背番号のようなものを付けるわけです。例えば

public card[] PlayingCard = new card[52];

とすれば,cardクラスからPlayingCard[]オブジェクトができます。

 この[ ]内には,0から51までの値を指定でき,それぞれが独立したcardオブジェクトとして扱えます。つまり,PlayingCard[5]をスペードの3にして,PlayingCard[27]をダイヤの8といったように,それぞれのオブジェクトを独立して扱うことができるのです。このように番号を付けて管理できるようにした同じ種類の複数の変数やオブジェクトを「配列」と呼びます(オブジェクトの配列を「オブジェクト配列」と呼ぶこともあります)。

 1枚ずつcardオブジェクトを作って,全種類のカードを作るには,例えば最初にハートのマークを1から13まで作り,次にクラブを…と作ればよいでしょう。その準備として,1ならばハートの1のカードを作り,2ならばハートの2,14ならばクラブの1,といったようにカードを1枚ずつ作るメソッドを実装します。複数のカードを扱うので,新たにcardsクラスを作り,ここに実装しましょう(リスト4[拡大表示])。これは前回説明した,店員オブジェクトを作り出す八百屋オブジェクトに似ています。

 次に,1から52まで順に繰り返してplayingCardオブジェクトを作成するcreateCardsメソッドを作ります(リスト5[拡大表示])。ここでは,createCardメソッドを繰り返し呼び出します。繰り返し命令はforステートメントを使っています。forステートメントは以下のように書き,

for (変数の初期値;条件;変数の変化)

条件が成立していれば,これに続く処理を1度行って変数を変化させます。条件が成立する限り,ループを繰り返すというわけです。カードを使うときに必ずマークと数字を割り当てるので,cardsクラスのコンストラクタで,createCardsメソッドを呼び出すようにしておきます。

トランプをシャッフルして並べる

 それでは52枚のカードがそろったので,試しにフォーム上に並べてみましょう。button1_Clickの内容をリスト6[拡大表示]のように書き換えてください。このプログラムは,52枚のカードのオブジェクトをcardsクラスから作り,次に一つずつのcardオブジェクトを,フォームのコントロールとして追加して,縦横で等間隔になるように整列させて並べるという処理を繰り返しています。実行してボタンをクリックしてみてください。52枚のトランプがきれいに並ぶはずです。カードをクリックすると表に変わることも確認してください(図10[拡大表示])。

 ただ,これではゲームを作るには不完全です。なぜって,ハートのエース(1)から順番に並んでいるので,どこに何がおいてあるのかすぐにわかってしまうからです。そこで,カードをシャッフルするプログラムを追加しましょう。いろいろな方法が考えられますが,適当な2枚のカードを入れ替えてカードを混ぜることにします。それにはまず,指定した二つのカードを入れ替えるというexchangeCardsメソッドを作ります(リスト7[拡大表示])。これはcardsクラス内で,番号を指定した二つのplayingCardオブジェクトを入れ替えています。

 exchangeCardsメソッドは二つの引数をとり,この引数で指定したカードが入れ替わります。この引数に0から51までの乱数を与え,十分な回数だけ繰り返せば,カードがシャッフルされるはずです。

 ここでは,片方の引数を0から51まで順に変えて,もう片方を乱数にしました。52回の入れ替えが行われて,十分に混ざるでしょう(リスト8[拡大表示])。メソッド名はShuffleCardsとしました。乱数はRandomクラスを使って取得しています。RandomのNextメソッドを使って乱数を得ます。Nextメソッドは一つの整数の引数を与えて使います。得られる値は0以上で与えた値より小さな整数になります。

 作成したShuffleCardsメソッドを,カードを並べる前に実行すれば,どこに何のカードがあるのかわからなくなります。ShuffleCardsメソッドの実行をbutton1_Clickメソッドに追加しましょう。また,一度トランプを並べたら,スタート・ボタンはいらなくなります。今回のようにほとんど一瞬で処理が終了する場合は問題になりませんが,処理に時間がかかる場合は,処理中にもう一度ボタンがクリックされて,予期していなかった結果になることもあります。そのため,ボタンを非表示にする処理も追加します。ボタンを画面から消すには,Hideメソッドを使います(リスト9[拡大表示])。実行してボタンをクリックしてください。うまくシャッフルできたでしょうか(図11[拡大表示])。

 うまくできていれば,無秩序にカードが並ぶはずです。とりあえず,これで神経衰弱ゲームのような遊びができるでしょう。また,神経衰弱だけではなく,自由にカードを配置したり,カードを消すなどの処理を追加することで,ほかのゲームを作ることもできそうです。

 次回は,この“トランプ・ゲームの元”を利用して,神経衰弱を完成させ,もう少し遊べるゲームを作る予定です。皆さんも工夫して何か作ってみてください。また,もっと効率よくトランプをシャッフルする方法も考えてみてください。