about summary refs log tree commit diff homepage
path: root/client-examples
diff options
context:
space:
mode:
Diffstat (limited to 'client-examples')
-rwxr-xr-xclient-examples/hit-and-run.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/client-examples/hit-and-run.py b/client-examples/hit-and-run.py
new file mode 100755
index 0000000..b93e149
--- /dev/null
+++ b/client-examples/hit-and-run.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+from math import inf, atan2, degrees
+from socket import socket
+from random import randint
+
+clientsocket = socket()
+clientsocket.connect(('localhost', 8089))
+while True:
+    length = clientsocket.recv(7).decode()
+    if length in ('', '0000000'): break     # connection closed or game over
+    l = clientsocket.recv(int(length)).decode().split()
+    data = iter(l)
+    nh, ne, nb, score = (int(next(data)) for _ in range(4))
+    maze = [[bool(int(i)) for i in next(data)] for _ in range(nh)]
+    hp = (lambda c: 0 if c == 48 else 123 - c)(ord(next(data)))
+    hx, hy, ha = (int(next(data)) for _ in range(3))
+    attackable, mobility = (bool(int(next(data))) for _ in range(2))
+
+    shortest = angle = inf
+    for _ in range(ne):
+        p = (lambda c: 0 if c == 48 else 3 - (c-97)%3)(ord(next(data)))
+        x, y, a = (int(next(data)) for _ in range(3))
+        d = ((x - hx)**2 + (y - hy)**2)**0.5
+        if d < shortest:
+            shortest = d
+            b = degrees(atan2(y - hy, x - hx))
+            angle = round(b + 360 if b < 0 else b)
+    # calculate to dodge from bullets is a bit too much for an example
+
+    move = 4 if ne and hp > 2 else 0
+    if angle == inf:
+        angle, attack = ha, 0
+    elif not attackable:
+        attack = 0
+    elif shortest < 160 or hp < 3:
+        move, angle, attack = 8, ha, 2
+    else:
+        attack = 1
+    clientsocket.send('{} {} {}'.format(move, angle, attack).encode())
+clientsocket.close()