【问题标题】:Connect Four; 2D Array confusion连接四;二维数组混淆
【发布时间】:2013-04-14 14:59:18
【问题描述】:

这是我第一次使用 GUI。我似乎无法用它来操纵我的头。我觉得答案很简单(对此我很抱歉),但我就是想不通。 :/

我有一个 2D JLabel 数组,每个数组都设置为默认板 ImageIcon。我在每列上方都有指定列号的按钮。在 actionPerformed 方法中,每个按钮都有这个:

if(e.getSource()== (whatever column number button name) )
{
}

我不知道如何将令牌添加到指定令牌上的最低行,我认为在我找到设置为 ImageIcon p0 的最低行之后,我将不得不根据播放器颜色将其设置为 pR 或 pB .但我不确定如何编写一个循环来找到存储 p0 的最低单元格或如何跟踪玩家颜色。

final ImageIcon p0 = new ImageIcon("Board.jpg");// default board box
final ImageIcon pR = new ImageIcon("Red.jpg");
final ImageIcon pB = new ImageIcon("Black.jpg");

JLabel [][] connectFourBoardComp = new JLabel[6][7];
for(int row=0, count=6; row<1; row++)
{
    for(int col=0; col<7; col++, count++)
    {
          connectFourBoardHumn[row][col].setIcon(p…
          System.out.println(connectFourBoardHumn[…
    }
}

任何帮助将不胜感激!谢谢! :)

【问题讨论】:

    标签: java user-interface multidimensional-array logic jlabel


    【解决方案1】:

    要跟踪当前播放器的颜色,只需在每次用户播放时切换颜色:

    if (nextColor == pR) {
        nextColor = pB;
    }
    else {
        nextColor = pR;
    }
    

    要找到带有 p0 图标的第一行(假设最低行位于索引 0 处),只需遍历行直到找到那个:

    int firstEmptyRow = connectFourBoardComp.size(); // default case: the the row is full of tokens
    for (int i = 0; i < connectFourBoardComp; i++) {
        if (connectFourBoardComp[i][column] == p0) {
            firstEmptyRow = i;
            break; // break out of the loop
        }
    }
    

    【讨论】:

    • 非常感谢您的回复!这是我要写的吗?:if(e.getSource()== buttonCompCol0) { int firstEmptyRow = connectFourBoardComp.size(); // default case: the row is full of tokens for (int i = 0; i &lt; connectFourBoardComp; i++) { if (connectFourBoardComp[i][0] == p0) { firstEmptyRow = i; break; // break out of the loop } } connectFourBoardComp[i][0].setIcon(nextPlayer); }
    • 没有。如果你这样做了,你会计算第一个空行,因为你从不使用它。最后一条指令应该是:if (firstEmptyRow &lt; connectFourBoardComp.size()) { connectFourBoardComp[firstEmptyRow][0].setIcon(nextPlayer); }。此外,您似乎会为每一列重复此代码。你不应该那样做。相反,将此代码放入以列为参数的方法中,在操作侦听器中为列使用变量,并将此变量传递给方法。此外,如果 firstEmptyRow >= connectFourBoardComp.size(),您可能应该显示一条错误消息。
    • 重复每一列的代码会有什么问题?如果我做了一个单独的方法,我必须这样做吗?:在actionPerformed方法中,对于每个按钮,我会将int column设置为相应的数字并调用一个方法。此方法检查并分配firstEmptyRow 并根据颜色放置令牌。我是否正确掌握了这一点?再次感谢您的帮助。
    • 是的,您正确掌握了它。问题是代码越长,维护就越困难,并且在其中引入错误的可能性就越高(例如,复制粘贴并忘记更改索引)。编程的第一条规则是 DRY:不要重复自己。您在这里只有 6 列。如果你有 1000 个会发生什么?你会重复相同的代码 1000 次吗?那如果你有 6 个,为什么要这样做呢?
    • 我明白了,我会为我未来的项目记住 DRY :) 。非常感谢您,先生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多