数字順押しゲームを作ってみよう3

   2013/01/16

プログラムの書き方は、何通りもあります。同じ言語でも。
最初の頃は、複数の書き方のどれが良いのか悩んでしまったりしますね。

毎度、管理人イガジーです。

例えば、既存のクラス(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です。

そのコーディング例は、また明日。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。