2017-01-02 12 views
0

我試圖在vb中重新創建遊戲2048,我正在努力弄清楚如何讓數組中的值一起滑動。滑動數組值

我試圖做到這一點在一維數組之前,我與全事情

例如任務自己,如果我有

[0,2,0,4] 

我需要弄清楚如何數組我可通過每個數步,檢查是否有一個背後的0,這樣的陣列將成爲

[2,4,0,0] 

,但我首先要弄清楚如何檢查後面的號碼所有的值掙扎在陣列中

我現在只是在嘗試左側滑動功能,所以我可以慢慢把事情做完,有沒有人有任何想法我可以實現這一目標?

+0

是否需要將陣列保持相同的長度? –

+0

是的,該數組表示遊戲網格上的一行。 –

回答

1

你可以用LINQ做到這一點:

Dim a = {0, 2, 0, 4} 
a = a.Where(Function(x) x <> 0).Concat(a.Where(Function(x) x = 0)).ToArray() 

Console.WriteLine(String.Join(",", a)) ' outputs 2,4,0,0 

第一Where獲取所有非零元素。 Concat將結果與(全部爲零的元素)連接起來,從而保持數據的長度,並且.ToArray()將結果轉換回數組。

+0

這工作出色,謝謝你的優雅解決方案! –

+0

我猜你看到你可以通過交換'<>'和'='來獲得「向右滑動」。 –

+0

我對它使用了數組反轉功能,但你的方式可能要好得多 –

1

舊經典For Each哪個循環數組只有一個。

Dim previousRow As Integer() = { 0, 2, 0, 4 } 
Dim newRow As Integer() = { 0, 0, 0, 0 } 

Dim newRowIndex As Integer = 0 
For Each previousValue In previousRow 
    If previousValue = 0 Then Continue For 

    newRow(newRowIndex) = previousValue 
    newRowIndex += 1 
Next 

將返回{ 2, 4, 0, 0 }

0

僞代碼:

dim arr1, arr2, 

foreach [value in array] 
    if (value is not 0) 
    then add to arr1 
    else add to arr2 

concat arr1, arr2