Jutaan adalah kamu. Kami - kegelapan, dan kegelapan, dan kegelapan.
Cobalah, lawan kami!
Ya, orang Skit - kita! Ya, orang Asia - kami ...
Alexander Block " Scythians "Dalam
artikel sebelumnya
, saya berbicara banyak tentang temuan saya di bidang desain dan antarmuka pengguna permainan papan, tetapi saya harus menyela cerita itu, Anda dapat mengatakan di tengah, sebagian karena volume besar artikel, sebagian hanya karena pada saat itu saya belum siap untuk melanjutkannya selanjutnya. Sejak itu, banyak yang berubah. Masalah baru yang menarik diselesaikan, dan game yang menghasilkannya (tidak kalah menarik) ditambahkan ke
rilis . Saya ingin membicarakan hal ini hari ini.
Jika ada yang ingat, itu tentang permainan "
Abalon ", yang dikembangkan oleh Michel Lale dan Laurent Levy pada tahun 1988. Esensinya adalah untuk mendorong bola musuh keluar dari lapangan. Dua bola bisa mendorong satu, dan tiga bola - sepasang bola dengan warna berbeda. Pemain dapat menggerakkan bolanya di papan, satu per satu, atau dalam kelompok, masing-masing dua atau tiga bola (selain itu, tiga bola harus membentuk "baris"). Apa yang mencegah saya membuat game ini terakhir kali?
Jelas bukan gerakan kelompok itu sendiri. Gerakan serentak dari beberapa bagian, dalam satu gerakan, bahkan dalam
Catur (
kastil ). Dan
teka-teki "
Teka-teki geser " hanya dibuat untuk memastikan bahwa gerakan seperti itu terjadi secara serempak dan lancar. Mari kita lihat satu game yang dikembangkan oleh Robert Abbott pada tahun 1975:
Itu terlihat seperti Abalon. Satu-satunya perbedaan adalah bahwa "baris" tidak "mendorong" potongan lawan dari tempatnya, tetapi hanya memindahkannya dari papan dengan menggunakan tangkapan "catur". Kemenangan diberikan kepada salah satu pemain yang berhasil menarik lebih banyak pada baris terakhir dari papannya daripada yang berhasil dilakukan lawannya saat itu. Seluruh permainan dibangun di atas memindahkan "baris". Tampaknya tidak mungkin berhasil memenangkan hanya karya-karya soliter. Inilah yang terlihat seperti gerakan mendorong sederhana.
Zrf(define push-1 ( $1 (verify friend?) (while friend? cascade $1 ) (verify not-friend?) add ))
Ini semua tentang
kaskade kata ajaib - itu memaksa penerjemah untuk "melepaskan" sosok yang dipindahkan ke bidang saat ini, mengambil dari sana "di tangan" sosok lain (itu tidak penting untuk dirinya sendiri atau lawan) dan terus bergerak, sudah dengan angka baru "di tangan". Dalam satu gerakan, operasi seperti itu dapat dilakukan berulang kali, sehingga memindahkan jumlah potongan yang tidak terbatas pada satu waktu. Kasus (dan sedikit lebih kompleks) seperti itu juga ditemukan di game lain - "
Guns ", "
Dameo ", "
Leutwayite Game ", ...
Dari sudut pandang antarmuka pengguna, gerakan "mendorong" juga diterapkan dengan sangat sepele. Label bidang target yang familier (lingkaran hijau) muncul pada gambar. Jika (sesuai aturan permainan) kita bisa makan bagian ini - kita makan (tangkapan catur), sebaliknya - kita dorong. Anda dapat mendorong satu baris dan lebih dari satu bidang ke depan (seperti dalam game Epaminondas). Tentu saja, mengkode langkah seperti itu akan sedikit lebih rumit:
Zrf (define push-2 ( $1 (verify friend?) (while friend? mark $1 (verify not-enemy?) to back cascade $1 ) $1 (verify not-friend?) add ))
Kata kunci to (dan dipasangkan
dari ) bertindak bersamaan dengan
kaskade . Ini berarti bahwa angka "di luar kendali" harus diletakkan di papan tulis sekarang, dan sosok yang baru "ambil di tangan" beberapa saat kemudian, setelah menavigasi ke bidang lain. Secara umum, gerakan "mendorong" itu sederhana, tetapi ada jenis gerakan kelompok lain ke Abalon:
Saya menyebutnya gerakan "melintang". Dari sudut pandang pengkodean ZRF, tidak ada yang rumit di dalamnya. Masalahnya ada di antarmuka pengguna. Bagaimana cara "memberi tahu" program bahwa pemain ingin memindahkan bukan satu bola, tetapi sebuah kelompok, jika kedua gerakan itu diizinkan oleh aturan? Saya menggunakan "blink" yang sama, yang sangat berguna bagi saya di checker, untuk menandai angka "saat ini". Hanya sekarang ada beberapa angka "saat ini" di set.
Klik pada angka "bebas" menambahkannya ke grup jika ada gerakan di mana semua angka yang ditambahkan ke grup terlibat (bahkan lebih mudah untuk tidak melepaskan tombol, menyoroti seluruh grup dengan satu klik mouse). Jika tidak ada gerakan seperti itu, hanya grup baru yang dibuat, sejauh ini terdiri dari satu bagian. Lingkaran hijau selalu ditampilkan untuk gambar terakhir yang ditambahkan (ini mungkin tidak terlalu jelas, tetapi Anda bisa terbiasa dengannya). Klik berulang pada sosok "menyilaukan" segera mengatur ulang seluruh grup.
Ngomong-ngomongLingkaran hijau tidak akan selalu muncul begitu saja di hadapan figur "menyilaukan". Dalam beberapa kasus, sebuah situasi dimungkinkan di mana semua bagian yang dipilih dimasukkan dalam beberapa langkah yang valid, tetapi tidak ada langkah yang valid, terbatas pada hanya memindahkan bentuk yang dipilih ini. Kedengarannya agak membingungkan, tapi inilah ilustrasi:
Dalam
permainan ini hanya gerakan simultan dari kelompok tiga potong yang diizinkan (jika ada lebih sedikit bagian yang tersisa, semua orang harus bergerak). Semua gambar yang dipilih bergerak satu langkah dan ke arah yang sama. Catur menangkap, potongan-potongannya mengganggu gerakan. Untuk menang, Anda harus memegang setidaknya satu bagian Anda di baris terakhir, ke kamp musuh.
Gim itu sendiri, menurut saya, tidak terlalu menarik, tetapi, dari sudut pandang pengkodean, ini adalah kegilaan yang nyata. Setiap upaya untuk "jujur" menghasilkan semua gerakan yang mungkin dari kelompok tiga tokoh mengarah ke ledakan kombinatorial. Anda harus menipu (manfaat Dagaz memungkinkan ini). Untuk memulainya, kami menghasilkan semua gerakan valid dari potongan tunggal. Sederhana:
(define step ( $1 add ))
Sampai Anda bahkan dapat memeriksa kemungkinan pertarungan dari sosok Anda sendiri, semua ini nanti! Kami hanya pergi ke segala arah, sedapat mungkin. Selanjutnya, nyalakan "
sihir ". Kami hanya menggabungkan semua kombinasi yang mungkin dari tiga gerakan berbagai bagian dalam satu arah, membangun produk Cartesian. Setelah itu, kita
membuang gerakan yang menemukan potongan kita sendiri.
Mengapa tidak langsung menjatuhkannya? Untuk alasan yang sangat sederhana - sebuah karya memiliki hak untuk pindah ke bidang yang diduduki jika dilepaskan sebagai bagian dari gerakan kelompok yang sama, dan pada saat menghasilkan gerakan "dasar", tidak ada informasi tentang komposisi kelompok yang dipindahkan! Itu sebabnya saya sangat menyukai proyek ini. Dia, dari waktu ke waktu, melempar teka-teki yang sangat menarik di sini!
Pindah tidak harus dilakukan hanya pada satu bidang, seperti di Abalone. Dalam permainan
Ordo (dan terutama di
Ordo X ), ditemukan oleh Dieter Stein pada tahun 2009, kelompok tokoh dapat bergerak lebih jauh. Satu-satunya syarat adalah bahwa potongan-potongan warna mereka, pada akhir belokan, tidak boleh dipisahkan (ini adalah permainan yang sama tidak berubahnya dengan kebutuhan raja untuk meninggalkan ancaman dalam Catur). Pemain yang memenangkan baris pertama dari papan menang.
Dalam permainan ini ada gerakan longitudinal dan transversal dari "barisan" ukuran berapa pun dan pada jarak berapa pun (di dalam papan, tentu saja). Ada begitu banyak templat yang digunakan untuk menghasilkan gerakan yang membutuhkan lebih dari 5 menit untuk memproses
file ZRF yang dikembangkan oleh saya dengan
konverter (kebanyakan game diproses dalam hitungan detik)! Orang bisa berasumsi bahwa ini akan menyebabkan masalah pada tahap menghasilkan gerakan, tetapi tidak demikian. Sebagian besar gerakan terputus oleh
invarian permainan.
Satu lagi tugas teka-teki otak muncul di siniFaktanya adalah bahwa mekanisme bolak-balik pemilihan angka yang saya kembangkan untuk melakukan gerakan kelompok, secara umum, tidak sesuai dengan antarmuka gerakan "mendorong", yang diterapkan oleh versi lama dari pengontrol. Sederhana - untuk membuat gerakan "mendorong", Anda harus memilih gambar yang memiliki kemampuan untuk pergi ke lapangan, sejauh ini ditempati oleh figur lain dari grup yang dipindahkan. Tetapi kami tidak dapat menampilkan bidang targetnya, karena pembentukan grup belum selesai, dan pemindahan satu figur ke bidang yang diduduki kemungkinan besar dilarang oleh aturan permainan.
Secara umum, jika semuanya dilakukan "sesuai dengan aturan", perlu untuk mengklik semua angka dari grup yang dipindahkan satu per satu dan hanya setelah itu antarmuka akan menampilkan bidang target untuk angka yang ditambahkan terakhir. Bahkan di Abalon, dengan kelompoknya maksimal tiga angka, ini agak melelahkan, tetapi di Ordo umumnya tidak terpikirkan! Saya harus menemukan metode khusus yang secara otomatis "memperluas" grup ketika mendeteksi konflik yang dijelaskan di atas.
Ini seperti apa Abalone Dagaz.Model.closure = function(board, move, group) { var r = []; _.each(group, function(pos) { r.push(pos); }); for (var i = 0; i < r.length; i++) { var pos = r[i]; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null) && (a[0][0] == pos)) { var p = a[1][0]; var piece = board.getPiece(p); if ((piece !== null) && (piece.player == board.player) && (_.indexOf(r, p) < 0)) { r.push(p); } } }); } return r; }
Tapi gerakan "mendorong" lama diizinkan di Ordo dan algoritme ini tidak berfungsi! Tidak masalah - semua fungsi yang didefinisikan dalam Dagaz.Model dapat didefinisikan ulang.
Sebelah sini Dagaz.Model.closure = function(board, move, group) { var design = board.game.design; var r = []; _.each(group, function(pos) { r.push(pos); }); for (var i = 0; i < r.length; i++) { var pos = r[i]; _.each(move.actions, function(a) { if ((a[0] !== null) && (a[1] !== null) && (a[0][0] == pos)) { var target = a[1][0]; var x = Dagaz.Model.getX(pos); var y = Dagaz.Model.getY(pos); var dx = sign(Dagaz.Model.getX(target) - x); var dy = sign(Dagaz.Model.getY(target) - y); var dir = design.findDirection(pos, pos + (dy * Dagaz.Model.WIDTH) + dx); if (dir !== null) { while ((pos !== null) && (pos != target)) { var piece = board.getPiece(pos); if ((piece === null) || (piece.player != board.player)) break; if (_.indexOf(r, pos) < 0) { r.push(pos); } pos = design.navigate(board.player, pos, dir); } } } }); } return r; }
Kelebihan ini paling mudah untuk
Takoka . Karena tidak ada gerakan "mendorong" di dalamnya (selalu perlu untuk menyorot dengan jelas semua bagian yang termasuk dalam grup), itu cukup untuk memblokir fungsi ini, yaitu, jangan memperluas grup:
Dagaz.Model.closure = function(board, move, group) { return group; }
Saya minta maaf atas nama fungsi yang tidak mengatakan apa-apa kepada siapa pun. Aku hanya tidak bisa menemukan nama yang lebih baik untuk aksinya.

