Memperhatikan
Tantangan ini telah berakhir dan tidak akan dinilai kembali, tetapi jangan ragu untuk mengirim jawaban dan menguji program Anda terhadap yang lain dengan Program Kontrol!
Tujuan dari tantangan ini adalah untuk membuat AI memenangkan pertarungan melawan AI lain dengan secara strategis menggambar dinding pada kisi 25x25 untuk memblokir lawan.
Memasukkan
25 baris dipisahkan oleh dan diakhiri dengan ;
sebagai argumen baris perintah. Ini akan mencakup:
- Ruang kosong
.
- Dinding
#
- Pemain
1
dan2
(Lawan selalu2
)
Contoh
###############..........;..............#..........;..............#..........;..............#..........;..............#..........;...........1###..........;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;...................###...;...................#.##..;2..................#..#..;#..................##.#..;#...................#.###;....................#####;
yang mewakili peta berikut:
###############..........
..............#..........
..............#..........
..............#..........
..............#..........
...........1###..........
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...................###...
...................#.##..
2..................#..#..
#..................##.#..
#...................#.###
....................#####
Keluaran
Sebuah string ditulis ke konsol dimulai dengan karakter yang mewakili arah yang ingin diubah AI. Ini adalah kasus sensitif!
- Utara
N
- Timur
E
- Selatan
S
- Barat
W
- Menyerah (Ada lagi)
Contoh
W
Aturan Game
- Saat AI bergerak, mereka akan meninggalkan jejak dinding yang kokoh di belakang mereka.
- Para pemain mulai di sudut kiri atas dan kanan bawah
- Permainan ini berlangsung sampai AI apa pun menabrak dinding atau AI menabrak satu sama lain.
- AI menang jika lawannya jatuh terlebih dahulu
- Tidak ada pemenang atau pecundang jika kedua AI kalah secara bersamaan.
- Jika AI keluar dari satu sisi grid, mereka melanjutkan ke arah yang sama dari sisi lain.
Peringkat
Juara 1 - FloodBot (Jawa, 12 menang)
Posisi Kedua - FluidBot (Python, 9 menang)
Posisi Ketiga - FillUpBot (C ++, 8 menang)
Posisi Keempat - AwayBot (Ruby, 5 kemenangan)
Posisi 5 - ArcBot (Python, 4 menang)
6th Place - BlindSnake (Batch, 2 menang)
6th Place - RandomBot (C #, 2 menang)
Program Kontrol (Diuji untuk Python 3.3.3)
Program ini dijalankan dengan argumen dari dua perintah dan satu argumen ( ""
jika tidak diperlukan) untuk AI misalnya. Control.py "ruby" "AwayBot.rb" "FillUpBot.exe" ""
. Itu bisa diunduh di sini .
import sys, subprocess
Program1, Argument1, Program2, Argument2, Player1, Player2, Grid = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], [0, 0], [24, 24], [['.' for y in range(25)] for x in range(25)]
while True:
Str = ''
for x in range(25):
for y in range(25):
if Grid[x][y] == '1' or Grid[x][y] == '2':
Grid[x][y] = '#'
Grid[Player1[0]][Player1[1]] = '1'
Grid[Player2[0]][Player2[1]] = '2'
for y in range(25):
for x in range(25):
Str += Grid[x][y]
Str += ';'
if Argument1 == '':
move = subprocess.Popen([Program1, Str], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
else:
move = subprocess.Popen([Program1, Argument1, Str], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
Lose1 = False
if move == 'N':
if Player1[1] > 0:
Player1[1] -= 1
else:
Player1[1] = 24
elif move == 'E':
if Player1[0] < 24:
Player1[0] += 1
else:
Player1[0] = 0
elif move == 'S':
if Player1[1] < 24:
Player1[1] += 1
else:
Player1[1] = 0
elif move == 'W':
if Player1[0] > 0:
Player1[0] -= 1
else:
Player1[0] = 24
else:
Lose1 = True
if Grid[Player1[0]][Player1[1]] == '#' or Grid[Player1[0]][Player1[1]] == '2':
Lose1 = True
print('Player 1:', move)
if Argument2 == '':
move = subprocess.Popen([Program2, Str.replace('2','3').replace('1','2').replace('3','1')], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
else:
move = subprocess.Popen([Program2, Argument2, Str.replace('2','3').replace('1','2').replace('3','1')], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
Lose2 = False
if move == 'N':
if Player2[1] > 0:
Player2[1] -= 1
else:
Player2[1] = 24
elif move == 'E':
if Player2[0] < 24:
Player2[0] += 1
else:
Player2[0] = 0
elif move == 'S':
if Player2[1] < 24:
Player2[1] += 1
else:
Player2[1] = 0
elif move == 'W':
if Player2[0] > 0:
Player2[0] -= 1
else:
Player2[0] = 24
elif Lose1:
Lose2 = True
else:
Lose2 = True
print('Player 2:', move)
print(Str.replace(';', '\n'))
if Grid[Player2[0]][Player2[1]] == '#':
Lose2 = True
if Lose1 and Lose2:
print('Draw!')
break
elif Lose1:
print('Player 2 wins!')
break
elif Lose2:
print('Player 1 wins!')
break
sumber
Jawaban:
Floodbot
Jawa
Orang ini semua tentang penghindaran. Dia tidak peduli untuk mencoba menjebak lawan, dia hanya ingin hidup. Untuk melakukan itu, ia memenuhi setiap arah untuk melihat jalan mana yang mengarah ke area terbuka terbesar.
Dia juga berpikir musuh tidak bisa ditebak, jadi dia memperlakukan setiap kotak segera mengelilingi mereka sebagai sudah menjadi tembok. Jika itu mengarah ke arah yang tidak mungkin, ia jatuh kembali ke peta "sebenarnya".
sumber
BlindSnake
Batch
Bot ini hanya memperhatikan lingkungan sekitarnya. Jika tidak ada dinding, itu bergerak di sana.
Saya hanya ingin membuat bot dalam batch ... Dan tidak akan pernah melakukannya lagi
sumber
FluidBot
Python 3
Mengambil jalan dengan perlawanan paling sedikit dan upaya untuk memprediksi lawan
Bekerja pada ini selama sekitar satu jam. ._.
Diuji terhadap AwayBot:
FillUpBot:
EDIT 5 : Lebih sadar akan masa depan; mencoba untuk menghindari menutup area (kecuali, tentu saja, lawan ada di dalamnya).
EDIT 4 : Membersihkan kode.
EDIT 3 : Berfungsi lebih baik untuk area bermain persegi panjang.
EDIT 2 : Kode bersih, algoritma lebih logis dan memprediksi beberapa langkah ke masa depan
EDIT : Algoritme yang lebih defensif, tidak menganggap hantu diri sebagai ruang kosong.
sumber
AwayBot
ditulis dalam Ruby (1.9)
Tepat bernama, AwayBot mencoba untuk pergi dari segala rintangan. Ini mencari 15x15 persegi di sekitar itu sendiri, menimbang arah sesuai, dan memilih arah dengan jumlah hambatan paling sedikit. (Ini juga berarti bahwa ia menghindari tepi, yang bagus sehingga tidak terjebak di dalamnya.)
Itu juga menganggap dinding lebih dekat dengan lebih berbahaya. Dinding di sebelahnya diberi bobot lebih dari dinding yang jauh.
Untuk input sampel Anda, output
S
. Bobot untuk setiap arah input sampel adalah[["N", 212], ["E", 140], ["S", 0], ["W", 84]]
.Interjeksi: Saya baru saja memperhatikan bahwa arena telah selesai. Kalau begitu, teknik menghindar tepi saya agak tidak berguna sekarang, tapi meh. Mungkin saya akan memperbaikinya nanti.
sumber
ARGF.argv[0].chomp
bukannyagets.chomp
di baris pertama!FillUpBot
ditulis dalam C ++
Jangan berpikir saya akan menang, tapi ini yang saya maksud:
Kompiler C ++ standar Anda harus dapat menangani hal ini.
sumber
#include <cstdlib>
membantu? (Masukkan saja di bagian atas sebagai baris baru)Arcbot
Python 3
Dimainkan dengan algoritma berbasis agresi sebagai musuh dan bruteforce menjawab dengan pengaruh
Algoritma ini agak 'berbasis emosi', saya kira. Dalam mengembangkan ini, saya menyadari bahwa FluidBot mengalahkannya hampir setiap waktu. Arcbot bukan algoritma tercepat atau yang terbaik, tetapi memiliki kekuatan itu.
Itu benar menabrak dinding. Tidak tahu kenapa.
FLUIDBOT LEBIH BAIK
EDIT : Menyesuaikan angka dan formula, itu bermain lebih baik sekarang tetapi masih kalah dari Fluidbot.
EDIT 2 : Aduh, lupa mengubah beberapa kode.
sumber
RandomBot
C #
RandomBot secara acak memilih arah sampai rute itu gratis. Jika tidak ada arah yang aman itu cukup ketik
*
dan kalah.sumber
Fill Up Bot (berputar 90 derajat berlawanan arah jarum jam, saat menghadapi rintangan
C ++
Dalam kode saya, kedua pemain (1 dan 2) mencoba membanjiri. Berarti setiap kali mereka menghadapi hambatan, mereka berubah menjadi berlawanan arah jarum jam.
Ingat, Garis-garis pada input dipisahkan oleh a
space
ataunewline
dan bukan oleh;
sumber