Je suis en train de re-développer un jeu d'échecs que j'ai écrit en Java et je me demandais s'il y avait un algorithme élégant pour colorer les tuiles d'échecs sur un échiquier numéroté.
À l'heure actuelle, ma solution utilise les instructions if else pour déterminer si la tuile est sur une ligne paire ou impaire, et sur cette base, si elle doit être un carré clair ou sombre.
Réponses:
La façon la plus élégante à laquelle je peux penser, étant donné que vous avez les indices
row
etcolumn
, est la suivante:ou, inversement:
Fondamentalement, une tuile sur un échiquier est claire partout où la colonne et la ligne sont mutuellement impaires ou paires, et est sombre sinon.
la source
3 % 2 == 1
et5 % 2 == 1
.. donc les deux sont inégales mais seront colorées "claires". Ne pas dire que votre solution est mauvaise (c'est bien, car cela alternera le modèle) mais votre commentaire / explication semble faux.XOR ensemble les indices de ligne et de colonne et regardez le bit le moins significatif. La modification de l'index d'une ligne ou d'une colonne inversera le résultat, d'où la génération d'un motif de vérificateur.
la source
^
est bien, mais+
fonctionne aussi bien. :)-
marche aussi. :)Une autre suggestion, très simple:
L'ajout de la ligne et de la colonne donne le nombre de pas horizontaux et verticaux à l'écart de la tuile supérieure gauche.
Un nombre pair d'étapes donne une couleur claire.
Un nombre impair d'étapes donne une couleur sombre.
la source
& 1
va être beaucoup plus efficace que% 2
, sauf si ce dernier est spécialement optimisé. Mais en général, je suis d'accord.Celui-ci suppose que nos carrés sont numérotés dans la plage [0..63].
Comprendre pourquoi cela fonctionne est la moitié du plaisir. :)
la source
return (i>>3 ^ i) & 1 != 0
? Java permet-il la conversion implicite d'entier en booléen?Numérotez les tuiles. Vous pouvez obtenir ces informations en calculant la ligne * 8 + colonne ou quelque chose de similaire.
Prenez le module 16 du numéro de grille. (Il y a 16 positions avant la répétition des tuiles.)
Colorez la tuile en fonction de son nombre pair ou impair. Inversez la couleur de la tuile si le résultat est supérieur à 7.
Code pour les indices de base zéro:
la source
modulus 16
opération réduit le problème à deux lignes. La deuxième ligne suit un modèle différent de la première. L'if
instruction ne prend la valeur true que si c'est une tuile XOR de nombre pair ne se trouvant pas dans la deuxième ligne. Si les deux sont vrais, il est évalué comme faux. Examinez l'opérateur XOR: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
aurait vraiment dû être nomméIsEvenRow
. C'est un moyen plutôt compliqué d'obtenir le bit de ligne le plus bas: déplacez d'abord les bits de la ligne 3 vers la droite, puis jetez tout sauf le LSB de la ligne, puis vérifiez si le 4e bit de numéro de cellule est défini.Bien que cette approche ne soit pas vraiment nécessaire pour quelque chose d'aussi simple qu'un échiquier, quand je pense à une manière élégante de rendre quelque chose lié à la vue, je veux rendre aussi simple que possible la modification de la vue rendue. Par exemple, supposons que vous ayez décidé d'alterner le noir et le blanc sur chaque ligne, mais pas sur chaque colonne. Les lignes simples utilisées jusqu'à présent dans les réponses devraient être réécrites.
Si je devais aller aussi loin que possible avec cela et rendre aussi facile que possible la refonte du motif sur l'échiquier, voici ce que je ferais:
1) Je créerais un fichier indiquant la couleur de chaque case de l'échiquier.
Par exemple, je pourrais créer un fichier
chess_board_pattern.config
qui ressemble à ceci:2) J'écrirais une classe / composant / tout ce qui peut lire ce fichier et créer une sorte d'objet qui représente le modèle de carte:
3) J'utiliserais alors cette classe dans la fonction qui dessine réellement le tableau.
Encore une fois, c'est beaucoup plus difficile que nécessaire pour un échiquier. Je pense qu'en général, cependant, lorsque vous travaillez sur des projets plus compliqués, il est préférable de proposer des solutions généralisées comme celle-ci au lieu d'écrire du code difficile à modifier plus tard.
la source
The one-liners used in answers so far would have to be re-written.
mais aussiit's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
Mais vous devez comprendre que ce code est beaucoup plus difficile à déchirer et à réécrire qu'une seule ligne. Je vous ai donc rétrogradé car il n'est ni élégant ni conseillé de le faire.