2012-10-16 64 views
0

我在C#中製作15益智遊戲,允許用戶輸入一個自定義的行和列值最大10 x 10的謎題。因此,我遇到了洗牌方法的問題。我想這樣做,這個難題總是可以解決的。通過首先創造一個獲勝的謎題,然後洗空空間。問題是每次調用每個點擊事件的效率太低。我需要一種方法來調用與空白空間相鄰的按鈕的點擊事件,但不是對角線。我還使用一個不可見的靜態按鈕作爲空白點。 PuzzlePiece類繼承自Button。我不太確定如何做到這一點。我將不勝感激任何幫助。15謎洗牌方法問題

感謝

這裏是我有:

private void shuffleBoard() 
    { 
     //5 is just for test purposes 
     for (int i = 0; i < 5; i++) 
     { 
      foreach (Control item in this.Controls) 
      { 
       if (item is PuzzlePiece) 
       { 
        ((PuzzlePiece)item).PerformClick(); 
       } 
      } 
     } 
    } 

void PuzzlePiece_Click(object sender, EventArgs e) 
    { 
     PuzzlePiece piece = (PuzzlePiece)sender; 

     if (piece.Right == puzzleForm.emptyPiece.Left && piece.Top == puzzleForm.emptyPiece.Top) 
     { 
      movePiece(piece); 
     } 
     else if (piece.Left == puzzleForm.emptyPiece.Right && piece.Top == puzzleForm.emptyPiece.Top) 
     { 
      movePiece(piece); 
     } 
     else if (piece.Top == puzzleForm.emptyPiece.Bottom && piece.Left == puzzleForm.emptyPiece.Left) 
     { 
      movePiece(piece); 
     } 
     else if (piece.Bottom == puzzleForm.emptyPiece.Top && piece.Left == puzzleForm.emptyPiece.Left) 
     { 
      movePiece(piece); 
     } 
    } 
+1

嘿,那裏。查看http://gamedev.stackexchange.com/,它就像是StackOverflow的遊戲開發版本,非常適合這樣的問題。 – CptSupermrkt

+0

那麼,PuzzlePiece_Click效率太低,無法每次點擊都被調用?你點擊了多少次?每秒1000000? –

+1

你真的不應該從UI元素派生你的遊戲對象。如果你將這種關係分開,它應該更直接。製作電路板,隨機播放,然後爲每個作品創建UI元素。 – paddy

回答

9

對於15拼圖(以及類似的滑動瓦遊戲),瓷磚的任何安排是可解當且僅當它有一個偶校驗。

因此,你應該能夠隨機放置瓷磚。如果平價甚至是可以解決的。如果奇偶校驗是奇數,那麼只需交換兩個相鄰的拼貼就可以顛倒奇偶校驗,然後就可以解決了。

看到這裏如何衡量奇偶細節:http://en.wikipedia.org/wiki/Fifteen_puzzle#Solvability


由於維基百科的文章已被更改,以便它不再是清楚如何計算一個十五謎排列的奇偶性,我下面explian:

對於瓷磚的任何安排,你計算由反轉:

  1. 計數所有的「Inversions「。反轉是隨機的,從右上角開始,在每一行上,從左下角開始,編號爲的地方的下方的比之前的地塊要低。第一塊瓷磚從不算反轉(因爲它之前沒有瓷磚,所以它不能低於該瓷磚),並且您不計算空白空間。

  2. 添加到該行號的空白 1.

的這個總數安排的計數。如果計數是甚至那麼該排列具有偶數(或0)奇偶性。如果計數是奇數那麼它有奇數(或1)奇偶校驗。

比較起始安排的奇偶性與目標安排的奇偶性。如果它們是相同的,那麼這個難題是可以解決的,否則它是不可解的。由於標準目標排列(空間,順序爲1-15)有0個反轉且空間的行數爲1,因此我們得到一個0 + (1 - 1)或0的計數,即甚至,因此目標的奇偶校驗爲0因此任何也是0的開始安排都是可以解決的。

+0

奇偶性參數是否保留,如果左下角的空方塊? – user151496

2

如果我是你,我會從你的用戶界面中分離出你的模型。

創建一個名爲Puzzle的類。這門課將保持謎題的狀態並對狀態執行所有操作。

這可能是因爲你有可能實現的MoveLeftMoveRightMoveUp & MoveDown方法。要洗牌你可以通過隨機調用這四種方法來執行(相當長的)一系列動作。

您的Puzzle類需要爲UI呈現足夠的狀態。

這樣做,你可以簡化你的代碼,使單元測試更簡單。

+1

傾聽這個傢伙,把你所有的遊戲邏輯和實現它作爲一個獨立的類(或類)。這個想法是你的遊戲界面不應該影響遊戲的邏輯運作。雖然,我懷疑他會寫單元測試..但它可能是一個很好的學習練習! – Alan