-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.gd
115 lines (90 loc) · 2.58 KB
/
Main.gd
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
extends Node
signal hit
#export (PackedScene) var pipe
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
var python_script = NNpython
onready var pipe = preload("res://pipe.tscn")
onready var player = get_node("player")
onready var pipe_timer = $PipeTimer
var done = false
var reward = 0
var score = 0
var old_state = false
var action = null
var del = 0.033333
# Called when the node enters the scene tree for the first time.
func _ready():
#Engine.time_scale = 3
#Engine.target_fps = 90
randomize()
spawn_pipe()
pipe_timer.start(1.6)
player.connect("game_over", self, "_on_game_over")
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _on_PipeTimer_timeout():
spawn_pipe()
func _on_player_game_over():
$PipeTimer.stop()
func _process(delta):
reward += 0.05
var state = get_current_state()
#print(reward, state, done)
if old_state and python_script.training:
python_script.remember(old_state, action, reward, state, done)
if Engine.get_frames_drawn() % 4 == 0:
python_script.train_long_memory()
if done == true:
print(state)
python_script.done(score)
get_tree().reload_current_scene()
action = python_script.get_action(state)
if action:
player.jump()
old_state = state
func get_current_state():
var player_y = player.position.y
var player_vel_y = player.velocity.y
var c_pipe = get_closest_pipe()
var c_pipe_distance = c_pipe.position.x - player.position.x
var c_pipe_y = c_pipe.position.y
#return [player_y, player_vel_y, c_pipe_distance, c_pipe_y]
var c_pipe_top_dist = player_y - (c_pipe_y - 88)
var c_pipe_bottom_dist = c_pipe_y + 88 - player_y
return [player_vel_y, c_pipe_distance + 50, c_pipe_top_dist-21, c_pipe_bottom_dist-21]
func get_closest_pipe():
var closest_distance = INF
var closest_pipe = null
for p in get_tree().get_nodes_in_group('pipe_group'):
if p.position.x + 50 > player.position.x: #prev: + 50
var distance = p.position.x - player.position.x
if distance < closest_distance:
closest_distance = distance
closest_pipe = p
closest_pipe.change_color()
return closest_pipe
func _on_pipe_body_entered(body):
died()
func _on_game_over():
died()
func died():
if not done:
done = true
reward -= 100
print("RIP", reward)
func _on_scored():
reward += 20
score += 1
print(score)
func _on_Timer_timeout():
pass
#reward += 1
func spawn_pipe():
var Pipe = pipe.instance()
add_child(Pipe)
Pipe.position = Vector2(800, rand_range(160, 430))
Pipe.connect("body_entered", self, "_on_pipe_body_entered")
Pipe.connect("scored", self, "_on_scored")