Saya membuat implementasi MiniMax sederhana dalam bahasa pemrograman fungsional Elixir. Karena ada banyak game pengetahuan sempurna (tic tac toe, connect-four, checker, catur, dll), implementasi ini bisa menjadi kerangka kerja untuk membuat AI game untuk game-game ini.
Namun, satu masalah yang saya hadapi adalah bagaimana cara menyimpan kondisi permainan dengan benar dalam bahasa fungsional. Game-game ini sebagian besar berurusan dengan papan permainan dua dimensi, di mana operasi berikut sering dilakukan:
- Baca isi lokasi papan tertentu
- Perbarui konten lokasi papan tertentu (saat mengembalikan kemungkinan langkah baru)
- Mempertimbangkan isi dari satu atau lebih lokasi yang terhubung ke lokasi saat ini (yaitu lokasi horisontal, vertikal atau diagonal berikutnya atau sebelumnya)
- Mempertimbangkan isi dari beberapa lokasi yang terhubung ke segala arah.
- Mempertimbangkan isi dari seluruh file, pangkat dan diagonal.
- Memutar atau menyalin papan (untuk memeriksa simetri yang memberikan hasil yang sama dengan sesuatu yang sudah dihitung).
Sebagian besar bahasa fungsional menggunakan Linked Lists dan Tuples sebagai blok bangunan dasar dari struktur data multi-elemen. Namun, ini tampaknya dibuat sangat buruk untuk pekerjaan itu:
- Daftar tertaut memiliki waktu pencarian O (n) (linier). Juga, karena kita tidak dapat 'memindai dan memperbarui papan' dalam sekali sapuan di papan, menggunakan daftar tampaknya sangat tidak praktis.
- Tuples memiliki waktu pencarian O (1) (konstan). Namun, merepresentasikan papan sebagai tuple ukuran tetap membuatnya sangat sulit untuk beralih ke peringkat, file, diagonal, atau jenis kotak lainnya secara berurutan. Juga, baik Elixir, dan Haskell (yang merupakan dua bahasa fungsional yang saya tahu) tidak memiliki sintaks untuk membaca elemen ke- n sebuah tuple. Ini akan membuat mustahil untuk menulis solusi dinamis yang akan bekerja untuk dewan dengan ukuran sewenang-wenang.
Elixir memiliki struktur data Peta bawaan (dan Haskell memiliki Data.Map
) yang memungkinkan O (log n) (logaritmik) akses ke elemen. Saat ini saya menggunakan peta, dengan x, y
tupel yang mewakili posisi sebagai kunci.
Ini 'berhasil' tapi rasanya salah dengan penyalahgunaan peta dengan cara ini, meskipun saya tidak tahu persis mengapa. Saya mencari cara yang lebih baik untuk menyimpan papan permainan dua dimensi dalam bahasa pemrograman fungsional.