-
Notifications
You must be signed in to change notification settings - Fork 25
/
Run_Game.py
64 lines (50 loc) · 2.64 KB
/
Run_Game.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
from Snake_Game import *
from Feed_Forward_Neural_Network import *
def run_game_with_ML(display, clock, weights):
max_score = 0
avg_score = 0
test_games = 1
score1 = 0
steps_per_game = 2500
score2 = 0
for _ in range(test_games):
snake_start, snake_position, apple_position, score = starting_positions()
count_same_direction = 0
prev_direction = 0
for _ in range(steps_per_game):
current_direction_vector, is_front_blocked, is_left_blocked, is_right_blocked = blocked_directions(
snake_position)
angle, snake_direction_vector, apple_direction_vector_normalized, snake_direction_vector_normalized = angle_with_apple(
snake_position, apple_position)
predictions = []
predicted_direction = np.argmax(np.array(forward_propagation(np.array(
[is_left_blocked, is_front_blocked, is_right_blocked, apple_direction_vector_normalized[0],
snake_direction_vector_normalized[0], apple_direction_vector_normalized[1],
snake_direction_vector_normalized[1]]).reshape(-1, 7), weights))) - 1
if predicted_direction == prev_direction:
count_same_direction += 1
else:
count_same_direction = 0
prev_direction = predicted_direction
new_direction = np.array(snake_position[0]) - np.array(snake_position[1])
if predicted_direction == -1:
new_direction = np.array([new_direction[1], -new_direction[0]])
if predicted_direction == 1:
new_direction = np.array([-new_direction[1], new_direction[0]])
button_direction = generate_button_direction(new_direction)
next_step = snake_position[0] + current_direction_vector
if collision_with_boundaries(snake_position[0]) == 1 or collision_with_self(next_step.tolist(),
snake_position) == 1:
score1 += -150
break
else:
score1 += 0
snake_position, apple_position, score = play_game(snake_start, snake_position, apple_position,
button_direction, score, display, clock)
if score > max_score:
max_score = score
if count_same_direction > 8 and predicted_direction != 0:
score2 -= 1
else:
score2 += 2
return score1 + score2 + max_score * 5000