15パズルにシャッフル機能追加|Javaから楽しく学ぶ!ゲームプログラミング専門学校

Javaから楽しく学ぶ!ゲームプログラミング専門学校

ゲームプログラミングとはその名のとおりゲームのプログラムを作ることを指します。『Javaから楽しく学ぶ!ゲームプログラミング専門学校』ではゲームプログラミングについて、実際にゲームプログラムをJAVAプログラミング言語を使用し、作成していきながら詳しく解説していきます。

15パズルにシャッフル機能追加

15パズル制作続き

前回の続きで15パズルを作成していきます。
前回の記事を読まれてない方はまずはこちらからお読みいただければと思います。
15パズル制作

今回は整列されたコマをシャッフルするメソッドを作成していきます。
ですがその前にひとつ注意しなければならない点があります。
まずはそちらから考えていきます。

15パズルにおいて適当にシャッフルするとどうやっても数字が整列しないという現象が稀に起こります。

「任意の二つの駒のみを入れ替えて他のものは変えないという操作は不可能である」
と数学的に解明されており、ランダムなシャッフルからでは整列できないことがありえるのです。
(何故かはよくわかりません。。)
ですので、その部分を少し工夫する必要があります。


プログラム動作の流れを簡単にまとめます。
盤面のコマをシャッフルするメソッドを作ります。
そのメソッドでは指定した回数だけ、コマをクリックしたときと同じ操作を行うようにします。


『GridInfo』クラスに『shfleTile』メソッドを追加します。
『shfleTile』メソッドでコマをシャッフルしています。

public void shfleTile(){
int intClickX = 0;
int intClickY = 0;
int intClickedX = 0;
int intClickedY = 0;
int randNum;
boolean blnRet = false;

/* 500回コマを移動させる */
for(int i = 0; i < 500; i++){
/* コマが置かれていない空いているマスを取得 */
intClickX = getEmpGridXNum(); //横位置取得
intClickY = getEmpGridYNum(); //縦位置取得

/* 0〜3までの数値をランダムに取得 */
randNum = (int)(Math.random() * 4);

/* ランダムに得た0〜3までの数値を上下左右に対応させて場合分け */

switch(randNum){
/* 右 */
case 0:
/* 空いているマスの右にあるコマを移動させる */
blnRet = moveTile(intClickX + 1, intClickY);
intClickedX = intClickX + 1;
intClickedY = intClickY;
break;

/* 左 */
case 1:
/* 空いているマスの左にあるコマを移動させる */
blnRet = moveTile(intClickX - 1, intClickY);
intClickedX = intClickX - 1;
intClickedY = intClickY;
break;

/* 下 */
case 2:
/* 空いているマスの下にあるコマを移動させる */
blnRet = moveTile(intClickX, intClickY + 1);
intClickedX = intClickX;
intClickedY = intClickY + 1;
break;

/* 上 */
case 3:
/* 空いているマスの上にあるコマを移動させる */
blnRet = moveTile(intClickX, intClickY - 1);
intClickedX = intClickX;
intClickedY = intClickY - 1;
break;
}
if(blnRet == true){
intClickX = intClickedX;
intClickY = intClickedY;
moveTile(intClickX, intClickY);
}
}

}

これで1〜15までのコマを必ず整列できるようなシャッフルができました。

ソースファイルは下記からダウンロードできます。
http://www.gamesite8.com/code/02/num.java

以上で、15パズルは完成となります。
しかし、ここで書いたソースコードが必ずしも正解ではありません。
プログラムというものは動かしたときの動作は同じでも、作り方(アルゴリズム)は人によりまちまちであり、それぞれが正解と言えます。

他人のソースを見るときは「このソースはここが無駄だ、こうした方がわかりやすい」といったことを常に考えておくことが大切であり成長を著しく早くします。
トラックバック:0Edit
Copyright © Javaから楽しく学ぶ!ゲームプログラミング専門学校 All Rights Reserved.
当サイトのテキストや画像等すべての転載転用・商用販売を固く禁じます