【问题标题】:How to display an 8x8 checkerboard?如何显示 8x8 棋盘格?
【发布时间】:2020-12-12 05:22:03
【问题描述】:

我想显示一个 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);
    }
}

【问题讨论】:

  • 不工作”是什么意思?它不编译吗?它会抛出异常吗?它会产生意想不到的结果吗?请edit您的问题并添加更多信息。

标签: java swing for-loop awt graphics2d


【解决方案1】:

你创建你的板列,每列垂直。

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

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

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

解决在每列之后再次切换一次,或者不对每列的第一个字段进行切换。

【讨论】:

  • 感谢您的解释。我现在在外部 for 循环中添加了相同的检查(切换颜色)。现在,一旦它进入新行,它就会切换两次颜色,这意味着我使用与用于结束前一行的颜色相同的颜色开始。我现在明白了。谢谢!
  • 我的荣幸。顺便说一句,我相信您混淆了行和列,和/或 x 和 y 坐标。
  • 是的,你是对的。我的意思是“现在,一旦它进入一个新的 COLUMN,它会切换两次颜色,这意味着我使用与结束前一个 COLUMN 的颜色相同的颜色开始。”
【解决方案2】:

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

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;
      }
    }

【讨论】:

  • 我不明白你的解释。在 OP 的图片中,每个水平行实际上确实与前一个不同。问题是颜色在一行内的字段之间没有变化。
  • 您是否认为代码创建了一个水平行并继续下面的下一行?或者它是一个垂直列,然后是旁边的下一个?请注意,OP 并没有一致地命名计数器变量....
  • @Yunnosch 在每一行结束颜色之后和下一行开始颜色在 OP 代码中是不同的,但它需要相同,所以只需在行结束后再次切换。有趣的是,OP 与答案完全相同。我测试了它的工作代码。
  • 对你来说是水平的“行”(对我来说是)和垂直的列(对我来说是)还是对你来说是相反的?你看过OP的照片吗?您的解释与图片显示的不符。如果您在解释中使用“水平”和“垂直”,那么即使您和我在“列”和“行”的含义上存在分歧,也会有所帮助。事实上,你的解释对于同意我的理解的人来说是错误的,他们可能不是一半的观众,但让我认为我并不孤单......
  • @Yunnosch 图片显示当前输出和当前 OP 以相同颜色(相同图案)的每条垂直线开始,但需要切换才能制作棋盘
【解决方案3】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多