我正在制作一个连续四个应用程序,或者至少是一个计算最佳动作和东西的类。游戏板的高度为 6,宽度为 7。我不确定是否应该将实例变量命名gamePosition[6][7]
为gamePosition[7][6]
. 我知道我会使用哪一个并不重要,但是一个比另一个更常见吗?我想立即以正确的方式做到这一点。
6 回答
AC 二维数组只是一个数组的数组。
为了清楚起见,添加一些常量:
#define ROWS 6
#define COLUMNS 7
如果您希望能够将一行视为单个对象,请使用:
someType gamePosition[ROWS][COLUMNS];
gamePosition[0]
表示第一(第零)行的一维数组也是如此。
如果您希望能够将列视为单个对象,请使用:
someType gamePosition[COLUMNS][ROWS];
如果你只关心单个元素,你可以用任何一种方式定义它(当然你必须保持一致)。将板视为行数组而不是列数组可能更直观一些,但两者都可以。
宽度 - 第一个方括号。高度 - 第二个方括号。
您将选择哪个选项并不重要。您的代码应该是易于理解和直观的。
这完全取决于你。这里没有“更常见”或“正确”的方式。
如果您更愿意将游戏板视为笛卡尔坐标平面,那么
[column][row]
格式会更好,因为已建立的数学实践是先指定横坐标,然后指定纵坐标。如果您更愿意将其视为矩阵,那么它会反过来,因为在索引矩阵时已建立的数学实践是将行索引放在第一位,然后将列索引放在第二位。
PS当然,该问题的唯一真正的解决方案是编写代码,以便以后您可以通过在代码的一个位置进行一次本地修改来在这两种方法之间切换:)
语义无关紧要,但对性能有一些提示:当您要遍历板上的单元格时,首先增加第二个索引,然后再增加第一个索引。那是:
for (i = 0; i < FIRST_SIZE; ++i)
for (j = 0; j < SECOND_SIZE; ++j)
... process gamePosition[i][j] ...
由于缓存局部性,您将在性能上获胜。
因此,也许您应该根据您的算法计划首先使用哪个索引。
正如之前的一些帖子,这并不重要,但它真的很重要。
首先。从逻辑上讲,它不会影响您的代码,您可以随意选择一个。但是在正常思维中,您经常写作gamePosition[6][7]
,因为您经常从上到下,从左到右思考;)
其次,我认为你需要这个。这取决于你如何使用这个数组。我会解释 :
二维数组只是数组的数组。而且,因为性能,如果您浏览数组中的所有值,通常逐行更有效。例如:你有a[n][m]
.
你应该:(逐行)
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
// do some stuff
而不是 : (逐列),因为你会失去性能
for(int i=0; i<m; i++)
for(int j=0;j<n; j++)
// do some stuff
所以。你可以在你的游戏中思考,你可以思考你如何使用你的数组:如果你更频繁地从上到下使用(俄罗斯方块游戏 - 是我算法的一个例子),你应该使用gamePosition[7][6]
否则,您更频繁地逐行浏览数组(在大多数情况下),应该使用gamePosition[6][7]
很少有人知道这一点。希望这有帮助;)
人们期望高 x 宽度和行 x 列,所以你应该使用:
gamePosition[6][7]
实际上我认为这很重要。您应该使用两种可能性中最直观的一种,以免使读者感到困惑。