-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrain_data.py
104 lines (86 loc) · 4.27 KB
/
train_data.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
# https://towardsdatascience.com/today-im-going-to-talk-about-a-small-practical-example-of-using-neural-networks-training-one-to-6b2cbd6efdb3
# ideas
from game import *
def generate_training_data(display, clock):
max_score = 0
avg_score = 0
training_data_x = []
training_data_y = [] # of strudture [left, front, right]
games = 1000
max_steps = 2000
for i in tqdm(range(games)):
snake = Snake()
score = snake.score
# distance_to_apple = food_distance_from_snake(snake.food, snake.get_head_pos())
while snake.moves and not snake.dead:
# for _ in range(max_steps):
initial_distance_to_apple = snake.food_distance_from_snake()
angle_with_apple, apple_direction_vector_normalized, snake_direction_vector_normalized = snake.get_angle_with_apple()
turn_direction, turn_direction_vector = snake.generate_direction(angle_with_apple) # direction that should be turned next based on apple position
current_direction_vector, is_front_blocked, is_left_blocked, is_right_blocked = snake.blocked_directions()
# turn_direction, turn_direction_vector, training_data_y = generate_training_data_y(snake, turn_direction, turn_direction_vector, is_front_blocked, is_left_blocked, is_right_blocked, training_data_y)
if is_right_blocked and is_left_blocked and is_front_blocked:
break
# new input training data sample
training_data_x.append([is_left_blocked, is_front_blocked, is_right_blocked, angle_with_apple, turn_direction])
# training_data_x.append([score,
# is_left_blocked, is_front_blocked, is_right_blocked, apple_direction_vector_normalized[0], apple_direction_vector_normalized[1], \
# snake_direction_vector_normalized[0], snake_direction_vector_normalized[1]])
snake = snake.play_game(turn_direction_vector, display, clock)
distance_to_apple = snake.food_distance_from_snake()
if snake.dead or snake.moves == 0:
training_data_y.append([-1])
else:
if distance_to_apple < initial_distance_to_apple or snake.score > score:
training_data_y.append([1])
else:
training_data_y.append([0])
score = snake.score
print("LENGTH = {}, SCORE = {}".format(snake.length, score))
max_score = max(score, max_score)
avg_score += score
print("Avg score so far: {}".format(avg_score / (i+1)))
print("Final average score: {}".format(avg_score / games))
return training_data_x, training_data_y
def generate_training_data_y(snake, turn_direction, turn_direction_vector, is_front_blocked, is_left_blocked, is_right_blocked, training_data_y):
# if should turn to the left
if turn_direction == -1:
if is_left_blocked:
if is_front_blocked and not is_right_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(1)
training_data_y.append([0, 0, 1])
elif not is_front_blocked and is_right_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(0)
training_data_y.append([0, 1, 0])
elif not is_front_blocked and not is_right_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(1)
training_data_y.append([0, 0, 1])
else:
training_data_y.append([1, 0, 0]) #turn left if left is available
elif turn_direction == 0:
if is_front_blocked:
if is_left_blocked and not is_right_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(1)
training_data_y.append([0, 0, 1])
elif not is_left_blocked and is_right_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(-1)
training_data_y.append([1, 0, 0])
elif not is_left_blocked and not is_right_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(1)
training_data_y.append([0, 0, 1])
else:
training_data_y.append([0, 1, 0])
elif turn_direction == 1:
if is_right_blocked:
if is_front_blocked and not is_left_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(-1)
training_data_y.append([1, 0, 0])
elif not is_front_blocked and is_left_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(0)
training_data_y.append([0, 1, 0])
elif not is_front_blocked and not is_left_blocked:
turn_direction, turn_direction_vector = snake.direction_vector(-1)
training_data_y.append([1, 0, 0])
else:
training_data_y.append([0, 0, 1])
return turn_direction, turn_direction_vector, training_data_y