15ゲームを作る第二回

 前回は、ただ駒に見たてたボタンを順番に並ベただけでしたので、今回は磐面の状況(駒の配置)に応じて駒を配置できるようにします。さらに、駒を「適当に」置く処理も考えてみましょう。

磐面の状況

 15ゲームの磐面は、4×4=16個のスペースに1ー15の駒が置かれる、というものでした。そこで、磐面の状況を表すために2次元配列ban[4][4]を用意して、ここに磐面の各マスの状況を記憶する事にします。まず、1ー15の駒があれば1ー15の数値を書けば良いでしょう。また、駒がない状態は0にします。これで行くと、前回の状態(1ー15が順番に並んで最後に空きが来るクリア状態)は、

{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9,10,11,12},
{13,14,15, 0}

 と表せる事になりますね。

 次に、磐面の状況に応じて駒(ボタン)を置く処理を考えてみます。すでにアプレットの初期化処理の中で、 ボタンを16個配置してありますから1ー15に関してはボタンの文字(Label)を書き換えれば良いでしょう。また、0なら表示しないだけです。
 以上の事を行うプログラムは、以下のような感じになります。

  for (i=0;i<4;i++)
      for (j=0;j<4;j++) { // (j,i) のマスを調べる

          if (ban[j][i]==0) // 0(駒なし)ならボタンを消す
              nob[j][i].show(false);
          else { // ボタンの文字を駒の数字にする

              nob[j][i].setLabel(String.valueOf(ban[j][i]));

              nob[j][i].show(true);

          }

      }

 このプログラムは、(j ,i) の駒の情報ban[j][i]を(j ,i) にあるボタンnob[j][i] に対応させる、という構造になっています。

・駒を「適当に」配置する

 では、次に駒を「適当に」置く処理です。これは、磐面の各マスの数値を「入れ替える」事にしました。以下のような感じです(rnd はRandom クラスのインスタンス)。

  for (i=0;i<20;i++) {

      x1=Math.abs(rnd.nextInt()) % 4;
      y1=Math.abs(rnd.nextInt()) % 4;
      x2=Math.abs(rnd.nextInt()) % 4;
      y2=Math.abs(rnd.nextInt()) % 4;

      w=ban[x1][y1]; //(x1 ,y1) と(x2 ,y2) を交換
      ban[x1][y1]=ban[x2][y2];
      ban[x2][y2]=w;

  }

 まず、乱数で2つのマス(x1 ,y1) と(x2 ,y2) を選んで、2つの数字を入れ替えるわけですね。これを何度か繰り返せば、バラバラにする事が出来ます。他にも個々のマスに乱数で0ー15の数値を入れていっても良いのですが、これだと一度入れた数字を2度入れないように(同じ数字の駒はないですから)するために、いちいち数字をチェックしないといけません。

・プログラム

 まず、乱数で適当に並べ替えてから磐面を表示しています。Clear ボタンをクリックするとまた磐面を並べ替えますので、試してみてください。
 なお、初期化処理の中で磐面やボタンをさらにパネルに入れているのは、こうしないと磐面やボタンがBorderLayoutCenterSouthいっぱいに広がってしまうからです。

プログラムソース表示
戻る