-
Notifications
You must be signed in to change notification settings - Fork 0
/
main_ml.py
138 lines (108 loc) · 3.98 KB
/
main_ml.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
133
134
135
136
137
138
import tensorflow as tf
import numpy as np
import arcade
import pandas as pd
from snake import Snake
from apple import Apple
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 400
SCREEN_TITLE = "Super Snake ML version"
# Class Game
class Game(arcade.Window):
def __init__(self):
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, resizable=True)
arcade.set_background_color(arcade.color.KHAKI)
self.game_background = arcade.load_texture("assets/game_background.png")
self.model = tf.keras.models.load_model('weights/my_snake_model.h5')
self.apple = Apple(SCREEN_WIDTH, SCREEN_HEIGHT)
self.snake = Snake(SCREEN_WIDTH, SCREEN_HEIGHT)
def on_draw(self):
arcade.start_render()
arcade.draw_texture_rectangle(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2, SCREEN_WIDTH,
SCREEN_HEIGHT, self.game_background)
self.snake.draw()
self.apple.draw()
arcade.draw_text(f"SCORE : {self.snake.score}", SCREEN_WIDTH - 300,
SCREEN_HEIGHT - 30, arcade.color.YELLOW_ROSE, font_size= 20)
arcade.finish_render()
def on_update(self, delta_time: float):
data = {"wu": None,
"wr": None,
"wd": None,
"wl": None,
"au": None,
"ar": None,
"ad": None,
"al": None,
"apple visible": None}
self.snake.move()
# (موقعیت مار نسبت به سیب)
if self.snake.center_y < self.apple.center_y:
data["au"] = 1
data["ar"] = 0
data["ad"] = 0
data["al"] = 0
if self.snake.center_x == self.apple.center_x:
data["apple visible"] = 1
else:
data["apple visible"] = 0
elif self.snake.center_y > self.apple.center_y:
data["au"] = 0
data["ar"] = 0
data["ad"] = 1
data["al"] = 0
if self.snake.center_x == self.apple.center_x:
data["apple visible"] = 1
else:
data["apple visible"] = 0
elif self.snake.center_x < self.apple.center_x:
data["au"] = 0
data["ar"] = 1
data["ad"] = 0
data["al"] = 0
if self.snake.center_y == self.apple.center_y:
data["apple visible"] = 1
else:
data["apple visible"] = 0
elif self.snake.center_x > self.apple.center_x:
data["au"] = 0
data["ar"] = 0
data["ad"] = 0
data["al"] = 1
if self.snake.center_y == self.apple.center_y:
data["apple visible"] = 1
else:
data["apple visible"] = 0
# فاصله مار تا دیوار
data["wu"] = SCREEN_HEIGHT - self.snake.center_y
data["wr"] = SCREEN_WIDTH - self.snake.center_x
data["wd"] = self.snake.center_y
data["wl"] = self.snake.center_x
print(data)
data = pd.DataFrame(data, index=[1])
#data.fillna(0, inplace=True)
data = data.values
#data = list(data.values())
#data = np.array(data)
print("Data is: ", data)
output = self.model.predict(data)
direction = output.argmax()
print("Direction is:", direction)
if direction == 0:
self.snake.change_x = 0
self.snake.change_y = 1
elif direction == 1:
self.snake.change_x = 1
self.snake.change_y = 0
elif direction == 2:
self.snake.change_x = 0
self.snake.change_y = -1
elif direction == 3:
self.snake.change_x = -1
self.snake.change_y = 0
if arcade.check_for_collision(self.snake, self.apple):
self.snake.eat(self.apple)
self.apple = Apple(SCREEN_WIDTH, SCREEN_HEIGHT)
if __name__ == "__main__":
game = Game()
arcade.run()