Answers:
考虑到您拥有row
和column
索引,我想到的最优雅的方法是:
bool isLight = (row % 2) == (column % 2);
或者相反:
bool isDark = (row % 2) != (column % 2);
基本上,棋盘上的瓷砖在列和行彼此奇数或偶数的地方都是亮的,否则在黑暗的地方。
3 % 2 == 1
和5 % 2 == 1
..因此两者均不均匀,但将显示为“浅色”。并不是说您的解决方案是错误的(很好,因为它将替代模式),但是您的注释/解释似乎是错误的。
bool isLight = ((row ^ column) & 1) == 0;
将行和列索引进行XOR运算,然后查看最低有效位。将行或列的索引更改为1将反转结果,因此将生成检查器模式。
^
很好,但+
效果也一样。:)
-
也起作用。:)
另一个建议,非常简单:
isLight = (row + column) % 2 == 0;
添加行和列可得出离开左上图块的水平和垂直步数。
偶数步给出浅色。
奇数个步骤会产生深色。
& 1
比效率要高得多% 2
,除非后者经过特别优化。但总的来说,我同意。
这个假设我们的正方形在[0..63]范围内编号。
bool IsLight(int i)
{
return 0!=(i>>3^i)&1;
}
弄清楚为什么它是成功的一半。:)
return (i>>3 ^ i) & 1 != 0
吗?Java是否允许将整数隐式转换为布尔值?
编号瓷砖。您可以通过计算row * 8 + column或类似内容来得出此信息。
取网格数的模数16。(重复之前,有16个位置。)
根据图块是偶数还是奇数为图块上色。如果结果大于7,则翻转图块颜色。
从零开始的索引代码:
int cellNum = (row*8+column) % 16;
bool isSecondRow = cellNum > 7;
if(cellNum % 2 == 0 ^ isSecondRow){ //XOR operator
setColor(Color.White);
}else{
setColor(Color.Charcoal);
}
modulus 16
操作将问题减少到两行。第二行与第一行的模式不同。如果该if
语句是第二行中没有的偶数瓦片XOR,则该语句的评估结果为true。如果两者都为真,则求值为假。查看XOR运算符:msdn.microsoft.com/en-us/library/zkacc7k1.aspx
IsSecondRow
确实应该被命名IsEvenRow
。这是获取行的低位的相当复杂的方法:首先将行3的位置向右移动,然后丢弃行的LSB以外的所有位,然后检查是否设置了cellnum的第4位。
尽管对于象棋盘这样简单的东西实际上并不需要这种方法,但是当我想到一种优雅的方式来渲染与视图相关的东西时,我希望尽可能容易地更改渲染的视图。例如,假设您决定要在每一行而不是每一列上交替显示黑白。到目前为止,答案中使用的单行代码必须重新编写。
如果我要尽可能地做到这一点,并使其尽可能容易地在国际象棋棋盘上重新设计图案,这是我会做的:
1)我将制作一个文件,指示棋盘中每个正方形的颜色。
例如,我可以制作一个chess_board_pattern.config
看起来像这样的文件:
bwbwbwbw
wbwbwbwb
bwbwbwbw
wbwbwbwb
bwbwbwbw
wbwbwbwb
bwbwbwbw
wbwbwbwb
2)我将编写一个类/组件/任何可以读取此文件并创建某种表示板模式的对象的对象:
public class BoardPattern {
private Color[][] pattern;
public BoardPattern(File patternFile)
{
pattern = new Color[8][8];
//Parse the file and fill in the values of pattern
}
public Color[][] getPattern {
return pattern;
}
}
3)然后,我将在实际绘制木板的函数中使用该类。
File patternFile = new File("chess_board_pattern.ini");
Color[][] pattern = new BoardPattern(patternFile).getPattern();
ChessBoardDrawable chessBoard = new ChessBoardDrawable();
for(int row = 0; row < 8; row++) {
for(int column; column < 8; column++) {
chessBoard.drawSquare(row, column, Color[row][column]);
}
}
同样,这比国际象棋棋盘要难得多。我认为,总的来说,当处理更复杂的项目时,最好提出这样的通用解决方案,而不是编写以后很难更改的代码。
The one-liners used in answers so far would have to be re-written.
也it's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
必须编写代码,但是您必须了解,与单行代码相比,拆除和重写该代码要困难得多。因此我拒绝了您的意见,因为这样做不明智或不明智。