Ich entwickle ein Schachspiel, das ich in Java geschrieben habe, neu und frage mich, ob es einen eleganten Algorithmus gibt, um Schachplättchen auf einem nummerierten Schachbrett zu färben.
Im Moment verwendet meine Lösung if else-Anweisungen, um zu bestimmen, ob sich die Kachel in einer geraden oder ungeraden Reihe befindet, und basierend darauf, ob es sich um ein helles oder dunkles Quadrat handeln soll.
Antworten:
Die eleganteste Art und Weise, die mir in Anbetracht der Tatsache, dass Sie die Indizes
row
und haben, in dencolumn
Sinn kommt, ist die folgende:oder umgekehrt:
Grundsätzlich ist eine Kachel auf einem Schachbrett hell, wenn sowohl die Spalte als auch die Zeile gerade oder ungerade sind, und ansonsten dunkel.
quelle
3 % 2 == 1
und5 % 2 == 1
. Also sind beide ungerade, aber sie haben die Farbe "hell". Nicht zu sagen, dass Ihre Lösung falsch ist (es ist gut, da es das Muster abwechselt), aber Ihr Kommentar / Ihre Erklärung scheint falsch zu sein.XOR-Verknüpfung der Zeilen- und Spaltenindizes und Betrachtung des niedrigstwertigen Bits. Wenn Sie den Zeilen- oder Spaltenindex um eins ändern, wird das Ergebnis invertiert und ein Prüfmuster generiert.
quelle
^
ist in Ordnung,+
funktioniert aber genauso gut. :)-
auch. :)Ein weiterer Vorschlag, sehr einfach:
Durch Hinzufügen von Zeile und Spalte wird die Anzahl der horizontalen und vertikalen Schritte angegeben, die von der oberen linken Kachel entfernt sind.
Eine gerade Anzahl von Schritten ergibt eine helle Farbe.
Eine ungerade Anzahl von Schritten ergibt eine dunkle Farbe.
quelle
& 1
wird wesentlich effizienter als% 2
, es sei denn, letzteres ist speziell optimiert. Aber im Allgemeinen stimme ich zu.Diesmal wird davon ausgegangen, dass unsere Quadrate im Bereich [0..63] nummeriert sind.
Herauszufinden, warum es funktioniert, ist der halbe Spaß. :)
quelle
return (i>>3 ^ i) & 1 != 0
. Ermöglicht Java die implizite Konvertierung von Ganzzahlen in Boolesche Werte?Nummerieren Sie die Kacheln. Sie können diese Informationen ableiten, indem Sie Zeile * 8 + Spalte oder ähnliches berechnen.
Nehmen Sie Modul 16 der Gitternummer. (Es gibt 16 Positionen, bevor sich die Kacheln wiederholen.)
Färben Sie die Kachel basierend darauf, ob sie eine gerade oder eine ungerade Zahl hat. Kippen Sie die Kachelfarbe, wenn das Ergebnis größer als 7 ist.
Code für nullbasierte Indizes:
quelle
modulus 16
Operation reduziert das Problem auf zwei Zeilen. Die zweite Reihe folgt einem anderen Muster als die erste. Dieif
Anweisung wird nur dann als wahr ausgewertet, wenn es sich um eine gerade Kachel handelt, die sich nicht in der zweiten Zeile befindet. Wenn beides wahr ist, wird es als falsch gewertet. Überprüfen Sie den XOR-Operator: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
hätte wirklich genannt werden sollenIsEvenRow
. Es ist eine ziemlich verworrene Methode, um das niedrige Bit der Reihe zu erhalten: Verschieben Sie zuerst die Bits der Reihe 3 nach rechts, verwerfen Sie dann alle bis auf das niedrigste Bit der Reihe und überprüfen Sie dann, ob das vierte Bit der Zellennummer gesetzt ist.Obwohl dieser Ansatz für etwas so Einfaches wie ein Schachbrett nicht unbedingt erforderlich ist, möchte ich, wenn ich mir eine elegante Möglichkeit überlege, etwas mit der Ansicht zu rendern, es so einfach wie möglich machen, die gerenderte Ansicht so einfach wie möglich zu ändern. Angenommen, Sie möchten in jeder Zeile, jedoch nicht in jeder Spalte, Schwarz und Weiß abwechseln. Die bisher in Antworten verwendeten Einzeiler müssten neu geschrieben werden.
Wenn ich so weit wie möglich gehen und es so einfach wie möglich machen würde, das Muster auf dem Schachbrett neu zu gestalten, würde ich Folgendes tun:
1) Ich würde eine Datei erstellen, die angibt, welche Farbe jedes Quadrat im Schachbrett hat.
Zum Beispiel könnte ich eine Datei erstellen
chess_board_pattern.config
, die ungefähr so aussieht:2) Ich würde eine Klasse / Komponente / was auch immer schreiben, die diese Datei lesen und eine Art Objekt erstellen kann, das das Brettmuster darstellt:
3) Ich würde dann diese Klasse in der Funktion verwenden, die die Tafel tatsächlich zeichnet.
Auch dies ist viel schwieriger als es für ein Schachbrett notwendig ist. Ich denke jedoch, dass es bei der Arbeit an komplizierteren Projekten am besten ist, allgemeine Lösungen wie diese zu finden, anstatt Code zu schreiben, der später nur schwer zu ändern ist.
quelle
The one-liners used in answers so far would have to be re-written.
aber auch geschriebenit's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
Aber Sie müssen verstehen, dass dieser Code viel schwieriger abzureißen und neu zu schreiben ist als eine einzelne Zeile. Also habe ich Sie herabgestimmt, weil es nicht elegant oder ratsam ist, dies zu tun.