уведомление
Эта задача закончилась и не будет повторно оценена, но не стесняйтесь отправлять ответы и проверять свою программу на соответствие другим с помощью Контрольной программы!
Цель этого задания - заставить ИИ выиграть бой против другого ИИ, стратегически нарисовав стену на сетке 25х25, чтобы заблокировать противника.
вход
25 строк, разделенных и заканчивающихся ;
в качестве аргумента командной строки. Это будет включать в себя:
- Пустые места
.
- стены
#
- Игроки
1
и2
(противник всегда2
)
пример
###############..........;..............#..........;..............#..........;..............#..........;..............#..........;...........1###..........;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;...................###...;...................#.##..;2..................#..#..;#..................##.#..;#...................#.###;....................#####;
которая представляет следующую карту:
###############..........
..............#..........
..............#..........
..............#..........
..............#..........
...........1###..........
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...................###...
...................#.##..
2..................#..#..
#..................##.#..
#...................#.###
....................#####
Вывод
Строка, записанная в консоль, начинающаяся с символа, обозначающего направление, в котором ИИ желает повернуть. Это является чувствительно к регистру!
- к северу
N
- восток
E
- юг
S
- запад
W
- Сдавайся (Все остальное)
пример
W
Правила игры
- По мере движения ИИ они оставят за собой сплошной след стен.
- Игроки начинают в верхнем левом и нижнем правом углах
- Игра продолжается до тех пор, пока любой ИИ не столкнется со стеной или пока ИИ не столкнутся друг с другом.
- ИИ выигрывает, если его противник падает первым
- Не будет ни победителя, ни проигравшего, если оба ИИ проиграют одновременно.
- Если ИИ уходит с одного края сетки, он продолжает в том же направлении с другой стороны.
Ранжирование
1-е место - FloodBot (Java, 12 побед)
2 место - FluidBot (Python, 9 побед)
3-е место - FillUpBot (C ++, 8 побед)
4-е место - AwayBot (Ruby, 5 побед)
5 место - ArcBot (Python, 4 победы)
6 место - BlindSnake (партия, 2 победы)
6 место - RandomBot (C #, 2 победы)
Управляющая программа (протестирована на Python 3.3.3)
Программа запускается с аргументами двух команд и одним аргументом ( ""
если не требуется) для AI, например. Control.py "ruby" "AwayBot.rb" "FillUpBot.exe" ""
, Его можно скачать здесь .
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
источник
Ответы:
Floodbot
Ява
Этот парень все о избегании. Он не хочет пытаться поймать противника, он просто хочет жить. Для этого он заполняет каждое направление, чтобы увидеть, какой путь приведет к самой большой открытой площадке.
Он также считает, что враг непредсказуем, поэтому он рассматривает каждую клетку, непосредственно окружающую их, как стену. Если это не приводит к возможному направлению, он возвращается к «фактической» карте.
источник
BlindSnake
партия
Этот бот только наблюдает за своим окружением. Если нет стены, она движется туда.
Я просто хотел создать бота в пакетном режиме ... И никогда не буду делать это снова
источник
FluidBot
Python 3
Идет по пути наименьшего сопротивления и пытается предсказать противника
Работал над этим около часа. ._.
Протестировано против AwayBot:
FillUpBot:
РЕДАКТИРОВАТЬ 5 : более ориентированных на будущее; старается избегать закрытия областей (если, конечно, противник не в этом).
РЕДАКТИРОВАТЬ 4 : очищенный код.
РЕДАКТИРОВАТЬ 3 : лучше работает для прямоугольных игровых площадок.
РЕДАКТИРОВАТЬ 2 : более чистый код, алгоритм более логичен и предсказывает некоторые шаги в будущее
РЕДАКТИРОВАТЬ : более защитный алгоритм, не считает себя призрак пустым пространством.
источник
AwayBot
написанный на Ruby (1.9)
Удачно названный, AwayBot пытается уйти от любых препятствий. Он ищет квадрат 15х15 вокруг себя, соответственно взвешивает направления и выбирает направление с наименьшим количеством препятствий. (Это также означает, что он избегает краев, что хорошо, поэтому он не попадает в них.)
Он также считает, что стены, расположенные ближе, представляют большую опасность. Стены прямо рядом с ним весят гораздо больше, чем стены далеко.
Для вашего примера ввода, он выводит
S
. Веса для каждого направления образца ввода[["N", 212], ["E", 140], ["S", 0], ["W", 84]]
.Междометие: я только что заметил, что арена окутывает. Ну, тогда моя техника избегания острых ощущений сейчас несколько бессмысленна, но, черт возьми. Возможно я исправлю это позже.
источник
ARGF.argv[0].chomp
а неgets.chomp
в первой строке!FillUpBot
написано в C ++
Не думаю, что я собираюсь победить, но вот мой путь в любом случае:
Ваш стандартный компилятор C ++ должен быть в состоянии справиться с этим.
источник
#include <cstdlib>
? (Просто вставьте его сверху как новую строку)Arcbot
Python 3
Играет с использованием алгоритма, основанного на агрессии, когда противник и брутфорс отвечают влиянием
Я полагаю, что этот алгоритм основан на эмоциях. Разрабатывая это, я понял, что FluidBot побил его почти каждый раз. Arcbot не самый быстрый и не лучший алгоритм, но у него есть свои сильные стороны.
Это делает врезаться в стены. Понятия не имею почему.
FLUIDBOT ЛУЧШЕ
РЕДАКТИРОВАТЬ : скорректированы числа и формула, теперь он играет лучше, но все еще проигрывает Fluidbot.
РЕДАКТИРОВАТЬ 2 : Ой, забыл изменить код.
источник
RandomBot
C #
RandomBot случайным образом выбирает направление, пока его маршрут не станет свободным. Если нет безопасного направления, оно просто набирает
*
и проигрывает.источник
Fill Up Bot (поворачивается на 90 градусов против часовой стрелки, когда сталкивается с препятствием
C ++
В моем коде два игрока (1 и 2) пытаются флудить. То есть, когда они сталкиваются с препятствием, они поворачиваются против часовой стрелки.
Помните, строки на входе разделены
space
или,newline
а не;
источник