【问题标题】:Print 2d array as a literal "array of arrays" (read description)将二维数组打印为文字“数组数组”(阅读说明)
【发布时间】:2018-01-16 06:23:37
【问题描述】:

这是一个非常小众的问题,所以请听我说完。

情况

我正在为命令行编写一个Ultimate Tic Tac Toe 游戏。我有一个名为currentState 的二维char[9][9] 数组,其中每个包含'X''O'' ' 的子数组表示大3x3 网格中的一个小3x3 网格(索引0 位于左上角, 1 是上中,2 是右上,3 是左中,等等,对于小网格和大网格。

问题

如果我尝试通过使用两个嵌套的for 循环正常地迭代数组来打印数组,那么要在每个小网格中显示的元素将显示在一条线上。我想打印currentState,这样它就会显示在一个“数组数组”中,就像电路板实际上想要的那样,如上面的链接所示。

我的尝试

我创建了另一个名为renderedStateint[9][9],其想法是可以使用嵌套的for 打印,如上所述;每个元素都对应于currentState 中的正确元素(例如,currentState[3][7] == renderedState[5][1] - 板中3 位置7 的元素应打印在5 行,1 列(均为零-基于))。

这种方法的困难在于找到一种方法来更新这个数组,因为从 currentState 的正方形的索引被更新(如果 currentState1[0] 正在被改变,renderState[0][3] 也应该是改变)。经过多次失败的尝试才提出以下内容,通过循环 currentState 更新 renderedState

for (int row = 0, board = 0; row < 9; row += 3)
    for (int col = 0; col < 9; col += 3, board++)
        for (int pos = 0; pos < 9; pos++)
            renderedState[row + (pos / 3)][col + (pos % 3)] = currentState[board][pos];

这可以正常工作,但我计划开发某种引擎供用户使用,因此循环遍历所有 81 个元素以更改单个值需要太多时间,因为它似乎可以简化为单个值声明,如

renderedState[someRow][someColumn] = currentState[grid][pos];

...但是如何找到someRowsomeColumn 的值?

对不起,冗长的解释。我一直试图弄清楚这一点,以至于我自己都感到困惑。如果有不清楚的地方,请提出问题。

【问题讨论】:

  • 你能在这里展示一些示例吗?
  • 为什么需要辅助数组?只需使用从“打印坐标”到“存储坐标”的映射,即可通过两个嵌套的 for 循环直接打印数组。
  • 不需要引入新的数组,只需重写toString()方法,遵循简单的逻辑。您可以使用调试器、铅笔等找到该逻辑(提示 - 某些 int 是否可被 3 整除?)。 :)
  • @Henry 这将是理想的,但我将如何去做呢?除非我弄错了,否则这将需要来自 @p.p. 的“逆”映射。建议如下 --- 你得到了 rowcol 并且必须找到 gridpos 而不是反之亦然。
  • @JacksonH 不,这正是 p.p.回答。

标签: java arrays multidimensional-array tic-tac-toe


【解决方案1】:

您可以从值网格和 pos 中计算 someRow 和 someColumn 的值:

someRow = Math.floor(grid / 3) * 3 + Math.floor(pos / 3); //each third grid-value the row increases by 3, each third pos-value it increases by 1
someColumn = (grid % 3) * 3 + pos % 3; //The column is thrice the rest of grid divided by 3 plus the position divided by three

如您所说,如果您使用从零开始的编号系统,则此代码有效。否则,您需要使用 gridpos 的相应递减值。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2015-02-03
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多