我想用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; }
优雅,对吗?
答案 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和行添加行。
这样它可以扩展和清洁..