summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSpitfireX <timm.weber@me.com>2015-08-11 02:10:15 +0200
committerSpitfireX <timm.weber@me.com>2015-08-11 02:10:15 +0200
commit349f9889e40d75a463bbdee07d67511faa097010 (patch)
tree647459edd9d44ced7e6b33991aa7b222bf6ff3be
parentdd6832293786ea0f3e7ba872893734db9fd1c30b (diff)
parent9b2078f8db3132754390db4905ac13009046f8bf (diff)
Merge branch 'master' of https://github.com/Windfisch/agario-frickel
m---------agarnet0
-rw-r--r--interval_utils.py48
-rw-r--r--main.py35
3 files changed, 71 insertions, 12 deletions
diff --git a/agarnet b/agarnet
-Subproject f990944fee0ea1c42e32b9e476280af0af300e7
+Subproject f4e81df94e9dd789f381b684b81ba291f2a2159
diff --git a/interval_utils.py b/interval_utils.py
new file mode 100644
index 0000000..4c3f8e2
--- /dev/null
+++ b/interval_utils.py
@@ -0,0 +1,48 @@
+from functools import reduce
+from math import pi
+import math
+
+def merge_intervals(intervals):
+ sorted_by_lower_bound = sorted(intervals, key=lambda tup: tup[0])
+ merged = []
+
+ for higher in sorted_by_lower_bound:
+ if not merged:
+ merged.append(higher)
+ else:
+ lower = merged[-1]
+ # test for intersection between lower and higher:
+ # we know via sorting that lower[0] <= higher[0]
+ if higher[0] <= lower[1]:
+ upper_bound = max(lower[1], higher[1])
+ merged[-1] = (lower[0], upper_bound) # replace by merged interval
+ else:
+ merged.append(higher)
+
+ return merged
+
+def clean_intervals(intervals):
+ return list(filter(lambda i : i[0]!=i[1],intervals))
+
+def canonicalize_angle_interval(i):
+ a=i[0] % (2*pi)
+ b=i[1] % (2*pi)
+
+ if a <= b:
+ return [(a,b)]
+ else:
+ return [(0,b),(a,2*pi)]
+
+def invert_angle_intervals(intervals):
+ flattened = reduce(lambda a,b:a+b, (map(lambda a: [a[0],a[1]], intervals)))
+ return clean_intervals(list(zip([0]+flattened, flattened+[2*pi]))[::2])
+
+def find_largest_angle_interval(intervals):
+ if (intervals[0][0]==0 and intervals[-1][1]==2*pi):
+ # these two intervals actually are one.
+ intervals_ = intervals[1:-1] + [(intervals[-1][0], intervals[0][1]+2*pi)]
+ else:
+ intervals_ = intervals
+
+ return max(intervals_, key=lambda p:p[1]-p[0])
+
diff --git a/main.py b/main.py
index 1fc04e4..09fb8ae 100644
--- a/main.py
+++ b/main.py
@@ -10,6 +10,7 @@ import random
import gui
import stats
from subscriber import DummySubscriber
+from interval_utils import *
# global vars
sub = DummySubscriber()
@@ -25,11 +26,10 @@ except:
# connect
c.connect(addr,token)
-# c.send_facebook(
- # 'g2gDYQFtAAAAEKO6L3c8C8/eXtbtbVJDGU5tAAAAUvOo7JuWAVSczT5Aj0eo0CvpeU8ijGzKy/gXBVCxhP5UO+ERH0jWjAo9bU1V7dU0GmwFr+SnzqWohx3qvG8Fg8RHlL17/y9ifVWpYUdweuODb9c=')
+c.send_facebook(
+ 'g2gDYQFtAAAAEKO6L3c8C8/eXtbtbVJDGU5tAAAAUvOo7JuWAVSczT5Aj0eo0CvpeU8ijGzKy/gXBVCxhP5UO+ERH0jWjAo9bU1V7dU0GmwFr+SnzqWohx3qvG8Fg8RHlL17/y9ifVWpYUdweuODb9c=')
-c.player.nick="test cell pls ignore"
-c.send_spectate()
+c.player.nick="so mal sehen"
# initialize GUI
@@ -42,18 +42,29 @@ while True:
gui.draw_frame()
if len(list(c.player.own_cells)) > 0:
+ runaway=False
+
my_smallest = min(map(lambda cell : cell.mass, c.player.own_cells))
- runaway_x, runaway_y=(0.0,0.0)
+ forbidden_intervals = []
for cell in c.world.cells.values():
- dist = math.sqrt((cell.pos[0]-c.player.center[0])**2 + (cell.pos[1]-c.player.center[1])**2)
+ relpos = ((cell.pos[0]-c.player.center[0]),(cell.pos[1]-c.player.center[1]))
+ dist = math.sqrt(relpos[0]**2+relpos[1]**2)
+
if dist < cell.size*4 and cell.mass > 1.25 * my_smallest:
- runaway_x += (c.player.center[0] - cell.pos[0]) / cell.mass / dist
- runaway_y += (c.player.center[1] - cell.pos[1]) / cell.mass / dist
+ angle = math.atan2(relpos[1],relpos[0])
+ corridor_width = 2 * math.asin(cell.size / dist)
+ forbidden_intervals += canonicalize_angle_interval((angle-corridor_width, angle+corridor_width))
+ runaway=True
- runaway_r = math.sqrt(runaway_x**2 + runaway_y**2)
- if (runaway_r > 0):
- runaway_x, runaway_y = (c.player.center[0]+int(100*runaway_x / runaway_r)), (c.player.center[1]+int(100*runaway_y / runaway_r))
+
+ if (runaway):
+ forbidden_intervals = merge_intervals(forbidden_intervals)
+ allowed_intervals = invert_angle_intervals(forbidden_intervals)
+
+ (a,b) = find_largest_angle_interval(allowed_intervals)
+ runaway_angle = (a+b)/2
+ runaway_x, runaway_y = (c.player.center[0]+int(100*math.cos(runaway_angle))), (c.player.center[1]+int(100*math.sin(runaway_angle)))
c.send_target(runaway_x, runaway_y)
print ("Running away: " + str((runaway_x-c.player.center[0], runaway_y-c.player.center[1])))
@@ -76,4 +87,4 @@ while True:
gui.update()
stats.log_pos(c.player.center)
- stats.log_mass(c.player.total_mass) \ No newline at end of file
+ stats.log_mass(c.player.total_mass)