Ponownie opracowuję grę w szachy napisaną w Javie i zastanawiałem się, czy istnieje elegancki algorytm do kolorowania płytek szachowych na numerowanej szachownicy.
W tej chwili moje rozwiązanie używa instrukcji if else, aby ustalić, czy kafelek znajduje się w parzystym czy nieparzystym rzędzie, i na tej podstawie, czy powinien to być jasny czy ciemny kwadrat.
Odpowiedzi:
Najbardziej elegancki sposób, jaki mogę wymyślić, biorąc pod uwagę, że masz wskaźniki
row
icolumn
, to:lub odwrotnie:
Zasadniczo kafelek na szachownicy jest jasny wszędzie tam, gdzie kolumna i rząd są wzajemnie nieparzyste lub parzyste, a poza tym jest ciemny.
źródło
3 % 2 == 1
i5 % 2 == 1
.. więc oba są nierówne, ale będą miały kolor „jasny”. Nie mówię, że twoje rozwiązanie jest złe (jest dobre, ponieważ zmieni naprzemiennie wzór), ale twój komentarz / wyjaśnienie wydaje się błędny.XOR razem indeksy wierszy i kolumn i spójrz na najmniej znaczący bit. Zmiana indeksu wiersza lub kolumny o jeden spowoduje odwrócenie wyniku, a zatem generuje wzorzec kontrolny.
źródło
^
jest w porządku, ale+
działa równie dobrze. :)-
działa. :)Kolejna sugestia, bardzo prosta:
Dodanie wiersza i kolumny daje liczbę kroków poziomych i pionowych od lewej górnej płytki.
Parzysta liczba kroków daje jasny kolor.
Dziwna liczba kroków daje ciemny kolor.
źródło
& 1
będzie znacznie wydajniejszy niż% 2
, chyba że ten ostatni zostanie specjalnie zoptymalizowany. Ale generalnie się zgadzam.Ten zakłada, że nasze kwadraty są ponumerowane w zakresie [0..63].
Zrozumienie, dlaczego to działa, to połowa zabawy. :)
źródło
return (i>>3 ^ i) & 1 != 0
? Czy Java pozwala na niejawną konwersję liczby całkowitej na wartość logiczną?Numeruj kafelki. Możesz uzyskać te informacje, obliczając kolumnę wiersz * 8 + lub coś podobnego.
Weź moduł 16 numeru siatki. (Przed powtórzeniem płytek jest 16 pozycji).
Pokoloruj kafelek na podstawie tego, czy ma on liczbę parzystą czy nieparzystą. Odwróć kolor kafelka, jeśli wynik jest większy niż 7.
Kod indeksów zerowych:
źródło
modulus 16
Działanie zmniejsza problem dwóch rzędach. Drugi rząd ma inny wzór niż pierwszy.if
Sprawozdanie ocenia tylko prawda, jeśli jest to albo o numerach parzystych płytki XOR nie w drugim rzędzie. Jeśli oba są prawdziwe, wartość jest fałszywa. Przejrzyj operator XOR: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
naprawdę powinienem był nazwaćIsEvenRow
. Jest to dość skomplikowany sposób na uzyskanie niskiego bitu rzędu: najpierw przesuń bity pozycji rzędu 3 w prawo, następnie odrzuć wszystkie oprócz LSB rzędu, a następnie sprawdź, czy ustawiony jest 4. bit cellnum.Chociaż takie podejście nie jest tak naprawdę konieczne w przypadku czegoś tak prostego jak szachownica, gdy myślę o eleganckim sposobie renderowania czegoś związanego z widokiem, chcę maksymalnie ułatwić zmianę renderowanego widoku. Załóżmy na przykład, że zdecydowałeś, że chcesz naprzemiennie czarno-biały w każdym rzędzie, ale nie w każdej kolumnie. Jednowierszowe używane do tej pory odpowiedzi musiałyby zostać przepisane.
Jeśli miałbym posunąć się tak daleko, jak to tylko możliwe, i maksymalnie ułatwić przeprojektowanie wzoru na szachownicy, oto co bym zrobił:
1) Zrobiłbym plik wskazujący, jaki kolor ma każdy kwadrat na szachownicy.
Na przykład mogę utworzyć plik,
chess_board_pattern.config
który wygląda mniej więcej tak:2) Napisałbym klasę / komponent / cokolwiek, co może odczytać ten plik i stworzyć jakiś obiekt reprezentujący wzorzec płytki:
3) Użyłbym tej klasy w funkcji, która faktycznie rysuje planszę.
Ponownie, jest to o wiele trudniejsze niż jest to konieczne dla szachownicy. Myślę jednak ogólnie, że pracując nad bardziej skomplikowanymi projektami, najlepiej jest wymyślić takie ogólne rozwiązania zamiast pisać kod, który później trudno zmienić.
źródło
The one-liners used in answers so far would have to be re-written.
ale takżeit's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
Ale musisz zrozumieć, że ten kod jest o wiele trudniejszy do zerwania i przepisania niż pojedynczy wiersz. Dlatego głosowałem za tobą, ponieważ nie jest to eleganckie ani wskazane.