更新 ArrayList

每当玩家输入数字时,我都会尝试更新我的棋盘(由数组列表中的三个数组列表组成)。该数字与棋盘上的一个正方形的对应关系如下:


1 2 3

4 5 6

7 8 9

我在更新网格时遇到问题。


功能


public static void playBoard(int choice, ArrayList<ArrayList<String>> board, boolean playerTurn) {

    String val;

    if (!playerTurn) {

        val = "| X |";

    }

    else {

        val = "| O |";

    }

    if (choice>=1 && choice<=3) {

        System.out.println("H");

        ArrayList<String> updateRow = board.get(0);

        if (choice ==3) {

            val+="\n";

        }

        updateRow.set(choice-1, val);

        System.out.println(updateRow);

        board.set(0, updateRow);

        System.out.println(display(board));

    }

    else if (choice>=4 && choice<=6) {

        System.out.println("H");

        ArrayList<String> updateRow = board.get(1);

        if (choice ==6) {

            val+="\n";

        }

        updateRow.set((choice-4), val);

        board.set(1, updateRow);

        System.out.println(display(board));

    }

    else if (choice>=7 && choice<=9) {

        System.out.println("H");

        ArrayList<String> updateRow = board.get(2);

        if (choice ==9) {

            val+="\n";

        }

        updateRow.set(choice-7, val);

        board.set(2, updateRow);

        System.out.println(display(board));

    }

    else {

        System.out.println("Input out of range");

        return;

    }

}

问题在于,当用户输入一个值时,该值对应的整个列都会更新,而不是单个方块。

我已经检查过:

  • 只有一个 if 语句被触发。

  • 更新仅发生一次

  • 更新发生在正确的索引上。

通过我的调试,我认为问题所在是:

updateRow.set(choice-1, val);

当用户(玩家1)输入1时:

预期输出

| X || - || - |
| - || - || - |
| - || - || - |

实际产量

| X || - || - |
| X || - || - |
| X || - || - |

显示功能

抱歉,我没有意识到你们需要看到这个其他功能


DIEA
浏览 94回答 2
2回答

繁花不似锦

问题似乎出现在创建中:您可能为每一行使用相同的列 ArrayList 对象。// Error:ArrayList<String> row = new ArrrayList<>();row.add("...");row.add("...");row.add("...");for (int i = 0; i < 3; ++i) {&nbsp; &nbsp; board.add(row);}本来应该:for (int i = 0; i < 3; ++i) {&nbsp; &nbsp; ArrayList<String> row = new ArrrayList<>();&nbsp; &nbsp; row.add("...");&nbsp; &nbsp; row.add("...");&nbsp; &nbsp; row.add("...");&nbsp; &nbsp; board.add(row);}同样的概念错误意味着:不需要这样做:board.set(2,&nbsp;updateRow);&nbsp;//&nbsp;Not&nbsp;needed.更改板持有的 updateRow 对象中的条目是通过引用完成的。一些技巧:这里可以使用String[][].将显示/视图(字符串)与数据模型(字符?)分开更容易,所以也许char[][] board = new char[3][3];

侃侃无极

我已经使用了您的代码并添加了显示功能,它给了我预期的输出。我想您可能需要检查显示功能或创建板的方式。下面是我使用的显示功能&nbsp;public static String display(ArrayList<ArrayList<String>> board) {&nbsp; &nbsp; &nbsp;String output = "";&nbsp; &nbsp; &nbsp;for(ArrayList<String> list : board) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for(String s:list){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;output += s ;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;output += "\n";&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;return output;&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java