You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
2 years ago
|
#!/usr/bin/env python3
|
||
|
import argparse
|
||
|
import time
|
||
|
from client import get_state, send_turn, logger, TIME_BEFORE_RETRY
|
||
|
|
||
|
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument("--server", type=str, default="http://localhost:5000", help="Server address.")
|
||
|
parser.add_argument("--game", type=str, default="main", help="'main' or 'test_#'.")
|
||
|
parser.add_argument("--token", type=str, default=None, help="API token.")
|
||
|
parser.add_argument("--log_level", type=str, default="WARNING", choices=["ERROR", "WARNING", "INFO"])
|
||
|
# you can add your own arguments, the strategy function will get them
|
||
|
|
||
|
|
||
|
def strategy(team_id: int, state: dict, args: argparse.Namespace) -> dict:
|
||
|
"""Finds the best move for the given state.
|
||
|
|
||
|
This function is called every round.
|
||
|
It should return a dict with actions for each of team's soldiers.
|
||
|
|
||
|
State format:
|
||
|
```yaml
|
||
|
{
|
||
|
map: [[{
|
||
|
home_for_team: Optional[int],
|
||
|
occupied_by_team: Optional[int],
|
||
|
hill: bool,
|
||
|
members: [{
|
||
|
type: "soldier",
|
||
|
team: int,
|
||
|
id: int,
|
||
|
remaining_rounds: int
|
||
|
}]
|
||
|
}]]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Turn format:
|
||
|
```yaml
|
||
|
{
|
||
|
members: [{
|
||
|
id: int,
|
||
|
action: Optional[str]
|
||
|
# None, "left", "right", "up", "down"
|
||
|
}]
|
||
|
}
|
||
|
```
|
||
|
"""
|
||
|
return {}
|
||
|
|
||
|
|
||
|
def main(args: argparse.Namespace):
|
||
|
min_round = 0
|
||
|
logger.setLevel(args.log_level)
|
||
|
|
||
|
while True:
|
||
|
state, wait_time = get_state(min_round)
|
||
|
if state is None:
|
||
|
# retry later
|
||
|
time.sleep(wait_time)
|
||
|
continue
|
||
|
|
||
|
turn = strategy(state["team_id"], state["state"], args)
|
||
|
|
||
|
round = state["round"]
|
||
|
while not send_turn(turn, round):
|
||
|
# if there was a connection error, retry later
|
||
|
time.sleep(TIME_BEFORE_RETRY)
|
||
|
min_round = round + 1
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
args = parser.parse_args()
|
||
|
main(args)
|