我有一个二维数组,我试图用它来表示游戏中的网格。它是5x3,看起来像:[0,0][0,1][0,2][0,3][0,4][1,0][1,1][1,2][1,3][1,4][2,0][2,1][2,2][2,3][2,4]问题是,我想将某个点转换到屏幕上的某个位置,但在我的二维数组中,x似乎是垂直值,y则是水平值。如果我想在x=1,y=2处添加一个节点,那么我将有效地执行-right-2和-down-1。但当我想到x时,我想到一个水平值(左/右)。我是不是设计错了?如何设计二维数组,使x值对应于左/右移动和y向上/向下。我正在创建数组,如下所示: init(width: Int, height: Int) { self.width = width self.height = height for y in 0..<height { map.append([Tile]()) for _ in 0..<width { map[y].append(Tile(blocked: false)) } } }其中tile只是一个保持其位置的对象和一些其他不相关的东西。谢谢! 最佳答案 这是将矩阵存储在row major order, vs column major order中的问题。Row major是在迭代外部数组生成行时,迭代内部数组生成行中的元素。由于文本输出(到文件或终端)是逐行进行的,因此这对于打印来说是可取的。然而,这意味着当在表单中进行索引时,第一个索引( >)是您的垂直坐标(通常称为),而第二个索引(a[b][c])是您的水平坐标(通常称为),它不遵循通常使用的“b然后“cc”)惯例。但是,您可以通过编写自定义下标运算符来轻松解决此问题,该运算符将两个索引翻转:struct Tile { let blocked: Bool init(blocked: Bool = false) { self.blocked = blocked }}extension Tile: CustomDebugStringConvertible { var debugDescription: String { return self.blocked ? "X" : "-" }}struct Gameboard { var tiles: [[Tile]] init(tiles: [[Tile]]) { let width = tiles.first?.count assert(!tiles.contains(where:) { $0.count != width }, "The tiles must be a square matrix (having all rows of equal length)!") self.tiles = tiles } init(width: Int, height: Int) { self.init(tiles: (0..<height).map { row in (0..<width).map { column in Tile() } }) } subscript(x x: Int, y y: Int) -> Tile { return self.tiles[y][x] }}extension Gameboard: CustomDebugStringConvertible { var debugDescription: String { let header = (self.tiles.first ?? []).indices.map(String.init).joined(separator: "\t") let body = self.tiles.enumerated().map { rowNumber, row in let rowText = row.map { $0.debugDescription }.joined(separator: "\t") return "\(rowNumber)\t\(rowText)" }.joined(separator: "\n") return "\t\(header)\n\(body)" }}let g = Gameboard(width: 5, height: 3)print(g)// Example indexing:let (x, y) = (2, 3)g[x: x, y; y]行主顺序也更可取,因为它是使用嵌套数组表示矩阵的自然结果let matrix = [ // Outer array hold rows [1, 2, 3] // The inner arrays hold elements within rows [4, 5, 6] [7, 8, 9]] // Thus, this matrix is in row-major order.您可以使用列主顺序来解决交换索引的问题,但这意味着您需要transpose the matrix如果您希望逐行打印它或使用嵌套数组文字定义它。关于arrays - 为什么在我的2d数组中x值是垂直的,y值是水平的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50012419/
10-10 18:37