From f922f7a8edeaf2d55fe44ecf0c6b80c8f3911565 Mon Sep 17 00:00:00 2001 From: Lucio Torre Date: Sun, 8 Jul 2012 15:42:41 -0300 Subject: [PATCH] new navigator --- bots/maptools.py | 17 ++++++++--------- bots/navigator.py | 28 +++++++++++++++++++++++----- spacecraft/monitor.py | 24 +++++++++++++++++------- spacecraft/world.py | 1 + 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/bots/maptools.py b/bots/maptools.py index c677c25..eeb3679 100644 --- a/bots/maptools.py +++ b/bots/maptools.py @@ -3,7 +3,7 @@ from spacecraft import map -from shapely.geometry import Polygon +from shapely.geometry import Polygon, LineString from spacecraft import euclid class MapLoader(map.MapLoader): @@ -18,7 +18,6 @@ def __init__(self, filename): self.close_methods = { } - def open_rect(self, node, game, transform): x = float(node.attrib["x"]) y = float(node.attrib["y"]) @@ -28,23 +27,23 @@ def open_rect(self, node, game, transform): height = float(node.attrib["height"]) game.add_wall(x, y, width, height) + class GridMap(object): xsize = 300 ysize = 300 xbuckets = ybuckets = 50 - def __init__(self, filename): l = MapLoader(filename) self.walls = [] l.setup_map(self) self.build_grid() self.goal = None - self.goal_grid = [ [float("+inf")] * self.ybuckets for i in range(self.xbuckets) ] + self.goal_grid = None def build_grid(self): - self.grid = [ [0] * self.ybuckets for i in range(self.xbuckets) ] + self.grid = [[0] * self.ybuckets for i in range(self.xbuckets)] for xb in range(self.xbuckets): for yb in range(self.ybuckets): cell = self.build_cell(xb, yb) @@ -109,7 +108,7 @@ def dump_search_state(self, open, closed, start, goal): else: val = str(self.grid[xp][yp]) - parts.append( val ) + parts.append(val) print "".join(parts) def dump_path(self, start, goal, path, X=[]): @@ -223,9 +222,7 @@ def is_wall(self, pos): return False def visible(self, start, end): - _start = self.world_to_cell(*start) - _end = self.world_to_cell(*end) - return self._visible(_start, _end) + return not self.intersects(LineString([start, end])) def waypoint(self, start, goal): """In world coordinates!""" @@ -281,6 +278,8 @@ def towards_goal_from(self, current): step = 0 while True: np = winner(self.neighbor_nodes(goal), self.goalpath) + if np is None: + break if not self._visible(p, np): break goal = np diff --git a/bots/navigator.py b/bots/navigator.py index 13cf41b..5a4f4a5 100644 --- a/bots/navigator.py +++ b/bots/navigator.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 *-* +import uuid from twisted.internet.protocol import ClientFactory from twisted.internet import reactor import random @@ -18,7 +19,7 @@ def closer(target, candidates): class RandomClient(spacecraft.server.ClientBase): - name = "navigator" + name = "navigator_" + str(uuid.uuid4())[:3] gridmap = None way = None @@ -44,6 +45,16 @@ def look_to(self, target): target.x, target.y, self.angle) self.command('turn', value=turn) + def goto(self, target): + dist = abs(self.pos - target) + target = target - self.vel * dist / 70 + self.look_to(target) + + def aim(self, target, target_velocity): + dist = abs(self.pos - target) + target = target + target_velocity * dist / 70 + self.look_to(target) + def messageReceived(self, message): if self.gridmap is None: self.gridmap = maptools.GridMap("maps/cross.svg") @@ -55,6 +66,7 @@ def messageReceived(self, message): return self.pos = euclid.Point2(*message['gps']['position']) + self.vel = euclid.Point2(*message['gps']['velocity']) self.angle = message['gps']['angle'] # if number of enemies visible == 1 @@ -65,13 +77,21 @@ def messageReceived(self, message): if obj['object_type'] in ['player']: enemies += 1 ep = p2(*obj['position']) + ev = p2(*obj['velocity']) if enemies == 1: if self.gridmap.visible(self.pos, ep): - self.look_to(ep) + self.aim(ep, ev) self.command("throttle", value=1) self.command("fire") return + else: + print "enemy not visible." + elif enemies > 1: + # FLEE + while abs(self.pos - self.camp) < 150: + self.camp, self.camp_look = random.choice(self.camp_options) + # camped!!! if abs(self.pos - self.camp) < 10: @@ -95,10 +115,8 @@ def messageReceived(self, message): waypoint = p2(*self.gridmap.towards_goal_from(self.pos)) - print "going to", waypoint, "from", self.pos - print "w1", self.gridmap.is_wall(waypoint) - self.look_to(waypoint) + self.goto(waypoint) self.command("throttle", value=1) diff --git a/spacecraft/monitor.py b/spacecraft/monitor.py index 0613538..1db1bda 100644 --- a/spacecraft/monitor.py +++ b/spacecraft/monitor.py @@ -136,6 +136,16 @@ def process_events(self): self.track_next() elif event.key == pygame.K_RIGHT: self.track_previous() + elif event.key == pygame.K_UP: + self.zoom_in() + elif event.key == pygame.K_DOWN: + self.zoom_out() + + def zoom_in(self): + self.scene.scale(1.1) + + def zoom_out(self): + self.scene.scale(0.9) def process_message(self, message): pass @@ -167,8 +177,9 @@ def draw_avatar(self, position, angle, velocity, throttle=None, def draw_proximity_area(self, position): color = (36, 46, 56) - pygame.draw.circle(self.screen, color, position, - UNIVERSE_SCALING_FACTOR * world.ProximitySensor.radius, 1) + radius, _ = self.scene.to_screen( + world.ProximitySensor.radius, world.ProximitySensor.radius) + pygame.draw.circle(self.screen, color, position, radius, 1) def draw_name(self, position, name): font_size = 16 @@ -202,10 +213,9 @@ def render_screen(self, messages): self.offset = self.next_offset for wall in self.terrain: x, y = self.to_screen((wall['x'], wall['y'])) - w = int(wall['width'] * 7) # Because 7 works - h = int(wall['height'] * 7) - y = y - h - rect = pygame.Rect(x, y, w, h) + w, h = self.to_screen((wall['width'] + wall['x'], + wall['height'] + wall['y'])) + rect = pygame.Rect(x, y, w - x, h - y) pygame.draw.rect(self.screen, (100, 100, 100), rect, 0) for msg in messages: kind = msg.get("type", None) @@ -267,7 +277,7 @@ def render_screen(self, messages): def set_next_offset(self, msg): if self.world_size==[0,0]: # the world size has not arrived yet - return + return x, y = self.scene.to_screen(*msg['position']) speedx, speedy = msg['velocity'] w, h = self.scene.size diff --git a/spacecraft/world.py b/spacecraft/world.py index 0564a72..cb3a6e9 100644 --- a/spacecraft/world.py +++ b/spacecraft/world.py @@ -177,6 +177,7 @@ def get_result_table(self): class ObjectBase(object): + name = "unknown" def __init__(self, map, x=None, y=None): self.map = map