уведомление
Эта задача закончилась и не будет повторно оценена, но не стесняйтесь отправлять ответы и проверять свою программу на соответствие другим с помощью Контрольной программы!
Цель этого задания - заставить ИИ выиграть бой против другого ИИ, стратегически нарисовав стену на сетке 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