summaryrefslogtreecommitdiff
path: root/strategy.py
diff options
context:
space:
mode:
Diffstat (limited to 'strategy.py')
-rw-r--r--strategy.py127
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])