如何显示 8x8 棋盘格?
Posted
技术标签:
【中文标题】如何显示 8x8 棋盘格?【英文标题】:How to display an 8x8 checkerboard? 【发布时间】: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您的问题并添加更多信息。 【参考方案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);
另外,请注意您应该使用大写的颜色变量,因为它们遵循命名“静态最终”变量的约定。小写变量的存在只是为了向后兼容,可以随时删除。
【讨论】:
以上是关于如何显示 8x8 棋盘格?的主要内容,如果未能解决你的问题,请参考以下文章
Arduino UNO+ MAX7219驱动8X8点阵显示+Proteus仿真
Proteus仿真PCF8591 AD电压采集8X8点阵显示