about summary refs log tree commit diff homepage
path: root/client-examples/hit-and-run.py
blob: 925a3a609fecfebb62ae046c316c993ef1088749 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python3
from math import inf, atan2, degrees
from socket import socket

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()