Game ini juga menerapkan gerakan kelompok, tetapi mekanismenya sama sekali berbeda! Di sini gambar bergerak dalam grup 3x3, apalagi, bidang kosong grup juga merupakan bagian dari "pola" yang dipindahkan. Kehadiran angka di salah satu dari delapan bidang eksternal menunjukkan arah di mana Anda dapat bergerak, dan pengisian bidang pusat menentukan apakah Anda dapat memindahkan "pola" ke sembarang atau hanya jarak pendek, tidak lebih dari 3 langkah. Untuk menang, perlu untuk menghancurkan "cincin" musuh - analog dengan tokoh kerajaan (ini adalah bidang kosong, dikelilingi oleh delapan sisi diisi oleh semua sisi). Anda harus sangat berhati-hati untuk tidak merusak cincin Anda juga.
GESS ternyata menjadi mimpi buruk yang nyata, baik dalam hal "
sihir " dan dalam hal
prototipe itu sendiri - kerangka permainan. Cukup untuk mengatakan bahwa papan (20x20, dengan mempertimbangkan sejumlah bidang di luar papan) terdiri dari dua lapisan. Seluruh lapisan atas sepenuhnya diisi dengan bentuk tak terlihat yang mengontrol gerakan. Pergerakan batu yang membentuk "pola" pemain hanyalah efek samping dari gerakan ini. Sayangnya, saya belum berhasil mengembangkan bot untuk game ini.
Di akhir artikel, saya ingin memperkenalkan Anda pada hal lain yang tidak terkait langsung dengan topik pergerakan kelompok tokoh.
Game ini saya diminta untuk membuat salah satu pelanggan ke
halaman proyek saya - Sultan Ratrout. Secara umum, ini adalah
checker pilar biasa pada papan heksagonal. Bahkan tanpa wanita. Konsep revolusi berbeda! Bidang permainan itu sendiri bisa ditransformasikan! Selamat menikmati.
Saya akan berlibur ...