如何显示 8x8 棋盘?

How to display an 8x8 checkerboard?

我想显示一个 8x8 的棋盘,但是使用下面的代码我只能得到颜色交替的水平线。

Color color = Color.gray;
for (int row = 0; row < 8; row++)
{
    for (int col = 0; col < 8; col++)
    {
        if (color == Color.gray)
        {
            color = Color.lightGray;
        }
        else
        {
            color = Color.gray;
        }
        g.setColor(color);
        g.fillRect(row*80, col*80, 80, 80);
    }
}

你创建你的看板columns-wise,每一列都是垂直的。

你切换每个字段的颜色,没有错。

在该栏的末尾,您得到的颜色与开始时的颜色不同,这是正确的。

然后切换颜色并开始下一列,这意味着下一列的开始颜色与前一列的开始颜色相同。 IE。你总是在同一行中使用相同的颜色。

要解决要么在每列之后再切换一次,要么不为每列的第一个字段切换。

您对每条垂直线使用相同的模式(意味着以相同的颜色开始并切换)。

BBBBBBBB
WWWWWWWW
BBBBBBBB
WWWWWWWW
BBBBBBBB
WWWWWWWW
BBBBBBBB
WWWWWWWW

但您需要切换每条垂直线的起点,以便两条连续垂直线的起点不同。

BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

因此在您的代码中还需要更改每一行的颜色,因为每一行结束颜色和下一行开始颜色都相同。

for (int row = 0; row < 8; row++) {
      for (int col = 0; col < 8; col++) {
        if (color == Color.gray) {
          color = Color.lightGray;
        } else {
          color = Color.gray;
        }
        g2.setColor(color);
        g2.fillRect(row * 80, col * 80, 80, 80);
      }
      if (color == Color.gray) {
        color = Color.lightGray;
      } else {
        color = Color.gray;
      }
    }

一个典型的方法是根据列索引的值设置Color。也就是说,如果索引是偶数,则使用一个 Color,如果索引是奇数,则根据列使用另一个 Color

Color color = col % 2 == 0 ? Color.GRAY : Color.LIGHT_GRAY;
g.setColor(color);

但是,您会遇到同样的问题,因为这只会交替列值。当您开始新的一行时,您将获得与上面的列相同的颜色,因此您会看到相同颜色的垂直列。

所以解决方案是在确定颜色时同时使用 row/column 索引:

Color color = (row + col) % 2 == 0 ? Color.GRAY : Color.LIGHT_GRAY;
g.setColor(color);

另外请注意,您应该使用大写的 Color 变量,因为它们遵循命名“静态最终”变量的约定。小写变量的存在只是为了向后兼容,可以随时删除。