// 初始化圖片
public void initView() {
for (int i = 0; i < number.length; i++) {
number[i] = gameover[i];
}
// 將圖片隨機化
for (int i = 0; i < number.length - 4; i++) {
int temp = number[i];
int index = (int) (Math.random() * (number.length - 5));
number[i] = number[index];
number[index] = temp;
}
initGame();
getlist();
// 判斷生成是否有解
if (canSolve(data)) {
return;
} else {
initView();
}
socer = 0;
tv2.setText("當前移動了 " + String.valueOf(socer) + " 步");
}
// 將圖片添到佈局
public void initGame() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j + i == 8) {
iv_group[i][j].setImageResource(number[24]);
} else {
iv_group[i][j].setImageResource(number[i * 5 + j]);
}
}
}
}
/**
* 獲取data
*
*/
public void getlist() {
data = new ArrayList<Integer>();
for (int i = 0; i < number.length - 4; i++) {
for (int j = 0; j < number.length - 4; j++) {
if (number[i] == gameover[j]) {
data.add(j);
}
}
}
System.out.println("============" + data.toString());
}
/**
* 該數據是否有解
*
* @param data
* @return 該數據是否有解
*/
public boolean canSolve(List<Integer> data) {
// 可行性原則
return getInversions(data) % 2 == 0;
}
/**
* 計算倒置和算法
*
* @param data
* @return 該序列的倒置和
*/
public static int getInversions(List<Integer> data) {
int inversions = 0;
int inversionCount;
for (int i = 0; i < data.size(); i++) {
inversionCount = 0;
for (int j = i + 1; j < data.size(); j++) {
int index = data.get(i);
if (data.get(j) < index) {
inversionCount++;
}
}
inversions += inversionCount;
inversionCount = 0;
}
System.out.println("******" + data.toString() +"============"+ inversions);
return inversions;
}
拼圖遊戲雖說簡單,但是當拼圖的行列數是奇數時,就會出現著名的puzzle問題
這種情況就需要倒置數進行判斷
當拼圖的行數爲偶數時,倒置數爲奇偶都可以
當拼圖的行列數爲奇數時,
如果空白圖片從最底層往上數是奇數,倒置數則需要爲偶數
如果空白圖片從最底層往上數是偶數,倒置數則需要爲奇數