回答:
インデックスrow
とcolumn
インデックスがあることを考えると、私が考えることができる最もエレガントな方法は次のとおりです。
bool isLight = (row % 2) == (column % 2);
または、逆に:
bool isDark = (row % 2) != (column % 2);
基本的に、チェス盤のタイルは、列と行の両方が相互に奇数または偶数である場合は常に明るく、それ以外の場合は暗いです。
3 % 2 == 1
と仮定し5 % 2 == 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
操作により、問題が2行に減ります。2行目は、1行目とは異なるパターンに従います。if
どちらかそれは2行目の偶数タイルXORでない場合、文は唯一の真と評価されます。両方が真の場合、偽と評価されます。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.
、このコードは1行よりも分解して書き直すのがはるかに難しいことを理解する必要があります。ですから、これを行うのはエレガントでも賢明でもないので、私はあなたを断りました。