Ayo mainkan game Meta tic-tac-toe!
Ini adalah turnamen raja-of-the-hill dari Meta tic-tac-toe. Aturan Meta tic-tac-toe adalah sebagai berikut:
Semua aturan biasa dari tic-tac-toe berlaku.
Ada sembilan papan yang disusun untuk membuat satu papan induk. Seperti itu:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
papan 0 mengacu pada papan kiri atas, papan 1 mengacu pada papan tengah atas ... seperti ini
0|1|2 ----- 3|4|5 ----- 6|7|8
Jika saya katakan papan 3, ubin 4, itu berarti ubin tengah papan di kiri tengah.
Anda hanya diperbolehkan bergerak di salah satu papan yang lebih kecil.
Jika Anda memenangkan salah satu papan yang lebih kecil, seluruh papan itu dihitung sebagai ubin Anda.
Jika salah satu papan terisi sebelum bot mana pun memenangkannya, itu dianggap sebagai ubin siapa-siapa.
Siapa pun yang menang dewan master akan menang!
Namun, ada twist penting. Katakanlah saya masuk papan 7, ubin 2. Itu artinya pada giliran Anda, Anda hanya bisa masuk papan 2. Lalu katakanlah Anda masuk papan 2, ubin 5. Sekarang, pada giliran saya, saya hanya bisa masuk papan 5. Katakanlah papan 1 penuh. (Tidak ada lagi tempat yang tersisa, atau salah satu dari kami telah memenangkan papan 1) Sekarang jika saya masuk ke papan 5, ubin 1, Anda dapat masuk ke papan yang Anda inginkan.
Aturan-aturan ini dapat dianggap sebagai:
- Anda harus bermain di papan sesuai dengan posisi yang dimainkan oleh pemain sebelumnya.
- Jika X bermain di papan 2, ubin 5; O harus bermain di papan 5
- Jika papan target penuh (seri) atau sudah memiliki pemenang, langkah selanjutnya tidak dibatasi.
- Papan dengan pemenang mungkin tidak dimainkan, bahkan pada gerakan yang tidak dibatasi.
Jika ini sedikit membingungkan, Anda dapat mencobanya online di sini. (pastikan untuk beralih dari "ubin pertama menang" ke "3 ubin berturut-turut")
Sekarang, inilah aturan tantangannya.
Anda harus menulis bot yang memainkan game ini.
Bot 1 adalah Xs, dan ia harus pergi dulu. Itu akan dipanggil dengan argumen baris perintah ini (tanpa barang di dalam tanda kurung):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
Karakter pertama mewakili siapa bot itu. Dalam hal ini, bot 1 bermain sebagai X. 9 baris berikutnya mengacu pada 9 papan. Baris ke-11 mengacu pada papan master. "Xx" adalah langkah terakhir. Sekarang, bot1 harus mencetak dua angka antara 0 dan 8. Angka 1 adalah papan tempat bot Anda bergerak, dan nomor 2 adalah ubin di papan tersebut. Pengontrol akan melacak langkah ini. Katakanlah bot 1 mencetak 38. Sekarang papan akan terlihat seperti ini:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
dan bot2 akan dipanggil dengan argumen ini:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Sekarang bot 2 harus bergerak di papan 8 (karena bot1 menempatkan x di ubin 3). Katakanlah bot2 mencetak 84. Sekarang papan terlihat seperti ini.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
sekarang bot1 akan dipanggil dengan argumen ini:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Sekarang bot1 harus bergerak di papan 4. Namun, bot1 adalah bot kecil yang nakal, dan memutuskan untuk bergerak di papan 3. Ia mencetak '30'. Papan tidak berubah sama sekali. Master bot melacak ini. Sekarang bot2 akan dipanggil dengan argumen ini:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Sekarang bot 2 dapat pergi ke mana saja yang diinginkan (kecuali 38 dan 84, tentu saja). Ini berlanjut sampai seseorang memenangkan 3 dari papan master berturut-turut. Lalu, ada pertarungan kedua di mana bot2 adalah X dan bisa pergi dulu.
Ini berulang sampai setiap bot telah memainkan setiap bot lainnya.
Mencetak gol
Skor berfungsi seperti ini:
Pemenang setiap pertandingan mendapat 100 + number of open spots
poin. Dengan begitu, lebih berharga jika bot Anda menang dengan cepat. Setiap kali bot Anda membuat langkah yang tidak valid, itu kehilangan 1 poin. Jika setelah 250 putaran, tidak ada bot yang menang, masing-masing bot kehilangan 10 poin, dan kami melanjutkan ke putaran berikutnya.
Semuanya akan dimasukkan ke dalam direktori yang berisi
Bot pengontrol. Ini adalah program C ++ yang saya tulis. Anda dapat melihat kode sumber bot pengontrol di sini. Tolong beri tahu saya jika Anda melihat sesuatu yang tidak beres dengan controller.
File teks bernama File
instructions.txt
ini akan terlihat seperti ini:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Folder untuk setiap bot. Folder ini akan menampung program Anda (Apakah itu skrip atau biner) dan SATU file teks bernama
data.txt
bahwa bot Anda dapat membaca dan menulis apa pun yang diinginkannya.
Spesifikasi teknis dan klarifikasi aturan
Bot apa pun yang mencoba membaca / menulis sesuatu dari mana saja yang tidak ada di dalam foldernya akan ditendang dari permainan.
Program Anda harus dapat berjalan di macbook yang menjalankan Yosemite. Bahasa yang didukung saat ini adalah python (2.7.9 dan 3.4.2), C / C ++, objektif-C, perl, ruby, bash, PHP, Java, C #, javascript dan Haskell. Ada banyak lagi, tetapi ini hanya yang dapat saya pikirkan saat ini. Saya akan menambahkan lebih banyak seiring berjalannya waktu. Jika Anda ingin berkompetisi dalam bahasa tertentu, pesan saya atau komentar, dan saya akan menambahkannya ke daftar jika memungkinkan.
Jika papan dimenangkan, tetapi masih ada ruang, Anda masih tidak bisa pindah ke salah satu tempat terbuka.
Perhatikan bahwa direktori kerja kiriman Anda akan menjadi direktori yang berisi pengontrol dan semua bot lainnya, BUKAN direktori yang berisi bot Anda.
Silakan kirim bersama dengan kode bot pengontrol Anda perintah yang benar untuk dikompilasi (jika ada) dan untuk menjalankan bot Anda. Sebagian besar ini akan dilakukan dari terminal OS X, yang cukup mirip dengan terminal linux.
Bot harus diisi kurang dari satu detik. Sayangnya, saya tidak cukup kompeten untuk menambahkan timer ke bot pengontrol. Namun, saya akan mengatur waktu bot secara manual.
Hasil!
Ya, saya benar. Saya lupa membuat bot pengontrol memeriksa untuk melihat apakah masterBoard penuh. Jika masterBoard penuh, maka SETIAP gerakan tidak valid, tetapi terus memanggil bot, yang mungkin mengapa ada begitu banyak gerakan tidak valid. Saya sudah memperbaikinya sekarang. Ini adalah hasil resmi dengan versi terbaru dari semua bot.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Bot Kedalaman adalah juara bertahan! Setidaknya, untuk saat ini.
sumber
XXX000---
ditransmisikan? atau apakah 'tidak ada yang mendapatkannya meskipun O telah memenangkannya pertama'?Jawaban:
Python 2.7, Kedalaman
Implementasi pemangkasan alpha-beta tanpa sesuatu yang terlalu mewah. Itu mencoba untuk memesan bergerak dengan cara yang kurang naif untuk memaksimalkan eliminasi alpha-beta. Saya mungkin akan mencoba mempercepatnya, tapi jujur saya tidak tahu seberapa kompetitifnya Python jika turun ke soal kecepatan.
Untuk menjalankannya, Anda cukup melakukannya
python Depth.py <input>
, meskipun saya akan menyarankan menggunakanpypy
karena mempercepat itu terasa.Saya juga tidak tahu seberapa cepat sistem Anda, tetapi Anda dapat memodifikasi argumen pertama hingga
DepthPlayer
akhirnya menjadi lebih tinggi jika masih dapat berjalan dalam waktu yang ditentukan (pada sistem saya itu menyelesaikan hampir semua hal dengan sangat cepat dengan kedalaman 7 atau 8, tetapi ada beberapa kasus yang dekat atau di atas satu detik jadi saya atur ke 6 agar aman).sumber
sys.argv
tidak mengembalikan string yang dipisahkan baris baru. Ini memberikan daftar string dalam format ini:['Depth.py', 'X', '---------', '---------', ...]
Saya memperbaikinya dengan mengedit dua baris terakhir untuk inicommand = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
saya harap Anda tidak keberatan.Jawa, Naif
Jika memungkinkan, ia menang. Kalau tidak, itu mencegah lawan dari menang.
sumber
Naive.class
di direktori bernamanaiveBot
di dalam direktori utama.java Naive <args>
perintah, dengan asumsi variabel lingkungan menyertakan pointer keC:\Program Files\Java\jdk1.8.0\bin
. Saya harap ini membantu.java -classpath naiveBot Naive
;)legalAnywhere
benar, kiriman Anda gagal karena Anda mencoba menggunakan papan yang sudah dimenangkan oleh pemain.Python 2, MiddleBot
MiddleBot menyukai yang tengah. Sebelum game sentral (4) dimenangkan, game ini akan mencoba merebut pusat permainan sebanyak mungkin, memaksa lawan untuk kembali ke game tengah berulang kali.
Setelah ini selesai, ia mencoba untuk memenangkan permainan apa pun yang ia bisa, atau hanya mengisi ruang yang tersedia pertama jika tidak (perlu bekerja pada permainan terakhirnya, saya pikir)
Untuk menjalankannya,
python MiddleBot.py <input>
Tampaknya berjalan dengan senang hati di bawah satu detik untuk saya, jadi semoga itu juga untuk Andasumber
Mungkin juga membuang bot saya sendiri ke dalam campuran.
python 2, goodRandomBot
Bot ini tidak peduli ke mana ia bergerak, asalkan itu adalah langkah yang valid. Pilihan acak dari semua gerakan yang valid, dan buat rata-rata
0
gerakan yang tidak valid.sumber