generated from BattlesnakeOfficial/starter-snake-python
-
Notifications
You must be signed in to change notification settings - Fork 4
/
snake_bruce.py
132 lines (106 loc) · 4.7 KB
/
snake_bruce.py
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import random
import typing
import json
from pathlib import Path
import time
import os
def info_bruce():
return {
"apiversion": "1",
"author": "bruce", # TODO: Your Battlesnake Username
"color": "#FF2400", # TODO: Choose color
"head": "fang", # TODO: Choose head
"tail": "curled", # TODO: Choose tail
}
# move is called on every turn and returns your next move
# Valid moves are "up", "down", "left", or "right"
# See https://docs.battlesnake.com/api/example-move for available data
def move_bruce(game_state: typing.Dict) -> typing.Dict:
starttime = time.time()
# informational only: Log the turn to a file
deployment_mode = os.environ.get("deployment_mode")
if deployment_mode != "production":
logFileName = "logs/bruce" + "turn_" + str(game_state["turn"]) + ".json"
logFilePath = Path(__file__).parent / logFileName
json_file = open(logFilePath, "w")
json.dump(game_state, json_file, indent=4)
json_file.close()
is_move_safe = {"up": True, "down": True, "left": True, "right": True}
# We've included code to prevent your Battlesnake from moving backwards
my_head = game_state["you"]["body"][0] # Coordinates of your head
my_neck = game_state["you"]["body"][1] # Coordinates of your "neck"
if my_neck["x"] < my_head["x"]: # Neck is left of head, don't move left
is_move_safe["left"] = False
elif my_neck["x"] > my_head["x"]: # Neck is right of head, don't move right
is_move_safe["right"] = False
elif my_neck["y"] < my_head["y"]: # Neck is below head, don't move down
is_move_safe["down"] = False
elif my_neck["y"] > my_head["y"]: # Neck is above head, don't move up
is_move_safe["up"] = False
# TODO: Step 1 - Prevent your Battlesnake from moving out of bounds
board_width = game_state['board']['width']
board_height = game_state['board']['height']
if my_head["x"]==0:
is_move_safe["left"]=False
if my_head["x"]==board_width-1:
is_move_safe["right"]=False
if my_head["y"]==0:
is_move_safe["down"]=False
if my_head["y"]==board_width-1:
is_move_safe["up"]=False
# TODO: Step 2 - Prevent your Battlesnake from colliding with itself
my_body = game_state['you']['body']
for part in my_body:
if my_head["x"]+1 ==part["x"] and my_head["y"] ==part["y"]:
is_move_safe["right"]=False
if my_head["x"]-1 ==part["x"] and my_head["y"] ==part["y"]:
is_move_safe["left"]=False
if my_head["y"]+1 ==part["y"] and my_head["x"] ==part["x"]:
is_move_safe["up"]=False
if my_head["y"]-1 ==part["y"] and my_head["x"] ==part["x"]:
is_move_safe["down"]=False
# TODO: Step 3 - Prevent your Battlesnake from colliding with other Battlesnakes
opponents = game_state['board']['snakes']
for snake in opponents:
for part in snake['body']:
if my_head["x"]+1 ==part["x"] and my_head["y"] ==part["y"]:
is_move_safe["right"]=False
if my_head["x"]-1 ==part["x"] and my_head["y"] ==part["y"]:
is_move_safe["left"]=False
if my_head["y"]+1 ==part["y"] and my_head["x"] ==part["x"]:
is_move_safe["up"]=False
if my_head["y"]-1 ==part["y"] and my_head["x"] ==part["x"]:
is_move_safe["down"]=False
first_food = game_state['board']['food'][0]
if my_head['x'] > first_food["x"]:
if is_move_safe["left"] == True:
return {"move": "left"}
elif my_head['x'] < first_food["x"]:
if is_move_safe["right"] == True:
return {"move": "right"}
elif my_head['y'] > first_food["y"]:
if is_move_safe["down"] == True:
return {"move": "down"}
elif my_head['y'] < first_food["y"]:
if is_move_safe["up"] == True:
return {"move": "up"}
# Are there any safe moves left?
safe_moves = []
for move, is_safe in is_move_safe.items():
if is_safe:
safe_moves.append(move)
if len(safe_moves) == 0:
print(f"MOVE {game_state['turn']}: No safe moves detected! Moving down")
return {"move": "down"}
# Choose a random move from the safe ones
next_move = random.choice(safe_moves)
# Step 4 - Move towards food instead of random, to regain health and survive longer
print(f"MOVE {game_state['turn']}: {next_move}")
print("elapsed time: ", (time.time() - starttime) * 1000)
return {"move": next_move}
if __name__ == "__main__":
dataFilePath = Path(__file__).parent / "snake_bruce.json"
rhandle = open(dataFilePath, "r")
gamestate = json.load(rhandle)
rhandle.close()
print(move_bruce(gamestate))