2009-12-27 64 views
1

基本上,我創建了一個可以交換棋子的拼圖。我想確保在交換2個元素時,選擇是有效的。比較3x3矩陣的2個元素以查看元素2是否與元素1相鄰

因爲讓人不解的是隻有9個(3×3),我目前使用的代碼:

function valid_selection(p1, p2) { 
    if (p1 == 1 && (p2 == 2 || p2 == 4)) return true; 
    if (p1 == 2 && (p2 == 1 || p2 == 3 || p2 == 5)) return true; 
    if (p1 == 3 && (p2 == 2 || p2 == 6)) return true; 
    if (p1 == 4 && (p2 == 1 || p2 == 5 || p2 == 7)) return true; 
    if (p1 == 5 && (p2 == 2 || p2 == 4 || p2 == 6 || p2 == 8)) return true; 
    if (p1 == 6 && (p2 == 3 || p2 == 5 || p2 == 9)) return true; 
    if (p1 == 7 && (p2 == 4 || p2 == 8)) return true; 
    if (p1 == 8 && (p2 == 5 || p2 == 7 || p2 == 9)) return true; 
    if (p1 == 9 && (p2 == 6 || p2 == 8)) return true; 

    return false; 
    } 

但是,我可以做到這一點編程?任何人都知道這樣的算法?

任何幫助表示讚賞。

+0

請說明校驗序列,因爲我們不知道遊戲規則。 – Drakosha 2009-12-27 17:04:57

+0

通過研究我現在的代碼,您可以輕鬆看到。這有點難以解釋, – google 2009-12-27 17:08:46

+0

看起來像一個程序給我。 – 2009-12-27 17:14:02

回答

1

假設你的矩陣具有像這樣的位置:

1 2 3 
4 5 6 
7 8 9 

你應該能夠做到以下幾點:

if (abs(p2-p1) == 3 // test for vertical connectedness 
     || (abs(p2-p1) == 1 // test for horizontal connectedness 
     && (p1+p2 != 7 && p1+p2 != 13))) // except for edge cases (3,4 and 6,7) 
    return true; 
+0

這就是我的矩陣,它不能正常工作。 實施例: 令P1 = 4 和p2 = 3 它不應該匹配爲P2是在右上角(P1在中間左側),但它通過if測試。 – google 2009-12-27 17:12:46

+0

編輯,nvm只是注意到你的編輯。我會放棄這一點。 – google 2009-12-27 17:13:39

+0

沒有,在p1 = 2時失敗,p2 = 5時應該匹配, 也失敗:p1 = 5,p2 = 8 – google 2009-12-27 17:16:21

0

你也可以轉換成每片網格上的座標爲形式。

即:

1是(0,0), 2是(0,1), 3是(0,2), 4是(1,0), 等

因此,考慮P1的,座標是(x_p1,y_p1)和p2是(x_p2,y_p2),那麼你的函數將返回true,如果:

(ABS(x_p2 - x_p1)+ ABS(y_p2 - y_p1)) == 1

我想......?還沒有真正嘗試過。

這應該工作,不管網格的大小。

0

假設這是JavaScript的:

var N = 3; // size of matrix 

var x1 = p1 % N, y1 = Math.floor(p1/N); 
var x2 = p2 % N, y2 = Math.floor(p2/N); 

return (x1 == x2 && Math.abs(y2 - y1) == 1) || 
     (y1 == y2 && Math.abs(x2 - x1) == 1);