【问题标题】:Tic Tac Toe X and Y inversion井字游戏 X 和 Y 反转
【发布时间】:2014-04-04 22:06:42
【问题描述】:

我正在制作井字游戏小程序。当我绘制 x 时,x 和 y 坐标会翻转。

private byte[][] board = new byte[][] {{0, -1, -1},
                                       {-1, -1, -1},
                                       {0, 0, -1}};

0 是 x,1 是 o,-1 是空白在屏幕上产生

我的代码是

private int boardSize = getWidth() < getHeight() ? getWidth():getHeight();
@Override
public void paint(Graphics gr) {
    Graphics2D g = (Graphics2D)gr;
    g.setColor(Color.BLACK);
    boardSize = getWidth() < getHeight() ? getWidth():getHeight();
    g.setStroke(new BasicStroke(boardSize/72));
    g.drawLine(boardSize/3, 0, boardSize/3, boardSize);
    g.drawLine(2*boardSize/3, 0, 2*boardSize/3, boardSize);

    g.drawLine(0, boardSize/3, boardSize, boardSize/3);
    g.drawLine(0, 2*boardSize/3, boardSize, 2*boardSize/3);

    g.setStroke(new BasicStroke(boardSize/144));

    for(byte x = 0; x < 3; x++) for(byte y = 0; y < 3; y++) if(board[x][y] == 0) drawX(g, x, y);
    else if(board[x][y] == 1) drawO(g, x, y);
}

private void drawX(Graphics2D g, byte x, byte y) {
    Stroke s = g.getStroke();

    g.setStroke(new BasicStroke(boardSize/72));
    g.drawLine(x*boardSize/3+boardSize/36, y*boardSize/3+boardSize/36, (x+1)*boardSize/3-boardSize/36, (y+1)*boardSize/3-boardSize/36);

    g.setStroke(s);
}

drawO 尚未实现。我不明白为什么坐标被翻转了。

【问题讨论】:

    标签: java applet coordinates


    【解决方案1】:

    你应该用board[y][x]替换board[x][y],因为第一个索引代表块,所以当x=0从矩阵出来的向量是{0,-1,-1}

    如果您不想将x 更改为y

    你可以切换for循环

    首先循环y,然后循环x

    第一个解决方案如下所示:

    for(byte x = 0; x < 3; x++) for(byte y = 0; y < 3; y++) if(board[y][x] == 0) drawX(g, x, y);
       else if(board[y][x] == 1) drawO(g, x, y);
    

    第二个解决方案如下所示

    for(byte y = 0; y < 3; y++) for(byte x = 0; x < 3; x++) if(board[x][y] == 0) drawX(g, x, y);
        else if(board[x][y] == 1) drawO(g, x, y);
    

    【讨论】:

      【解决方案2】:

      正如其他人指出的那样,您需要翻转xy。但我觉得他们没有很好地解释为什么这是解决方案。让我用一些图形来代替。

      你知道Java中的坐标系Graphics是这样的:

         X
        ------------->
      Y |
        |
        |
        v
      

      但这不是您的二维数组坐标系所代表的。我可以告诉您编写数组是为了以图形方式表示板,但如果您以图形方式表示 2D 迭代,它的工作方式更像for (each row) for (each column),而不是相反。

      自从您将y 设为内部循环的变量后,它就变成了您的“列”坐标,通常是X 坐标。

         y
        ------------->
      x | {{0, -1, -1},
        | {-1, -1, -1},
        |  {0,  0, -1}};
        v
      

      因此,您可以了解为什么需要通过切换循环变量来区别对待它们。

      【讨论】:

        【解决方案3】:

        如果你看看你是如何定义你的董事会的

        private byte[][] board = new byte[][] {{0, -1, -1},
                                           {-1, -1, -1},
                                           {0, 0, -1}};
        

        以及如何从中获取价值

        board[x][y]
        

        当您执行board[x] 时,您将获得板的xth 元素,因此如果x 为0,则{0, -1, -1},因为板是数组的数组。然后,board[x][y] 获取该数组的 yth 元素,因此如果 y 为 1,则结果将为 -1。

        您应该使用 board[y][x] 交换从板上检索元素的方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-12
          • 2015-01-08
          相关资源
          最近更新 更多