・実行結果
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);
と、これで一応プレイできるようになりました。クリア判定は.... 必要ないかな。クリアかどうかはすぐにわかるし、 クリアした事を通知するのも面倒ですから。
なお、前回のように「適当」に配置した状態から始めると、 絶対にクリアできない状況も出来てしまうようなので、 それを防ぐ処理も入れておきました。