C # Есть ли компактный способ получить более одной координаты в 2d-массиве? - PullRequest
2 голосов
/ 25 марта 2019

Попытка сделать connect4, и я хочу проверить, заполнен ли столбец (вертикальный), поэтому простой способ сделать это будет в if с [i, 1] != O && [i, 2] != O && [i, 3] != O и так далее, но разве нет более эффективного способ идти об этом?

Доска выглядит так:

O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O

Цикл for:

for (int i = row - 1; i > -1; i--)
{
     if (board[i, column].ToString() == "O" && beurt % 2 == 0)
     {
         board[i, column] = (Veld)player1.color;
         beurt += 1;
         break;
     }
     else if(board[i, column].ToString() == "O" && beurt % 2 == 1)
     {
             board[i, column] = (Veld)player2.color;
             beurt += 1;
             break;
     }
     else if(???)
     {
             //???
     }
}

Ответы [ 2 ]

4 голосов
/ 25 марта 2019
bool isRowFull(char[,] array, int row)
{
    for(int i=0;i<array.GetLength(0); i++)
        if(array[row, i] == 'O') return false;
    return true;
}

И вы можете назвать это как:

bool isFull = isRowFull(board, 3); // check if row 3 is full 

или

if(isRowFull(board, 3))
{
    //your code
}

Чтобы получить первый NonFull ряд:

int FirstNonFull(char[,] array)
{
    for(int i=0;i<array.GetLength(1);i++)
        if(!isRowFull(array, i)) return i;
    return -1; // -1 indicating that all rows are full (not found)
}
1 голос
/ 25 марта 2019

Аналогично, вы можете использовать Linq, чтобы проверить, что All предметов на row равно O:

public static bool IsRowEmpty(char[,]board, int row)
{
    return Enumerable.Range(0, board.GetUpperBound(1)).All(col => board[row, col] == 'O');
}
...