Saya mengembangkan kembali permainan catur yang saya tulis di Jawa, dan bertanya-tanya apakah ada algoritma yang elegan untuk mewarnai ubin catur di papan catur bernomor.
Saat ini solusi saya menggunakan pernyataan if else untuk menentukan apakah ubin berada pada baris genap atau ganjil, dan berdasarkan itu, apakah itu harus berupa kotak terang atau gelap.
Jawaban:
Cara paling elegan yang bisa saya pikirkan, mengingat Anda memiliki
row
dancolumn
indeks, adalah sebagai berikut:atau, sebaliknya:
Pada dasarnya, ubin di papan catur adalah cahaya di mana pun kolom dan barisnya saling ganjil atau genap, dan sebaliknya gelap.
sumber
3 % 2 == 1
dan5 % 2 == 1
.. jadi keduanya tidak rata tetapi akan berwarna "terang". Tidak mengatakan solusi Anda salah (itu baik, karena akan mengubah pola) tetapi komentar / penjelasan Anda tampaknya salah.XOR bersama-sama indeks baris dan kolom dan lihat bit paling tidak signifikan. Mengubah indeks baris atau kolom dengan satu akan membalikkan hasilnya, sehingga menghasilkan pola checker.
sumber
^
baik-baik saja, tetapi+
berfungsi sama baiknya. :)-
bekerja juga. :)Saran lain, sangat mudah:
Menambahkan baris dan kolom memberikan jumlah langkah horisontal dan vertikal menjauh dari ubin kiri atas.
Bahkan sejumlah langkah memberikan warna terang.
Jumlah langkah yang aneh memberi warna gelap.
sumber
& 1
akan menjadi jauh lebih efisien daripada% 2
, kecuali yang terakhir dioptimalkan secara khusus. Tetapi secara umum saya setuju.Yang ini mengasumsikan bahwa kuadrat kita diberi nomor dalam kisaran [0..63].
Mencari tahu mengapa itu bekerja adalah setengah kesenangan. :)
sumber
return (i>>3 ^ i) & 1 != 0
? Apakah java memungkinkan konversi integer ke boolean?Beri nomor ubin. Anda dapat memperoleh informasi ini dengan menghitung baris * 8 + kolom atau yang serupa.
Ambil modulus 16 dari nomor grid. (Ada 16 posisi sebelum ubin mengulangi.)
Warnai ubin berdasarkan jika memiliki nomor genap atau ganjil. Balikkan warna ubin jika hasilnya lebih besar dari 7.
Kode untuk indeks berbasis nol:
sumber
modulus 16
operasi mengurangi masalah untuk dua baris. Baris kedua mengikuti pola yang berbeda dari yang pertama. Theif
pernyataan hanya bernilai true jika salah itu adalah genteng XOR genap tidak di baris kedua. Jika keduanya benar, itu bernilai false. Tinjau operator XOR: msdn.microsoft.com/en-us/library/zkacc7k1.aspxIsSecondRow
benar-benar seharusnya dinamaiIsEvenRow
. Ini cara yang agak berbelit-belit untuk mendapatkan bit baris yang rendah: pertama-tama pindahkan bit dari posisi baris 3 ke kanan, lalu buang semua kecuali LSB baris, lalu periksa apakah bit ke-4 selnum diatur.Meskipun pendekatan ini tidak benar-benar diperlukan untuk sesuatu yang sederhana seperti papan catur, ketika saya memikirkan cara yang elegan untuk membuat sesuatu yang terkait dengan tampilan, saya ingin membuatnya semudah mungkin untuk mengubah tampilan yang diberikan sebanyak mungkin. Misalnya, Anda memutuskan ingin mengganti hitam dan putih pada setiap baris, tetapi tidak setiap kolom. Baris satu yang digunakan dalam jawaban sejauh ini harus ditulis ulang.
Jika saya melangkah sejauh mungkin dengan ini dan membuatnya mudah untuk mendesain ulang pola di papan Catur mungkin, inilah yang akan saya lakukan:
1) Saya akan membuat file yang menunjukkan warna setiap kotak di papan catur.
Misalnya, saya bisa membuat file
chess_board_pattern.config
yang terlihat seperti ini:2) Saya akan menulis kelas / komponen / apa pun yang dapat membaca file ini dan membuat beberapa jenis objek yang mewakili pola papan:
3) Saya kemudian akan menggunakan kelas itu dalam fungsi yang benar-benar menggambar papan.
Sekali lagi, ini jauh lebih sulit daripada yang diperlukan untuk papan Catur. Saya pikir secara umum, ketika bekerja pada proyek yang lebih rumit, yang terbaik untuk datang dengan solusi umum seperti ini daripada menulis kode yang sulit diubah nanti.
sumber
The one-liners used in answers so far would have to be re-written.
tetapi jugait's best to come up with generalized solutions like this instead of writing code that's difficult to change later.
Tetapi Anda harus memahami bahwa kode ini jauh lebih sulit untuk dirobohkan dan ditulis ulang daripada satu baris. Jadi saya menurunkan Anda karena tidak elegan atau disarankan untuk melakukan ini.