diff options
-rw-r--r-- | strategy.py | 127 |
1 files changed, 65 insertions, 62 deletions
diff --git a/strategy.py b/strategy.py index 37dc340..5240fd3 100644 --- a/strategy.py +++ b/strategy.py @@ -11,20 +11,80 @@ class Strategy: self.color = (0,0,0) self.c = c + def get_my_smallest(self): + return sorted(self.c.player.own_cells, key = lambda x: x.mass)[0] + def dist(self, cell): return math.sqrt((cell.pos[0]-self.c.player.center[0])**2 + (cell.pos[1]-self.c.player.center[1])**2) def edible(self, cell): - return ((cell.is_food) or (cell.mass <= sorted(self.c.player.own_cells, key = lambda x: x.mass)[0].mass * 0.75)) and not (cell.is_virus) + return ((cell.is_food) or (cell.mass <= self.get_my_smallest().mass * 0.75)) and not (cell.is_virus) def threat(self, cell): - if cell.is_virus and (cell.mass <= sorted(self.c.player.own_cells, key = lambda x: x.mass)[0].mass * 0.75): + if cell.is_virus and (cell.mass <= self.get_my_smallest().mass * 0.75): return True - elif (cell.mass <= sorted(self.c.player.own_cells, key = lambda x: x.mass)[0].mass * 1.25): + elif (cell.mass <= self.get_my_smallest().mass * 1.25): return True else: return False + def rival(self, cell, food): + if cell.is_virus or cell.is_food: return False + if cell.cid in self.c.player.own_ids: return False + + if cell.mass < 1.25*self.get_my_smallest().mass: + return food.is_food or cell.size > 1.25*food.size + else: + return False + + def splitkiller(self, cell): + return not cell.is_virus and not cell.is_food and cell.mass > 1.25*2*self.get_my_smallest().mass + + def nonsplitkiller(self, cell): + return not cell.is_virus and not cell.is_food and 1.20*self.get_my_smallest().mass < cell.mass and cell.mass < 1.25*2*self.get_my_smallest().mass + + def quality(self, cell): + dd_sq = max((cell.pos[0]-self.c.player.center[0])**2 + (cell.pos[1]-self.c.player.center[1])**2,0.001) + sigma = 500 + dist_score = -math.exp(-dd_sq/(2*sigma**2)) + + rivals = filter(lambda r : self.rival(r,cell), self.c.world.cells.values()) + splitkillers = filter(self.splitkiller, self.c.world.cells.values()) + nonsplitkillers = filter(self.nonsplitkiller, self.c.world.cells.values()) + + rival_score = 0 + for r in rivals: + dd_sq = max(0.001, (r.pos[0]-cell.pos[0])**2 + (r.pos[1]-cell.pos[1])**2) + sigma = r.size + 100 + rival_score += math.exp(-dd_sq/(2*sigma**2)) + + splitkill_score = 0 + for s in splitkillers: + dd_sq = max(0.001, (s.pos[0]-cell.pos[0])**2 + (s.pos[1]-cell.pos[1])**2) + sigma = (500+2*s.size) + splitkill_score += math.exp(-dd_sq/(2*sigma**2)) + + nonsplitkill_score = 0 + for s in nonsplitkillers: + dd_sq = max(0.001, (s.pos[0]-cell.pos[0])**2 + (s.pos[1]-cell.pos[1])**2) + sigma = (300+s.size) + nonsplitkill_score += math.exp(-dd_sq/(2*sigma**2)) + + density_score = 0 + sigma = 300 + for f in filter(lambda c : c.is_food and c!=cell, self.c.world.cells.values()): + dd_sq = (f.pos[0]-cell.pos[0])**2 + (f.pos[1]-cell.pos[1])**2 + density_score -= math.exp(-dd_sq/(2*sigma**2)) + + wall_score = 0 + wall_dist = min( cell.pos[0]-self.c.world.top_left[1], self.c.world.bottom_right[1]-cell.pos[0], cell.pos[1]-self.c.world.top_left[0], self.c.world.bottom_right[0]-cell.pos[1] ) + sigma = 100 + wall_score = math.exp(-wall_dist**2/(2*sigma**2)) + + return 2.5*dist_score + 0.2*rival_score + nonsplitkill_score + 5*splitkill_score + 0.1*density_score + 5*wall_score + ##print (density_score) + #return density_score + def weight_cell(self, cell): df = (1/self.dist(cell)) if self.edible(cell): @@ -93,21 +153,7 @@ class Strategy: gui.draw_arc(self.c.player.center, self.c.player.total_size+10, i, (255,0,255)) # if however there's no enemy to avoid, chase food or jizz randomly around - else: - def rival(cell, food): - if cell.is_virus or cell.is_food: return False - if cell.cid in self.c.player.own_ids: return False - - if cell.mass < 1.25*my_smallest: - return food.is_food or cell.size > 1.25*food.size - else: - return False - def splitkiller(cell): - return not cell.is_virus and not cell.is_food and cell.mass > 1.25*2*my_smallest - - def nonsplitkiller(cell): - return not cell.is_virus and not cell.is_food and 1.20*my_smallest < cell.mass and cell.mass < 1.25*2*my_smallest - + else: if self.target_cell != None: self.target = tuple(self.target_cell.pos) if self.target_cell not in self.c.world.cells.values() or not self.edible(self.target_cell): @@ -120,50 +166,7 @@ class Strategy: if not self.has_target: food = list(filter(self.edible, self.c.world.cells.values())) - - def quality(cell): - dd_sq = max((cell.pos[0]-self.c.player.center[0])**2 + (cell.pos[1]-self.c.player.center[1])**2,0.001) - sigma = 500 - dist_score = -math.exp(-dd_sq/(2*sigma**2)) - - rivals = filter(lambda r : rival(r,cell), self.c.world.cells.values()) - splitkillers = filter(splitkiller, self.c.world.cells.values()) - nonsplitkillers = filter(nonsplitkiller, self.c.world.cells.values()) - - rival_score = 0 - for r in rivals: - dd_sq = max(0.001, (r.pos[0]-cell.pos[0])**2 + (r.pos[1]-cell.pos[1])**2) - sigma = r.size + 100 - rival_score += math.exp(-dd_sq/(2*sigma**2)) - - splitkill_score = 0 - for s in splitkillers: - dd_sq = max(0.001, (s.pos[0]-cell.pos[0])**2 + (s.pos[1]-cell.pos[1])**2) - sigma = (500+2*s.size) - splitkill_score += math.exp(-dd_sq/(2*sigma**2)) - - nonsplitkill_score = 0 - for s in nonsplitkillers: - dd_sq = max(0.001, (s.pos[0]-cell.pos[0])**2 + (s.pos[1]-cell.pos[1])**2) - sigma = (300+s.size) - nonsplitkill_score += math.exp(-dd_sq/(2*sigma**2)) - - density_score = 0 - sigma = 300 - for f in filter(lambda c : c.is_food and c!=cell, self.c.world.cells.values()): - dd_sq = (f.pos[0]-cell.pos[0])**2 + (f.pos[1]-cell.pos[1])**2 - density_score -= math.exp(-dd_sq/(2*sigma**2)) - - wall_score = 0 - wall_dist = min( cell.pos[0]-self.c.world.top_left[1], self.c.world.bottom_right[1]-cell.pos[0], cell.pos[1]-self.c.world.top_left[0], self.c.world.bottom_right[0]-cell.pos[1] ) - sigma = 100 - wall_score = math.exp(-wall_dist**2/(2*sigma**2)) - - return 2.5*dist_score + 0.2*rival_score + nonsplitkill_score + 5*splitkill_score + 0.1*density_score + 5*wall_score - ##print (density_score) - #return density_score - - food = sorted(food, key = quality) + food = sorted(food, key = self.quality) if len(food) > 0: self.target = (food[0].pos[0], food[0].pos[1]) |