15ゲームを作る第一回

 15ゲームとは、今から100年以上前にアメリカのパズル作家、サム・ロイドという人が作ったパズルゲームです。コンピュータゲームの定番の一つなので、すでに何度か遊んだ事のある方も多いかもしれませんね。
 この15ゲームのプログラムはすでに無数に作られていますから、ゲームとしては新鮮味がないかもしれませんが、レイアウトやプログラムがわりときれいにまとめられそうな題材なので、「美しい」(爆)プログラム作成にも挑戦してみましょう。
 今回は、15ゲームの磐面と駒を作ってみます。

15ゲームのルール

 15ゲームでは、1から15までの数字を書いた15個の駒を使います。この駒を、4*4=16個のスペースを持つ磐面(一つは移動用)に置いて動かして行く事で、最後は下のような状態に持って行くゲームです。

・クリアの状態(アプレット実行)

 移動のルールは、縦横を見て隣に空いている場所があればそこに移動できる、という事だけです(上の状態では、12と15の駒を動かせる)。最初適当に配置した駒を、この状態に持って行ければクリアとなります。

プログラム

 では、さっそく上のような磐面と駒を表示するプログラムを考えてみましょう。駒の大きさはすべて一定なので、駒をボタンで作るとイベント処理などが楽になりそうですね。ボタンの2次元配列(4*4)を作ってこれを駒にしましょう。磐面にある一つだけの「穴」は、ボタンを隠す(hide())事で実現できます。
 以下は4*4のボタン配列nob[4][4]に1ー16のボタンを作る処理です。

  for (i=0;i<4;i++)
      for (j=0;j<4;j++) {

          nob[j][i]=new Button(String.valueOf(i*4+j+1));
          p.add(nob[j][i]);

      }

 こうして16個のボタンを作ったら、最後の「16」ボタンをhide()メソッドで隠してしまいます。

nob[3][3].hide();

 問題は磐面ですね。とりあえず今回は、灰色にしたパネルを磐面にしておきましょうか。駒はすべて同じ大きさで格子状に配置するわけですから、レイアウトはGridLayout にします。

  p=new Panel(); // 磐面用パネル作成
  p.setBackground(Color.gray);

  p.setLayout(new GridLayout(4,4,2,2));

 GridLayout のコンストラクタの引数は、最初の二つが横の列数と縦の行数で、3つめと4つめが内部に配置した部品間の距離です。今回は部品間の距離を縦横とも2にしてあるので、ボタンの間にわずかな隙間ができ、そこにパネルの灰色の「地肌」が見えるでしょう。

・プログラム

import java.awt.*;

public class g151 extends java.applet.Applet {

	Button nob[][]=new Button[4][4];
	Panel p;

	public void init(){

		int i,j;

		setBackground(Color.white);

		p=new Panel(); // 磐面用パネル作成
		p.setBackground(Color.gray); // 灰色にする

		p.setLayout(new GridLayout(4,4,2,2)); // 磐面のレイアウト

		for (i=0;i<4;i++) // ボタン作成
			for (j=0;j<4;j++) {

				nob[j][i]=new Button(String.valueOf(i*4+j+1));
				p.add(nob[j][i]);

			}

		nob[3][3].hide(); // 16のボタンを隠す

		add("Center",p); // 磐面をアプレットに配置

	}

}

戻る