神経衰弱アプリを作ってみる
4.カードをランダムに並べる方法を考えて、ついでにカードのクラスも作ってみる
さてカードをめくる処理ができたので、今度はいよいよ神経衰弱らしくトランプのカードを使ってみることにしよう。
トランプカードの画像はフリーで素材を配布しているサイトもあるのだけれども、今回は自分で作ってみた。
コレ(まとめてZIP圧縮してあるよ) →
トランプ画像のファイル
数字とマークだけの地味なデザインだけど、「何これ、ショボ!」とか言うの禁止。
まーどこかでもっとキレイな画像を手に入れてそれを使うもヨシ、面倒だから上の画像をダウンロードして使うもヨシ。
とにかく今回はまず、このトランプ画像をランダム並べる方法を考えることにする。
ところでトランプを使った通常の神経衰弱だと、カードの種類に関係なく数字を合わせるのが普通だね。
でも今回は種類と数字の両方を合わせるという、俺様ルールを発動する。
なぜなら・・・そのほうが見た目がシンプルだからだっ!ウンそれだけ。
だって「
♥ハートのA」と「♠スペードのA」っていう組合せより、「
♥ハートのA」と「
♥ハートのA」っていう組合せのほうが一致してる感がデカイぢゃん!ビッグぢゃん!YAZAWA。
というわけでトランプカードをどのようにして並べるか、つまり52枚の画像をどのようにして4×6=24個のボタンに配置するかを考えてみよう。
しかも神経衰弱だから、ペアになるようにカードを選ばなきゃならないところが注意点だね。
ところで賢明なる貴兄はここでハタと気づいたことであろう、いやもうとっくの昔に感づいていたかも知れない。
そう、実際に必要な画像は12枚でいいということに。
だってペアになるように24枚の画像を並べるってことは、結局画像は12枚あれば足りるってことだもんね。
と言っても既に52枚もトランプ画像を用意したんだから、せっかく作ったんだから使いたいんだもん!テヘペロコツン・・・ってことで気にせず先へ進もう。
とか何とか言ってる内に、トランプを並べる方法を考えてみたよ。
他にもいろいろやり方はあると思うけれども、今回は以下の手順でやってみよう。
(1) 52枚のカードをシャッフルする。
(2) シャッフルしたカードの上から12枚を取り出し、それぞれ複製して24枚にする。
(3) さらに、24枚のカードをシャッフルする。
(4) シャッフルした24枚のカードを順に並べてセットする。
以上

これで、12組のペアのカードがランダムに並ぶという仕組み。
(2)のカードの複製とかって現実だとトランプを2組用意したりしなきゃいけないけれども、プログラムの上では簡単に実現できるってのが良いよね。
さぁそれでは、この(1)から(4)の手順をプログラムに追加してみよう。
・・・っとその前に、1つ下準備をしておくのが重要ポイント。
それは何かってーと、カードの「クラス」を作っておくってこと。
さてそれではここで、「クラス」ってものに軽く触れてみることにしよう・・・軽くね。
いままでも説明無しに「クラス」って言葉が出てきてたんだけれども、はたして「クラス」ってのは何か。
まずは、今扱ってるプログラムを注意してよく見直してみよう。
ほら、前半部分に
public class AndroidTestActivity extends Activity {
っていう記述が見つかったでしょ、ここのclassっていうのがそれ。
実はこれまでさんざんアレコレいじくってきたプログラムが、そもそもクラスでできてたんだね。
まさに目からウロコがはがれて、また別の新しいウロコが貼りついたって感じ?
実際のところJAVAのプログラムってのは、クラスの組み合わせによって作られるものなんだってさ。
それはいいけど、じゃあ結局クラスって何なのよ?って言われると・・・ブッチャケ答えに困る。
サクッと一言で説明できない代物で、だからって詳しくやると延々と長い話になってしまうんだもの。
だから、ここでは簡単なイメージだけ頭に入れておくことにしよう。
というわけで、簡単に言えば、
「クラス」とは「フィールド」や「メソッド」を持ち、「オブジェクト」を作成するためのヒナ形である
って感じで、どぉ?
・・ハ?何だそれ、ぜんぜんワカンネーヨ!
いゃごもっとも、じゃーなんとか頑張ってもー少しだけ説明してみるかな。
まず「フィールド」ってのは「属性」とか「プロパティ」とも言うけれども、ここでは単純に「変数」だと考えておこう。
ほら、数値や文字列なんかを入れておくアレのこと。
次に「メソッド」ってのは「機能」とか「ファンクション」とも言うけれども、ここでは単純に「関数」だと考えておこう。
実のところ「メソッド」っていう言葉もこれまでのプログラムの説明で既に使ってたので今更感もありつつ、まぁここでようやくその正体が何となく分かったかなってことでいかがかと。
というわけで「クラス」っていうのは、「変数」と「関数」を持っているというイメージでひとまず置いておく。
んでその「クラス」というヒナ形を使って、「オブジェクト」というプログラムの部品を作り出すって感じ。
この「ヒナ形」ってのが肝心で、つまり「クラス」がタイ焼きの焼き型で、それから作るタイ焼きが「オブジェクト」っていうイメージでどうでしょ。
ここで作るクラスは、カードの焼き型というかヒナ形になるというわけ。
まーとにかく理解や納得は後回しにして、ここでは何となくイメージだけ感じて良しとしておこう。
そして話は戻ってカードのクラスを作る件だけれども、まずは以下をご覧あれ。
class Card {
private int imgNo; //画像番号・・・(A)
private Drawable cardImg; //画像 ・・・(B)
Card(int imgNo, Drawable cardImg) { //・・・(C)
this.imgNo = imgNo;
this.cardImg = cardImg;
}
int getImgNo() { //・・・(D)
return imgNo;
}
Drawable getCardImg() { //・・・(E)
return cardImg;
}
}
これが、今回作ったカードのクラスだ。
ここで(A)(B)が前述の「フィールド」で、(C)(D)(E)が同じく「メソッド」にあたる。
ちなみに(A)は、セットするトランプの画像番号のフィールド。
そして(B)は、その画像番号に対応するトランプ画像そのもののフィールドだ。
(C)のメソッドは「コンストラクタ」といってチョット特殊なメソッドなんだけれども、これについてはいずれ説明するのでしばしお待ちを。
(D)と(E)はそれぞれ(A)の画像番号と(B)の画像を参照するためのメソッドで、リターン値として画像番号と画像を返しているのが分かるでしょ。
つまりこのカードのクラスは、「トランプの画像番号のフィールド」と「トランプの画像のフィールド」の2つのフィールド(変数)を持ち。
そして「コンストラクタ」と「トランプの画像番号を参照するメソッド」と「トランプ画像を参照するメソッド」の3つのメソッド(関数)を持っているということになる。
さてこうしてカードのクラスを作ったわけだけれども、その理由はナゼか?
それは後々のプログラム作成において、このクラスがけっこう便利に使えるからなんだね。
じゃあ、このクラスを実際にどんなふうに使ってプログラムを作っていくのか。
今回は長くなってきたので、それは次回に回すことにしようかな。