如何显示 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 变量,因为它们遵循命名“静态最终”变量的约定。小写变量的存在只是为了向后兼容,可以随时删除。
我想显示一个 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 变量,因为它们遵循命名“静态最终”变量的约定。小写变量的存在只是为了向后兼容,可以随时删除。