数字順押しゲームを作ってみよう3
プログラムの書き方は、何通りもあります。同じ言語でも。
最初の頃は、複数の書き方のどれが良いのか悩んでしまったりしますね。
毎度、管理人イガジーです。
例えば、既存のクラス(Buttonなど)に、色々設定をするのと、
extends して、専用のクラスを作ってしまうのと、どちらが良いか、等です。
正しく動けば、どう書いても良いと言えるのですが、それでも悩んでしまう場合は
それぞれを書いてみて、自分が気に入るものを採用しましょう。
という訳で(?)、順押しゲームの数字ボタンですが、extends したクラス
を作ることにします。
ボタンのラベルは数字なので、コンストラクタの引数を int にします。
そして、シャッフル(数字の並べ替え)用に、数字のgetn()とsetn()の
メソッドを装備します(これを getter, setterと呼んだりします)。
数字ボタンがクリックされた時のActionListenerでは、
・クリックすべき順番と自分の表示番号が一致するかチェックして
一致したら、背景色を灰色にして、クリックすべき順番を+1する。
・最後(4×4なら「16」)のボタンだったら、プレイ終了。
とします。
全部クリックするのにかかった時間を測定して表示する処理は
後回しにして、今日のところはプレイ終了では「Goal」を表示する事にします。
上記の処理は、例えば次のような感じになります。
class Nbtn extends Button implements ActionListener{
private static final long serialVersionUID = 1L;
int n;
Nbtn(int nn) {
super(Integer.toString(nn));
n=nn;
this.setFont(new Font(Font.DIALOG,Font.BOLD,16));
this.setBackground(Color.YELLOW);
this.addActionListener(this);
}
int getn() { return n; }
void setn(int nn) {
n=nn;
setLabel(Integer.toString(n));
}
@Override
public void actionPerformed(ActionEvent e) {
if (p==n) {
setBackground(Color.GRAY);
++p;
if (p<17) {
sc.setText("click "+Integer.toString(p));
}else{
sc.setText("Goal");
}
}
}
}// class Nbtn
actionPerformed()内の p は、押すべき順を示す変数で
フィールドに置きます。この初期値は1です(1から順にクリックするので)。
getter,setterを使って、並べ替え用shuffle()は次のようになります。
void shuffle(int count) {
int b1,b2;
for (int i=0;i<count;++i) {
b1=rnd.nextInt(16);
b2=rnd.nextInt(16);
if (b1!=b2) {
int t1=nb[b1].getn();
int t2=nb[b2].getn();
nb[b2].setn(t1);
nb[b1].setn(t2);
}
}
}
これだけだと、1回プレイしたら終わりになるので、[Reset]ボタンで初期状態に
戻すようにします。初期状態とは
・ボタンの背景色を全て黄色に戻す
・順番を変える(shuffle)
・押すべき数字を1に戻す(p=1;)
・ラベルsc に “click 1″をセットする
ということです。
上記の実装例は、次のようになります。
Button rst=new Button("Reset");
rst.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for (int i=0;i<16;++i) nb[i].setBackground(Color.YELLOW);
shuffle(32);
p=1;
sc.setText("click 1");
}
});
以上をもりこむと、とりあえずプレイできるようになります。
でも、全部押すのにかかった時間がわからないと、やはり面白くありません。
時間を測定するには、long System.currentTimeMillis(); が使えます。
[1]のボタンがクリックされたら、その時刻t0を覚えておき
最後のボタン(4×4なら[16])がクリックされたらその時刻t1を得て
t1-t0 で、かかった時間を測定できます。単位はmsです。
そのコーディング例は、また明日。
この記事へのコメントはこちら