Hi all,
I’m new to ruby and OO programming (been writing procedural perl for a
few years). I’m hoping to use the rrobots modules to practice ruby
and OO (just missed the rubyquiz competition, eh?). Here’s what I
have so far. This is not the smartest bot by any means (only 1 speed
and not the greatest tracking…), but at this point I’m mostly
interested in making sure my code is good clean OO and generally
follows the “ruby way” of doing things. Any/all suggestions welcome!
Thanks!
Greg
require ‘robot’
#available options:
#state:
team
battlefield_height
battlefield_width
energy
gun_heading
gun_heat
heading
size
radar_heading
time
game_over
speed
x
y
#actions:
accelerate
stop
fire
turn
turn_gun
turn_radar
broadcast
say
#events:
got_hit
robot_scanned
broadcasts
class GoofeyDuck
include Robot
@@radar_scan = 60 #make a class with methods??? ie scan.increase,
scan.decrease
@@found = 0
def tick events
turn_radar(radar_dir)
turn_gun(gun_dir)
turn(tank_dir)
accelerate(tank_acc)
fire(gun_str)
say("Dang!!!!") if (energy <= 1)
end
def radar_dir #return between -60 and 60
if (!events['robot_scanned'].empty?) #found_em
@@radar_scan = decrease(@@radar_scan, 1, 0)
@@radar_scan = reverse_dir(@@radar_scan)
found = 1
elsif (found == 1) #had em last tick, adjusting....
@@radar_scan = increase(@@radar_scan, 2, 60)
@@radar_scan = reverse_dir(@@radar_scan)
found = 0
else
@@radar_scan = increase(@@radar_scan, 2, 60)
end
@@radar_scan
end
def gun_dir #return between -30 and 30
radar_heading - gun_heading
end
def tank_dir #return betweem -10 and 10
if (!events[‘got_hit’].empty?) #got hit - run away!
increase(heading, 10, 360)
elsif ((x <= size) ||
(y <= size) ||
(x >= battlefield_width - size) ||
(y >= battlefield_height- size)) #in a wall - right turn
clyde!
decrease(heading, 10, 0)
else
gun_heading - heading
end
end
def tank_acc #return between -1 and 1
1
end
def gun_str #return between 0.1 and 3
0.5 #make based on size of radar_scan or event[‘robot_scanned’](as
either gets smaller, power gets larger)
end
#helper methods…
def increase(current, amt, max)
return current if (current.abs >= max)
z = current <=> 0
current + (z * amt)
end
def decrease(current, amt, min)
return current if (current.abs <= min)
z = current <=> 0
current - (z * amt)
end
def reverse_dir(current)
current * -1
end
end