-
Notifications
You must be signed in to change notification settings - Fork 2
/
main.py
70 lines (52 loc) · 2.14 KB
/
main.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
import pyglet
from Game.game_window import GameWindow
from pyglet.window import key
'''Params begin'''
# After how many does should the running stop
episodes = 50000
# Angles of the lidar rays as the current state of the car
# 0 points forward -180 or 180 backwards
ray_angles = [-180,-135,-90,-60,-30,0,30,60,90,135]
# Which move is done for which action
# [up, left, right]
action2movetable = [[0,0,0],[0,1,0],[1,1,0],[1,0,0],[1,0,1],[0,0,1]]
# A brain/agent to give to a player what to do
# In case of multiple instances, every one will get one...
brain = []
'''Params end'''
class MyGame(GameWindow):
def __init__(self, update_screen, width, height):
super().__init__(update_screen, width, height)
self.best_reward = 0
# Labels
self.epi_label = pyglet.text.Label(text="Episode: 1", x=10, y=35, batch=self.batches['main'],
group=self.subgroups['base'])
self.reward_label = pyglet.text.Label(text="Best reward: 0", x=10, y=20, batch=self.batches['main'],
group=self.subgroups['base'])
def update(self):
for car in self.get_cars():
if not car.died:
state = car.get_state()
action = [keys[key.UP],keys[key.LEFT],keys[key.RIGHT]]
reward, new_state, done = car.step(action)
if self.is_game_ended():
self.episode += 1
if self.get_cars()[0].last_reward > self.best_reward:
self.best_reward = self.get_cars()[0].last_reward
self.epi_label.text = "Episode: {0}".format(self.episode)
self.reward_label.text = "Best reward: {0}".format(self.best_reward)
self.reset()
game = MyGame(True, 800, 600)
keys = key.KeyStateHandler()
game.push_handlers(keys)
# Generate track
game.generate_track(draw_gates=False)
# Set player number
game.set_car_number(1, ray_angles, lapse_until_won=5)
# Set length of the game
game.set_game_length(episodes)
# Cancel die by time (time -> reduces reward -> below certain reward car dies)
game.cancel_die_by_time()
game.reset()
if __name__ == "__main__":
game.run()