Estou re-desenvolvendo um jogo de xadrez que escrevi em Java e fiquei imaginando se existe um algoritmo elegante para colorir peças de xadrez em um tabuleiro de xadrez numerado.
No momento, minha solução usa instruções if else para determinar se o bloco está em uma linha par ou ímpar e, com base nisso, se deve ser um quadrado claro ou escuro.
Respostas:
A maneira mais elegante em que consigo pensar, considerando que você tem os índices
row
ecolumn
, é a seguinte:ou, inversamente:
Basicamente, um ladrilho em um tabuleiro de xadrez é leve onde quer que a coluna quanto a linha sejam mutuamente ímpares ou pares e, caso contrário, é escuro.
fonte
3 % 2 == 1
e5 % 2 == 1
.. então ambos são desiguais, mas serão coloridos como "claros". Não dizendo que sua solução está errada (é bom, pois alternará o padrão), mas seu comentário / explicação parece errado.XOR juntos os índices de linha e coluna e observe o bit menos significativo. Alterar o índice de linha ou coluna por um irá inverter o resultado, portanto, gera um padrão de verificador.
fonte
^
está bem, mas+
funciona igualmente bem. :)-
funciona também. :)Outra sugestão, muito direta:
Adicionar a linha e a coluna fornece o número de etapas horizontais e verticais do bloco superior esquerdo.
Um número par de etapas fornece cores claras.
Um número ímpar de etapas fornece cores escuras.
fonte
& 1
será muito mais eficiente do que% 2
, a menos que o último seja especialmente otimizado. Mas, em geral, eu concordo.Este assume que nossos quadrados são numerados no intervalo [0..63].
Descobrir por que funciona é metade da diversão. :)
fonte
return (i>>3 ^ i) & 1 != 0
? O java permite a conversão implícita de número inteiro em booleano?Numere as peças. Você pode derivar essas informações calculando a linha * 8 + coluna ou algo semelhante.
Tome o módulo 16 do número da grade. (Existem 16 posições antes da repetição das peças.)
Pinte o ladrilho com base se ele tiver um número par ou ímpar. Vire a cor do ladrilho se o resultado for maior que 7.
Código para índices baseados em zero:
fonte
modulus 16
operation reduces the problem to two rows. The second row follows a different pattern than the first. Theif
statement only evaluates to true if either it is an even-numbered tile XOR not in the second row. If both are true, it evaluates to false. Review the XOR operator: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
realmente deveria ter sido nomeadoIsEvenRow
. It's a rather convoluted way to get the low bit of row: first shift the bits of row 3 positions to the right, then discard all but the LSB of row, then check if the 4th bit of cellnum is set.Embora essa abordagem não seja realmente necessária para algo tão simples quanto um tabuleiro de xadrez, quando penso em uma maneira elegante de renderizar algo relacionado à vista, desejo facilitar o máximo possível a alteração da exibição renderizada. Por exemplo, suponha que você tenha decidido alternar preto e branco em cada linha, mas não em cada coluna. Os one-liners usados nas respostas até agora teriam que ser reescritos.
Se eu fosse o mais longe possível e tornasse mais fácil redesenhar o padrão possível no tabuleiro de xadrez, eis o que eu faria:
1) Eu faria um arquivo que indica qual a cor de cada quadrado no tabuleiro de xadrez.
Por exemplo, eu poderia criar um arquivo
chess_board_pattern.config
parecido com este:2) Eu escreveria uma classe / componente / qualquer coisa que possa ler este arquivo e criaria algum tipo de objeto que represente o padrão do quadro:
3) Eu usaria essa classe na função que realmente chama a atenção.
Novamente, isso é muito mais difícil do que o necessário para um tabuleiro de xadrez. Penso que, em geral, ao trabalhar em projetos mais complicados, é melhor apresentar soluções generalizadas como essa, em vez de escrever código difícil de mudar mais tarde.
fonte
The one-liners used in answers so far would have to be re-written.
mas tambémit's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
Mas deve entender que esse código é muito mais difícil de desmontar e reescrever do que uma única linha. Por isso, diminuí o seu voto porque não é elegante ou aconselhável fazer isso.