Ini adalah tantangan raja bukit untuk Dots and Boxes (alias Pen the Pig). Permainan ini sederhana, pada gilirannya Anda hanya menggambar garis di pagar yang kosong. Setiap kali Anda menyelesaikan kotak Anda mendapatkan poin. Juga, karena kami bermain berdasarkan aturan kejuaraan , jika Anda menyelesaikan setidaknya satu kotak pada giliran Anda, Anda mendapat giliran tambahan. Ini adalah turnamen round robin, di mana setiap bot memainkan satu sama lain bot dua kali 12 kali pada kotak 9x9. Lihatlah pertandingan ini di antara dua titans kelas berat, di mana ChainCollector membuat daging cincang dari co-champion Asdf:
Aturan
- Batas waktu 0,5 detik per gerakan.
- Tidak mengganggu bot lainnya.
- Gunakan PigPen.random () dan PigPen.random (int) untuk keacakan.
- Tidak ada tulisan untuk file.
- Bot dan semua data gigihnya akan diatur ulang setiap kali lawan berubah (setiap 12 putaran).
Bot
Setiap bot memperluas Player.java:
package pigpen;
public abstract class Player {
public abstract int[] pick(Board board, int id, int round);
}
Board
adalah papan permainan, yang utamanya berfungsi untuk memberi Anda akses ke Pen
kelas, dan id
merupakan kartu ID Anda (memberi tahu Anda jika Anda yang pertama atau kedua), round
memberi tahu Anda babak mana permainan Anda melawan lawan yang sama (1 atau 2). Nilai kembali adalah int[]
, di mana elemen pertama adalah penID (1-diindeks), dan elemen kedua adalah pagarID (0-diindeks). Lihat Pen.pick(int)
cara mudah untuk menghasilkan nilai pengembalian ini. Lihat halaman Github untuk contoh pemain dan JavaDoc. Karena kita hanya menggunakan kotak persegi, abaikan fungsi dan bidang apa pun yang terkait dengan segi enam.
Cara Menjalankan
- Unduh Sumber dari Github.
- Tulis bot pengontrol Anda (pastikan untuk memasukkan
package pigpen.players
) dan letakkan disrc/
folder; - Kompilasi dengan
javac -cp src/* -d . src/*.java
. Jalankan denganjava pigpen.Tournament 4 9 9 false
(dua angka terakhir dapat diubah untuk menyesuaikan ukuran kisi. Variabel terakhir hanya boleh diaturtrue
jika Anda ingin menggunakan perangkat lunak pp_record.)
Skor
- ChainCollector: 72
- Asdf: 57
- Malas: 51
- Finisher: 36
- = LinearPlayer: 18
- = BackwardPlayer: 18
- RandomPlayer: 0
Lihat juga:
Catatan : permainan ini adalah tantangan kompetitif dan tidak mudah dipecahkan, karena memberi pemain giliran ekstra untuk menyelesaikan kotak.
Terima kasih kepada Nathan Merrill dan Darrel Hoffman yang telah berkonsultasi tentang tantangan ini!
Pembaruan :
- Menambahkan
moves(int player)
metode ke kelas Dewan untuk mendapatkan daftar setiap gerakan yang dilakukan pemain.
Hadiah Tidak Terbatas (100 Rep) :
Orang pertama yang memposting solusi yang memenangkan setiap putaran, dan menggunakan strategi (menyesuaikan permainan berdasarkan mengamati bagaimana lawan bermain).
sumber
Jawaban:
Pemalas
Bot ini malas. Dia memilih tempat dan arah acak dan terus membangun ke arah itu tanpa bergerak terlalu banyak. Hanya ada 2 kasus di mana ia melakukan sesuatu yang berbeda:
sumber
pen.n(Pen.LEFT)
(fungsi tetangga).pick()
Metode sekarang memilikiint round
parameter di akhir, jadi jika Anda bisa tolong menambahkan bahwa.ChainCollector
Bot ini menyukai rantai 1 . Dia ingin sebanyak mungkin dari mereka. Kadang-kadang dia bahkan mengorbankan sebagian kecil dari rantai untuk memenangkan yang lebih besar.
[1] Rantai terdiri dari pena yang dihubungkan oleh pagar terbuka, di mana setiap pena memiliki 1 atau 2 pagar terbuka. Jika satu pena milik rantai dapat diselesaikan, maka karena aturan kejuaraan seluruh rantai dapat diselesaikan juga.
sumber
Finisher
Menggunakan Pembanding untuk memilih Pena dengan pagar yang paling tersedia, tetapi mengutamakan Pena dengan hanya 1 pagar yang tersedia. (7 digunakan daripada 5 untuk memungkinkan kode ini bekerja dalam mode segi enam juga)
sumber
Asdf
Tetapkan skor untuk setiap pagar dan kemudian pilih yang terbaik dari mereka. Misalnya: Pena dengan satu pagar terbuka memiliki skor 10, sedangkan pena dengan 2 pagar terbuka memiliki skor -8.
Sepertinya Lazybones menggunakan strategi yang sama, karena ini terkait dengan bot ini.
sumber
LinearPlayer
Cara termudah untuk menulis bot ini sebenarnya
return null
, karena entri yang tidak valid akan secara otomatis memilih pagar pertama yang tersedia. Kode ini tidak menggunakan metode pintas apa pun dan secara manual menghasilkan nilai kembali.sumber
BackwardPlayer
Kode ini menggunakan metode pintas
Pen.pick(int)
untuk menghasilkan nilai kembali. Jika pagar atas tidak tersedia, itu akan memilih pagar terdekat yang tersedia searah jarum jam.sumber
RandomPlayer
Ide yang sama dengan BackwardPlayer, tetapi secara acak memilih pena. Perhatikan
+1
karena Pena 1-diindeks.sumber