Skip to content

Commit 14959ad

Browse files
author
David Rust-Smith
committedJun 30, 2013
Cleaned Code: Less magic numbers
Renamed and refactored some methods.
1 parent 8e2b017 commit 14959ad

File tree

1 file changed

+49
-34
lines changed

1 file changed

+49
-34
lines changed
 

‎DavidDuck.rb

+49-34
Original file line numberDiff line numberDiff line change
@@ -2,84 +2,98 @@
22

33
class DavidDuck
44

5-
65
#TODO: remove magic numbers.
7-
#TODO: rename detect methods
8-
9-
6+
107
include Robot
118

129
def initialize
1310
@NORMAL_TURN = 1
1411
@FAST_TURN = 4
12+
13+
@TURN_DELAY = 12 # mod this is 0 we delay
1514

1615
@WALL_PADDING = 120
1716

1817
@SLOW_GUN_TURN = 1
1918
@NORMAL_GUN_TURN = 5
2019
@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+
2128

2229
@my_accel = 1
2330
@gun_turn_speed = 10
2431
@near_wall = false
2532
@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
2835
end
2936

3037

3138
# main game loop
3239
def tick events
3340
setup_bot
34-
35-
#detect_injury
3641

37-
@turn_speed = @NORMAL_TURN unless time % 12 == 0
42+
default_turn
3843

39-
detect_walls
44+
wall_behaviour
4045

41-
detect_enemy
42-
43-
implement_update
46+
enemy_behaviour
4447

48+
aim_gun
49+
50+
implement_update
4551
end
4652

47-
4853
# Helper methods
4954
def setup_bot
5055
turn_radar -3 if time == 0
5156
end
5257

58+
def default_turn
59+
@turn_speed = @NORMAL_TURN unless time % @TURN_DELAY == 0
60+
end
5361

54-
def detect_enemy
62+
def enemy_behaviour
5563
if (! events['robot_scanned'].empty?)
5664
say('Pew!')
5765
fire 3
5866
@gun_turn_speed = -@turn_speed
59-
@found_enemy=time
67+
@found_enemy = time
6068
@distance_to_enemy = events['robot_scanned'][0][0]
6169
update_radar
6270
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)
6477
@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)
6679
@gun_turn_speed = @SLOW_GUN_TURN
67-
elsif (time-@found_enemy < 20 )
80+
elsif (time_since_enemy < @SAW_ENEMY_LONG_AGO)
6881
@gun_turn_speed = @NORMAL_GUN_TURN
69-
elsif (time-@found_enemy > 20 )
82+
elsif (time_since_enemy > @SAW_ENEMY_LONG_AGO)
7083
say(['no enemy ',time].join)
7184
@gun_turn_speed = @FAST_GUN_TURN
7285
end
7386
end
7487

7588
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
8093
end
8194
end
8295

96+
# Not currently used. Makes me an easier target.
8397
def detect_injury
8498
@last_hit = time unless events['got_hit'].empty?
8599
if @last_hit and time - @last_hit < 4
@@ -90,24 +104,25 @@ def detect_injury
90104
@turn_speed = rand(1...@NORMAL_TURN)
91105
end
92106
end
107+
108+
def wall_behaviour
109+
@turn_speed = @FAST_TURN if detect_walls
110+
end
93111

94112
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;
103117
else
104-
@near_wall=false;
118+
@near_wall = false;
105119
end
120+
return @near_wall
106121
end
107122

108123
def implement_update
109124
turn @turn_speed
110-
accelerate( @my_accel )
125+
accelerate @my_accel
111126
turn_gun @gun_turn_speed
112127
end
113128

0 commit comments

Comments
 (0)
Please sign in to comment.