2
2
3
3
class DavidDuck
4
4
5
-
6
5
#TODO: remove magic numbers.
7
- #TODO: rename detect methods
8
-
9
-
6
+
10
7
include Robot
11
8
12
9
def initialize
13
10
@NORMAL_TURN = 1
14
11
@FAST_TURN = 4
12
+
13
+ @TURN_DELAY = 12 # mod this is 0 we delay
15
14
16
15
@WALL_PADDING = 120
17
16
18
17
@SLOW_GUN_TURN = 1
19
18
@NORMAL_GUN_TURN = 5
20
19
@FAST_GUN_TURN = 17
20
+
21
+ @RADAR_TURN_SPEED = 2
22
+
23
+ @ENEMY_CLOSE = 100 # threshold distance for considering an enemy close.
24
+ @SAW_ENEMY_LONG_AGO = 20 # how many ticks ago do we consider too long ago since we saw an enemy
25
+ @SAW_ENEMY_MEDIUM = 15 # I tried 20, and then only won 60% of matches against grant. with 15 I win 80%
26
+ @SAW_ENEMY_RECENTLY = 5
27
+
21
28
22
29
@my_accel = 1
23
30
@gun_turn_speed = 10
24
31
@near_wall = false
25
32
@turn_speed = 3
26
- @found_enemy = 0 # the time at which our scanner last saw an enemy
27
- @distance_to_enemy = 0 # distance to enemy we scanned
33
+ @found_enemy = 0 # the time at which our scanner last saw an enemy
34
+ @distance_to_enemy = 0 # distance to enemy we scanned
28
35
end
29
36
30
37
31
38
# main game loop
32
39
def tick events
33
40
setup_bot
34
-
35
- #detect_injury
36
41
37
- @turn_speed = @NORMAL_TURN unless time % 12 == 0
42
+ default_turn
38
43
39
- detect_walls
44
+ wall_behaviour
40
45
41
- detect_enemy
42
-
43
- implement_update
46
+ enemy_behaviour
44
47
48
+ aim_gun
49
+
50
+ implement_update
45
51
end
46
52
47
-
48
53
# Helper methods
49
54
def setup_bot
50
55
turn_radar -3 if time == 0
51
56
end
52
57
58
+ def default_turn
59
+ @turn_speed = @NORMAL_TURN unless time % @TURN_DELAY == 0
60
+ end
53
61
54
- def detect_enemy
62
+ def enemy_behaviour
55
63
if ( ! events [ 'robot_scanned' ] . empty? )
56
64
say ( 'Pew!' )
57
65
fire 3
58
66
@gun_turn_speed = -@turn_speed
59
- @found_enemy = time
67
+ @found_enemy = time
60
68
@distance_to_enemy = events [ 'robot_scanned' ] [ 0 ] [ 0 ]
61
69
update_radar
62
70
end
63
- if ( time -@found_enemy > 0 && time - @found_enemy < 3 )
71
+ end
72
+
73
+ def aim_gun
74
+ time_since_enemy = time -@found_enemy
75
+
76
+ if ( time_since_enemy > 0 and time_since_enemy < @SAW_ENEMY_RECENTLY )
64
77
@gun_turn_speed = - @turn_speed - @NORMAL_GUN_TURN - 5
65
- elsif ( time - @found_enemy > 3 && time - @found_enemy < 15 and @distance_to_enemy > 100 )
78
+ elsif ( time_since_enemy > @SAW_ENEMY_RECENTLY and time_since_enemy < @SAW_ENEMY_MEDIUM and @distance_to_enemy > @ENEMY_CLOSE )
66
79
@gun_turn_speed = @SLOW_GUN_TURN
67
- elsif ( time - @found_enemy < 20 )
80
+ elsif ( time_since_enemy < @SAW_ENEMY_LONG_AGO )
68
81
@gun_turn_speed = @NORMAL_GUN_TURN
69
- elsif ( time - @found_enemy > 20 )
82
+ elsif ( time_since_enemy > @SAW_ENEMY_LONG_AGO )
70
83
say ( [ 'no enemy ' , time ] . join )
71
84
@gun_turn_speed = @FAST_GUN_TURN
72
85
end
73
86
end
74
87
75
88
def update_radar
76
- if ( @distance_to_enemy > 100 and ( radar_heading > -6 + gun_heading ) )
77
- turn_radar - 2
78
- elsif ( radar_heading < -2 + gun_heading )
79
- turn_radar 2
89
+ if ( @distance_to_enemy > @ENEMY_CLOSE and ( radar_heading > -6 + gun_heading ) )
90
+ turn_radar ( - @RADAR_TURN_SPEED )
91
+ elsif ( radar_heading < -@RADAR_TURN_SPEED + gun_heading )
92
+ turn_radar @RADAR_TURN_SPEED
80
93
end
81
94
end
82
95
96
+ # Not currently used. Makes me an easier target.
83
97
def detect_injury
84
98
@last_hit = time unless events [ 'got_hit' ] . empty?
85
99
if @last_hit and time - @last_hit < 4
@@ -90,24 +104,25 @@ def detect_injury
90
104
@turn_speed = rand ( 1 ...@NORMAL_TURN )
91
105
end
92
106
end
107
+
108
+ def wall_behaviour
109
+ @turn_speed = @FAST_TURN if detect_walls
110
+ end
93
111
94
112
def detect_walls
95
- if x <=@WALL_PADDING or x >=( battlefield_width -@WALL_PADDING )
96
- @turn_speed = @FAST_TURN
97
- say ( 'side edge' )
98
- @near_wall = true ;
99
- elsif y >= ( battlefield_height -@WALL_PADDING ) or y <= @WALL_PADDING
100
- @turn_speed = @FAST_TURN
101
- say ( 'top edge' )
102
- @near_wall = true ;
113
+ if x <= @WALL_PADDING or x >= ( battlefield_width - @WALL_PADDING )
114
+ @near_wall = true ;
115
+ elsif y >= ( battlefield_height - @WALL_PADDING ) or ( y <= @WALL_PADDING )
116
+ @near_wall = true ;
103
117
else
104
- @near_wall = false ;
118
+ @near_wall = false ;
105
119
end
120
+ return @near_wall
106
121
end
107
122
108
123
def implement_update
109
124
turn @turn_speed
110
- accelerate ( @my_accel )
125
+ accelerate @my_accel
111
126
turn_gun @gun_turn_speed
112
127
end
113
128
0 commit comments