Доступ к строкам / столбцам / диагоналям двумерной матрицы C# - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы получить доступ к строкам, столбцам и диагонали двухмерной матрицы. Как я могу сделать это правильно?

Я планирую использовать это в функции, где я получу доступ к определенной строке, столбцу или диагонали, а затем выйду из вложенного l oop.

Я пробовал следующий пример:

Учитывая 2-мерную матрицу символов:

char[,] board = { { 'O', 'O', 'O' }, { 'X', 'X', 'X' }, { 'O', 'O', 'O' } };

for (int i = 0; i < board.GetLength(0); i++)
{
    for (int j = 0; j < board.GetLength(1); j++)
    {

        // for example the second row where all the values are X
        if (board[i+1, j] == 'X' && board[i+1, j+1] == 'X' && board[i+1, j+2] == 'X')
        {
            Console.WriteLine(board[i+1, j]);
            Console.WriteLine(board[i+1, j+1]);
            Console.WriteLine(board[i+1, j+2]);
        }
    }
}

1 Ответ

0 голосов
/ 27 апреля 2020

Для чтения из массива нужным вам методом, пропустите циклы for и просто получите прямой доступ к массиву ...

// Only X's
Console.Write(board[1, 0]);
Console.Write(board[1, 1]);
Console.WriteLine(board[1, 2]);
// Diagonal
Console.Write(board[0, 0]);
Console.Write(board[1, 1]);
Console.WriteLine(board[2, 2]);

Используйте циклы for, если вы хотите перебирать и отображать все значения, содержащиеся в массиве. Удалите i + 1 или 2 и j + 1 или 2, так как они в конечном итоге превысят ограничения массива и приведут к ошибке

for (int i = 0; i < board.GetLength(0); i++)
{
    for (int j = 0; j < board.GetLength(1); j++)
    {
        Console.WriteLine(board[i, j]);
    }
}

Для поиска победителей вы можете сделать что-то простое, например, проверить все 8 комбинации:

if ((board[0, 0] == charToCompare && board[0, 1] == charToCompare && board[0, 2] == charToCompare) || //Row 1
(board[1, 0] == charToCompare && board[1, 1] == charToCompare && board[1, 2] == charToCompare) || //Row 2
(board[2, 0] == charToCompare && board[2, 1] == charToCompare && board[2, 2] == charToCompare) || //Row 3
(board[0, 0] == charToCompare && board[1, 0] == charToCompare && board[2, 0] == charToCompare) || //Col 1
(board[1, 0] == charToCompare && board[1, 1] == charToCompare && board[1, 2] == charToCompare) || //Col 2
(board[2, 0] == charToCompare && board[2, 1] == charToCompare && board[2, 2] == charToCompare) || //Col 3
(board[0, 0] == charToCompare && board[1, 1] == charToCompare && board[2, 2] == charToCompare) || //Diagonal Top to Bottom
(board[2, 0] == charToCompare && board[1, 1] == charToCompare && board[0, 2] == charToCompare)) //Diagonal Bottom to Top
{
    Console.WriteLine("Winner");
}

Или изменить исходный код с 1 для l oop и разрывов, вы можете сделать так. Вероятно, есть гораздо лучшие способы, но для эффективной реализации вам нужно будет внедрить процедуру проверки решений, которые вы желаете

char[,] board = {   { 'X', 'O', 'O' }
                ,   { 'X', 'X', 'O' }
                ,   { 'O', 'X', 'X' } };

char charToCompare = 'X';

for (int i = 0; i < 3; i++)
{
     if (board[i, 0] == charToCompare && board[i, 1] == charToCompare && board[i, 2] == charToCompare)
     {
         Console.WriteLine($"Winner Row {i}");
         break;
     }
     if (board[0, i] == charToCompare && board[1, i] == charToCompare && board[2, i] == charToCompare)
     {
         Console.WriteLine($"Winner Column {i}");
         break;
     }
}

if (board[0, 0] == charToCompare && board[1, 1] == charToCompare && board[2, 2] == charToCompare)
{
    Console.WriteLine("Winner diagonal top to bottom");
}

if (board[2, 0] == charToCompare && board[1, 1] == charToCompare && board[0, 2] == charToCompare)
{
    Console.WriteLine("Winner diagonal bottom to top");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...