繁体   English   中英

Tic Tac Toe X和Y反演

[英]Tic Tac Toe X and Y inversion

我正在制作一个井字游戏小程序。 当我绘制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尚未实现。 我不明白为什么coordiantes被翻转。

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

如果你不想用y改变x

您可以切换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);

正如其他人指出的那样,你需要翻转xy 但我不觉得他们解释为什么这个解决方案非常好。 让我告诉你使用一些图形。

您知道Java Graphics中的坐标系统如下所示:

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

但这不是您的2D阵列坐标系所代表的。 我可以告诉你编写数组以便以图形方式表示电路板,但是如果你以图形方式表示2D迭代,它for (each row) for (each column)比另一种方式更像。

既然你让y您的内部循环的变量,它成为你的“列”的坐标,这通常会一直X坐标。

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

因此,您可以通过切换它们来了解为什么需要以不同方式处理循环变量。

如果你看看如何定义你的板

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

以及如何从中获取价值

board[x][y]

当你执行board[x]你会得到board的xth元素,所以如果x是0那么{0, -1, -1} ,因为board是一个数组数组。 然后, board[x][y]获取该数组的yth元素,因此如果y为1,则结果为-1。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM