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

   2013/01/14

GUIプログラムを作る場合に、見栄えを整えてから中身(処理)を作る
という順序で進める人と、装飾やレイアウト調整は後回しにして
中身(処理)を先に作るという人がいます。
毎度、管理人イガジーです。

好みの問題なので、どちらでもかまわないと思いますが、
仕様が不確定なプロトタイプ的開発の場合は、後者、すなわち
見栄えは後回しの方が、変更に対して影響が少なくて済む
と言えるでしょう。

とは言っても、何度も表示させているうちに、貧弱な見栄えが
どうにも気になってしまい、それを先にコーディングしたりもします。
(見栄えにこだわるなら、awtではなくswingを使った方が良い
とも言えますが)

という訳で、昨日書いた土台の文字サイズを少し大きくしておきましょう。
文字サイズを設定するにはフォントを指定します。

上部(BorderLayout.NORTH)のラベルsc のフォントは、次のように
設定してみます。
sc.setFont(new Font(Font.DIALOG,Font.PLAIN,28));Font.DIALOGが「書体」の指定です。
Font.PLAINは「通常(太字でも斜体でもない)」の指定、
28がフォントのサイズです。
あわせて中央寄せにしておきます。
sc.setAlignment(Label.CENTER);
数字ボタンの部分も同様に
nb[i].setFont(new Font(Font.DIALOG,Font.BOLD,16));とします。
あわせて、ボタンの色(背景色)を黄色にしておきます。
nb[i].setBackground(Color.YELLOW);これは、後ほど「クリックした時に灰色に変える」処理を入れるので
その前準備です。

それから、ボタン(の数字)を並べ替える処理として、次のような
メソッドを用意します。
フィールドには
Random rnd=new Random();を追加して;

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) {
			String t1=nb[b1].getLabel();
			String t2=nb[b2].getLabel();
			nb[b2].setLabel(t1);
			nb[b1].setLabel(t2);
		}
	}
}

ボタンそのものをGridLayout内に入れなおすのではなく
表示している数字だけを入れ替えるわけです。

これで、それっぽい開始画面になります。
以下に、ここまでのコードを掲載しておきます。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

public class ClickN1 extends Frame {
	private static final long serialVersionUID = 1L;
	Label sc;
	Button []nb = new Button[16];
	Random rnd;

	ClickN1(){
		this.setTitle("Click N");
		this.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		rnd=new Random();
		sc=new Label("click 1");
		sc.setFont(new Font(Font.DIALOG,Font.PLAIN,28));
		sc.setAlignment(Label.CENTER);
		Panel p1=new Panel();
		Panel bp=new Panel(new GridLayout(4,4));
		for (int i=0;i<16;++i) {
			nb[i]=new Button(Integer.toString(i+1));
			nb[i].setFont(new Font(Font.DIALOG,Font.BOLD,16));
			nb[i].setBackground(Color.YELLOW);
			bp.add(nb[i]);
		}
		shuffle(32);
		Button rst=new Button("Reset");
		p1.add(rst);
		this.add(p1,BorderLayout.SOUTH);
		this.add(bp,BorderLayout.CENTER);
		this.add(sc,BorderLayout.NORTH);
		this.setSize(200,250);
		this.setVisible(true);
	}
	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) {
				String t1=nb[b1].getLabel();
				String t2=nb[b2].getLabel();
				nb[b2].setLabel(t1);
				nb[b1].setLabel(t2);
			}
		}
	}
	public static void main(String[] args) {
		new ClickN1();
	}
}

まだハリボテ状態なので、ボタンをクリックしても動きません。
これを動くようにするには、ボタンが押された時の処理(ActionListener)を
追加します。
それについては、また明日。

ご質問、ご意見などは メールフォーム をご利用ください。
プログラミング相談も、お気軽にどうぞ。

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

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

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)