Элегантный способ инициализации Listв C # - PullRequest
0 голосов
/ 04 июня 2018

Я хочу проверить выигрыш в крестики-нолики на 3х3 2D матрице в C #.У меня следующая структура:

public struct GridCoordinates {
    public int row;
    public int column;
}

Чтобы проверить все строки, столбцы и диагонали доски, я мог бы сделать следующее.Я мог бы создать предварительно рассчитанный List<List<GridCoordinates>>, где внутренний список представляет собой набор из 3 координат, каждая из которых представляет собой строку, столбец или диагональ.Но когда я думаю, как долго для инициализации этих List<List<GridCoordinates>> будут использоваться new s, я начинаю думать, что в C # должен быть лучший способ.Пожалуйста, посоветуйте, как элегантно заполнить эти предварительно вычисленные координаты.

Мой BG пришел из C ++, где я мог бы сделать что-то вроде этого:

#include <iostream>
#include <vector> using namespace std;

struct GridCoordinates {
    int i;
    int j; 
 };

vector<vector<GridCoordinates>> vec{
    {{0,0}, {0,1}, {0, 2}}
    };

int main() {   std::cout << vec[0][2].j; }

Элегантно, верно?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Структура должна быть GridCoordinate (в единственном числе) (я верю в эти вещи),

Вот что я хотел бы сделать, чтобы сохранить его в чистоте

Иметь класс с именем Coordinate

public class Coordinate
{
     int row;
     int column;
     bool status;
}

имеет строку координат

public class Row
{
     int length;
     List<Coordinate> coOrds;
}

наконец, есть класс с именем Grid

public class Grid    
{
     int cols;
     int rows;    
     List<Row> rows;
}

, теперь добавляются строки, основанные на столбцах и строках, которые вам нужны динамически.

так он расширяется и чистится ..

0 голосов
/ 04 июня 2018

Вы можете объявить двумерный массив кортежей (X, Y) как поле в классе следующим образом:

static readonly (int X, int Y)[,] winningLines =
{
    {(0, 0), (0, 1), (0, 2)},
    {(0, 0), (1, 1), (2, 2)},
    {(0, 0), (1, 0), (2, 0)},
    {(0, 1), (1, 1), (2, 1)},
    {(0, 2), (1, 2), (2, 2)},
    {(1, 0), (1, 1), (1, 2)},
    {(2, 0), (1, 2), (2, 2)},
    {(0, 2), (1, 1), (2, 0)}
};

Это позволяет довольно кратко объявить массив.Однако доступ к нему все еще довольно подробный, например:

using System;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine(isWinFor('X')); // false
            Console.WriteLine(isWinFor('O')); // false

            board[0, 0] = 'X';
            board[1, 1] = 'X';
            board[2, 2] = 'X';

            Console.WriteLine(isWinFor('X')); // true
            Console.WriteLine(isWinFor('O')); // false
        }

        static bool isWinFor(char player)
        {
            for (int line = 0; line < winningLines.GetUpperBound(0); ++line)
            {
                bool won = true;

                for (int coord = 0; coord < 3; ++coord)
                {
                    var p = winningLines[line, coord];

                    if (board[p.X, p.Y] != player)
                        won = false;
                }

                if (won)
                    return true;
            }

            return false;
        }

        static readonly char[,] board = new char[3,3];

        static readonly (int X, int Y)[,] winningLines =
        {
            {(0, 0), (0, 1), (0, 2)},
            {(0, 0), (1, 1), (2, 2)},
            {(0, 0), (1, 0), (2, 0)},
            {(0, 1), (1, 1), (2, 1)},
            {(0, 2), (1, 2), (2, 2)},
            {(1, 0), (1, 1), (1, 2)},
            {(2, 0), (1, 2), (2, 2)},
            {(0, 2), (1, 1), (2, 0)}
        };
    }
}

(ПРИМЕЧАНИЕ. Для поддержки кортежей требуется c # 7.0 или более поздняя версия.)

...