diff options
Diffstat (limited to 'simple.py')
| -rw-r--r-- | simple.py | 126 | 
1 files changed, 10 insertions, 116 deletions
| @@ -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() | 
