Я перерабатываю шахматную игру, написанную на Java, и мне было интересно, есть ли элегантный алгоритм раскраски шахматных фигур на пронумерованной шахматной доске.
Прямо сейчас мое решение использует операторы if else, чтобы определить, находится ли плитка в четной или нечетной строке, и на основании этого, должен ли он быть светлым или темным квадратом.
Ответы:
Самый элегантный способ , которым я могу думать, учитывая , что у вас есть
row
иcolumn
показатели, заключается в следующем:или, наоборот:
В основном, плитка на шахматной доске светлая везде, где столбец и строка взаимно нечетны или четны, а в противном случае темны.
источник
3 % 2 == 1
и5 % 2 == 1
... так что оба неровные, но будут окрашены "светлыми". Не сказать, что ваше решение неверно (это хорошо, поскольку оно будет чередовать шаблон), но ваш комментарий / объяснение кажется неправильным.Выполните XOR вместе индексы строк и столбцов и посмотрите на младший бит. Изменение индекса строки или столбца на единицу инвертирует результат, следовательно, генерирует шаблон проверки.
источник
^
хорошо, но+
работает одинаково хорошо. :)-
, тоже работает. :)Еще одно предложение, очень простое:
Добавление строки и столбца дает количество горизонтальных и вертикальных шагов от верхнего левого тайла.
Четное количество шагов дает светлый цвет.
Нечетное количество шагов дает темный цвет.
источник
& 1
будет намного эффективнее% 2
, если только последний не будет специально оптимизирован. Но в целом я согласен.Это предполагает, что наши квадраты пронумерованы в диапазоне [0..63].
Выяснить, почему это работает, - половина удовольствия. :)
источник
return (i>>3 ^ i) & 1 != 0
? Позволяет ли Java неявное преобразование целого числа в логическое значение?Номер плитки. Вы можете получить эту информацию, рассчитав строку * 8 + столбец или что-то подобное.
Возьмите модуль 16 номера сетки. (Перед повторением тайлов есть 16 позиций.)
Цвет плитки основан на четном или нечетном числе. Отразить цвет плитки, если результат больше 7.
Код для нулевых индексов:
источник
modulus 16
Операция сводит задачу к двум строкам. Второй ряд следует другой схеме, чем первый. Операторif
оценивается как истинный только в том случае, если XOR четного тайла отсутствует во втором ряду. Если оба являются истинными, это оценивается как ложное. Просмотрите оператор XOR: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
действительно должен был быть названIsEvenRow
. Это довольно запутанный способ получить младший бит строки: сначала сдвиньте биты позиций строки 3 вправо, затем отбросьте все, кроме младшего разряда строки, а затем проверьте, установлен ли 4-й бит ячейки.Хотя этот подход на самом деле не нужен для чего-то такого простого, как шахматная доска, когда я думаю об элегантном способе рендеринга чего-либо, связанного с представлением, я хочу максимально упростить изменение отображаемого представления. Например, предположим, вы решили, что хотите чередовать чёрное и белое в каждом ряду, но не в каждом столбце. Однострочники, используемые в ответах, должны быть переписаны.
Если бы мне нужно было пойти с этим как можно дальше и сделать так, чтобы дизайн шаблона на шахматной доске был как можно проще, вот что я бы сделал:
1) Я бы сделал файл, который указывает, какого цвета у каждого квадрата на шахматной доске.
Например, я мог бы сделать файл,
chess_board_pattern.config
который выглядит примерно так:2) Я написал бы класс / компонент / все, что может прочитать этот файл и создать какой-то объект, который представляет шаблон платы:
3) Я бы тогда использовал этот класс в функции, которая на самом деле рисует доску.
Опять же, это намного сложнее, чем необходимо для шахматной доски. В целом, я думаю, что при работе над более сложными проектами лучше придумать такие обобщенные решения, чем писать код, который потом сложно изменить.
источник
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.
Но вы должны понимать, что этот код гораздо сложнее разорвать и переписать, чем одну строку. Поэтому я отказался от тебя, потому что это не элегантно и не желательно.