c#:将锯齿数组的给定行移到顶部



我制作了一款需要清除线条的俄罗斯方块游戏。我收集完整的行,并通过以下操作使它们为空:

for (var i = 0; i < playingGrid.Length; i++) //get rows
{
if (!playingGrid[i].Contains(0)) //check if all colls are filled 
{
playingGrid[i] = new int[10]; //make the row empty
//Here i need to push this row to the top of the jagged array
}
}
//playingGrid:
public int[][] playingGrid = new int[20][];

for (var i = 0; i < 20; i++)
{
playingGrid[i] = new int[10];
}

我的问题是我怎么能得到我在锯齿数组的顶部清除的行?

您应该使用索引来移动整个行。此外,不需要使用int数组,因为单元格(列)只能有两种状态,这是使用bool的完美情况:

var rowsCount = 20;
var columnsInRowCount = 10;
var playingGrid = new bool[rowsCount][];
for (var rowIndex = 0; rowIndex < playingGrid.Length; rowIndex++)
{
playingGrid[rowIndex] = new bool[columnsInRowCount];
}
var rowIndexesToMove = new List<int>(rowsCount);
var firstNonEmptyRowIndex = Array.FindIndex(playingGrid, row => row.Contains(true));
// save full row indexes (start from first non-empty one, no need to check top empty rows)
for (var rowIndex = firstNonEmptyRowIndex; rowIndex < playingGrid.Length; rowIndex++)
{
var row = playingGrid[rowIndex];
if (!row.Contains(false))
{
rowIndexesToMove.Add(rowIndex);
}
}
// move full rows to top
for (var fullRowIndex = 0; fullRowIndex < rowIndexesToMove.Count; fullRowIndex++)
{
for (var rowIndex = rowIndexesToMove[fullRowIndex]; rowIndex >= firstNonEmptyRowIndex + fullRowIndex; rowIndex--)
{
for (var c = 0; c < playingGrid[firstNonEmptyRowIndex + fullRowIndex].Length; c++)
{
playingGrid[rowIndex][c] = false;
}
if (rowIndex > 0)
{
var temp = playingGrid[rowIndex];
playingGrid[rowIndex] = playingGrid[rowIndex - 1];
playingGrid[rowIndex - 1] = temp;
}
}
}

最新更新