Estoy volviendo a desarrollar un juego de ajedrez que escribí en Java, y me preguntaba si hay un algoritmo elegante para colorear fichas de ajedrez en un tablero de ajedrez numerado.
En este momento, mi solución usa declaraciones if else para determinar si el mosaico está en una fila par o impar, y en función de eso, si debería ser un cuadrado claro u oscuro.
Respuestas:
La forma más elegante que se me ocurre, dado que tiene los índices
row
ecolumn
, es la siguiente:o, por el contrario:
Básicamente, un mosaico en un tablero de ajedrez es claro donde tanto la columna como la fila son mutuamente impares o pares, y de lo contrario es oscuro.
fuente
3 % 2 == 1
y5 % 2 == 1
... entonces ambas son desiguales pero serán de color "claro". No digo que su solución es incorrecta (es buena, ya que alternará el patrón) pero su comentario / explicación parece incorrecta.XOR juntos los índices de fila y columna y mira el bit menos significativo. Cambiar el índice de fila o columna por uno invertirá el resultado, por lo tanto, genera un patrón de verificación.
fuente
^
está bien, pero+
funciona igual de bien. :)-
funciona. :)Otra sugerencia, muy sencilla:
Agregar la fila y la columna da el número de pasos horizontales y verticales alejados del mosaico superior izquierdo.
Un número par de pasos da color claro.
Un número impar de pasos da color oscuro.
fuente
& 1
va a ser mucho más eficiente que% 2
, a menos que este último esté especialmente optimizado. Pero en general estoy de acuerdo.Éste supone que nuestros cuadrados están numerados en el rango [0..63].
Averiguar por qué funciona es la mitad de la diversión. :)
fuente
return (i>>3 ^ i) & 1 != 0
. ¿Java permite la conversión implícita de entero a booleano?Numera las fichas. Podría derivar esta información calculando la fila * 8 + columna o algo similar.
Tome el módulo 16 del número de cuadrícula. (Hay 16 posiciones antes de que se repitan las fichas).
Colorea el mosaico en función de si tiene un número par o impar. Voltee el color del mosaico si el resultado es mayor que 7.
Código para índices de base cero:
fuente
modulus 16
operación reduce el problema a dos filas. La segunda fila sigue un patrón diferente al primero. Laif
declaración solo se evalúa como verdadera si se trata de un XOR de mosaico par y no en la segunda fila. Si ambos son verdaderos, se evalúa como falso. Revise el operador XOR: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
Realmente debería haber sido nombradoIsEvenRow
. Es una forma bastante complicada de obtener el bit bajo de la fila: primero desplace los bits de las posiciones de la fila 3 a la derecha, luego descarte todos menos el LSB de la fila, luego verifique si el cuarto bit de cellnum está configurado.Aunque este enfoque no es realmente necesario para algo tan simple como un tablero de ajedrez, cuando pienso en una forma elegante de representar algo relacionado con la vista, quiero que sea lo más fácil posible cambiar la vista renderizada como sea posible. Por ejemplo, supongamos que decidió alternar blanco y negro en cada fila, pero no en cada columna. Las frases utilizadas en las respuestas hasta ahora tendrían que reescribirse.
Si tuviera que ir tan lejos como pudiera con esto y hacer que sea tan fácil rediseñar el patrón en el tablero de Ajedrez como sea posible, esto es lo que haría:
1) Haría un archivo que indica de qué color es cada cuadrado en el tablero de ajedrez.
Por ejemplo, podría hacer un archivo
chess_board_pattern.config
que se vea así:2) Escribiría una clase / componente / lo que sea que pueda leer este archivo y crear algún tipo de objeto que represente el patrón del tablero:
3) Entonces usaría esa clase en la función que realmente dibuja el tablero.
De nuevo, esto es mucho más difícil de lo necesario para un tablero de ajedrez. Sin embargo, creo que, en general, cuando se trabaja en proyectos más complicados, es mejor encontrar soluciones generalizadas como esta en lugar de escribir código que es difícil de cambiar más adelante.
fuente
The one-liners used in answers so far would have to be re-written.
pero tambiénit's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
Pero debe comprender que este código es mucho más difícil de eliminar y reescribir que una sola línea. Así que te rechacé porque no es elegante ni aconsejable hacer esto.