优雅的List <list <coordinate>&gt;初始化方式在C#中

时间:2018-06-04 11:28:49

标签: c# c++ list populate

我想用C#中的3x3 2D矩阵检查tic-tac-toe的胜利。我有以下结构:

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

为了检查电路板的所有行,列和对角线,我可以执行以下操作。我可以创建一个预先计算的List<List<GridCoordinates>>,其中内部列表是3个坐标的集合,每个坐标代表行,列或对角线。但是当我认为List<List<GridCoordinates>>的初始化将使用new多久时,我开始认为在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 :(得分:0)

你可以将(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或更高版本。)

答案 1 :(得分:0)

结构应该是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;
}

现在根据动态需要的cols和行添加行。

这样它可以扩展和清洁..