数字順押しゲームを作ってみよう2
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)を
追加します。
それについては、また明日。
ご質問、ご意見などは メールフォーム をご利用ください。
プログラミング相談も、お気軽にどうぞ。
この記事へのコメントはこちら