15ゲームを作る第三回

 今回は、駒を動せるようにして一応完成させてしまいましょう。 移動できるのは空いている1個所だけなので、 駒がクリックされたら移動できるか調べ、 隣に空いている所があって移動できるなら移動するようにします。

・実行結果

 New Game ボタンでゲームを始めてください。 動かせる駒をクリックすると移動しますので、 最初の配置になるよう移動させましょう。

・移動処理

 まずこのゲームにおける「移動」とは、隣にある空きに移動する、 そしてその結果空いている場所は移動する駒があった所に来る、 というものでした。これは、つまり移動する駒と移動先の空きを「交換」 する事を意味します。さらにプログラムでは、 磐面情報の中で1ー15の駒を1ー15に、 空きを0に対応させていましたので、 移動できるか調べるには上下左右に0があるかどうか調べるわけですね。
 磐面は4×4であった事に注意すると、(x ,y) の駒が移動できるか調べて移動可能なら移動する関数は、 以下のようになるでしょう。

  private void idou(int x,int y) {

	  int w;

	  if (x>0 && ban[x-1][y]==0) { // 上に移動可能か

		  w=ban[x][y]; // 移動可能なら移動(移動先と交換)
		  ban[x][y]=ban[x-1][y];
		  ban[x-1][y]=w;

	  }

	  if (x<3 && ban[x+1][y]==0) { // 下に移動可能か

		  w=ban[x][y];
		  ban[x][y]=ban[x+1][y];
		  ban[x+1][y]=w;

	  }

	  if (y>0 && ban[x][y-1]==0) { // 左に移動可能か

		  w=ban[x][y];
		  ban[x][y]=ban[x][y-1];
		  ban[x][y-1]=w;

	  }

	  if (y<3 && ban[x][y+1]==0) { // 右に移動可能か

		  w=ban[x][y];
		  ban[x][y]=ban[x][y+1];
		  ban[x][y+1]=w;

	  }

	  drawBan();

  }

 またこの関数を呼び出すには、 まずどの駒がクリックされたかを調べる必要があるので、action メソッド内で調べておきます。

	for (i=0;i<4;i++) // 駒がクリックされたら移動
		for (j=0;j<4;j++)
			if (evt.target==nob[j][i])
				idou(j,i);

 と、これで一応プレイできるようになりました。クリア判定は.... 必要ないかな。クリアかどうかはすぐにわかるし、 クリアした事を通知するのも面倒ですから。

 なお、前回のように「適当」に配置した状態から始めると、 絶対にクリアできない状況も出来てしまうようなので、 それを防ぐ処理も入れておきました。

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