summaryrefslogtreecommitdiff
path: root/simple.py
diff options
context:
space:
mode:
Diffstat (limited to 'simple.py')
-rw-r--r--simple.py126
1 files changed, 10 insertions, 116 deletions
diff --git a/simple.py b/simple.py
index 45f63fa..2876948 100644
--- a/simple.py
+++ b/simple.py
@@ -1,131 +1,25 @@
-from collections import defaultdict
-
import random
-import robots
-from robots.constants import DIRECTIONS
-
-def shuffled(items):
- items = list(items)
- random.shuffle(items)
- return items
-
-def get_enemy_robots(me, players):
- robots = {}
- for name, info in players.items():
- if name != me:
- for x, y in info['robots']:
- robots[x, y] = name
- return robots
-
-def paths_to_enemies(enemies, board, iterations=None):
- width = len(board[0])
- height = len(board)
-
- if iterations is None:
- iterations = 10
- iterations = width * height
-
- distances = []
- for y in range(height):
- distances.append([])
- for x in range(width):
- if (x, y) in enemies:
- value = (0, None, (x, y))
- else:
- value = (float('inf'), None, None)
- distances[-1].append(value)
-
- DIRECTION_ITEMS = shuffled(DIRECTIONS.items())
- for i in range(iterations):
- for y in range(height):
- for x in range(width):
- for move, (dx, dy) in DIRECTION_ITEMS:
- nx = (x + dx) % width
- ny = (y + dy) % height
- if board[ny][nx] == '*':
- continue
-
- current_dist = distances[y][x][0]
-
- this_dist, _, dest = distances[ny][nx]
- this_dist += 1
-
- if this_dist < current_dist:
- distances[y][x] = (this_dist, move, dest)
-
- return distances
-def attacker(whoami, players, board):
- width = len(board[0])
- height = len(board)
-
- my_robots = players[whoami]['robots']
- enemies = get_enemy_robots(whoami, players)
- paths = paths_to_enemies(enemies, board)
-
- allocations = defaultdict(list)
- for x, y in my_robots:
- dist, dir, dest = paths[y][x]
- allocations[dest].append((dist, dir, (x, y)))
-
- searchers = int(len(my_robots) * 0.7)
-
- assignments = {}
- for options in allocations.values():
- for dist, dir, robot in sorted(options)[:searchers]:
- assignments[robot] = dir
-
- results = []
- for x, y in my_robots:
- choice = assignments.get((x, y))
- if board[y][x] != whoami and (not choice or random.random() < 0.5):
- choice = 'P'
- elif choice:
- pass
- else:
- moves = []
- for dir, (dx, dy) in DIRECTIONS.items():
- nx = (x + dx) % width
- ny = (y + dy) % height
- if board[ny][nx] != '*':
- moves.append(dir)
- choice = random.choice(moves or '-')
- results.append(choice)
-
- return ''.join(results)
-
-def never_paint(whoami, players, board):
- my_robots = players[whoami]['robots']
- return ''.join(
- random.choice('ULD--')
- for _ in range(len(my_robots))
- )
+import robots
+from robots.utils import add_spawns
-def bot(whoami, state):
+def random_walk(whoami, state):
my_robots = state.robots_by_player[whoami]
return ''.join(
- random.choice('ULDRP-')
+ random.choice('ULDRP')
for _ in range(len(my_robots))
)
if __name__ == '__main__':
# random.seed(42)
- map_ = robots.border_map(30, 10, 0)
- for y in range(8):
- map_[y][10] = 'X'
- for y in range(11, 2, -1):
- map_[y][20] = 'X'
- map_[5][5] = '1'
- map_[5][15] = '3'
- map_[5][25] = '2'
+ map_ = robots.border_map(20, 10, 0)
- for y in (2, 8):
- for x in (5, 15, 25):
- map_[y][x] = '+'
+ add_spawns(map_, 10, 'X')
+ add_spawns(map_, 20, '+')
+ add_spawns(map_, 4)
game = robots.Game(map_)
- game.add_bot(bot, 'Alice')
- game.add_bot(bot, 'Bob')
- game.add_bot(bot, 'Charlie')
+ game.add_bot(random_walk, 'Alice')
+ game.add_bot(random_walk, 'Bob')
viewer = robots.CursesViewer(game)
viewer.run()