On 11/24/05, Simon Kr÷šer <SimonKroeger / gmx.de> wrote:
> RRobots v0.1
>
> First there was CRobots, followed by PRobots and many others,
> recently (well also years ago) Robocode emerged and finally
> this is RRobots bringing all the fun to the ruby community.
>
> What is he talking about?
>
> RRobots is a simulation environment for robots, these robots have
> a scanner and a gun, can move forward and backwards and are entirely
> controlled by ruby scripts. All robots are equal (well at the moment,
> maybe this will change) except for the ai.
>
> A simple robot script may look like this:
> ----------------------- code -----------------------
> require 'robot'
>
> class NervousDuck
>     include Robot
>
>    def tick events
>      turn_radar 1 if time == 0
>      turn_gun 30 if time < 3
>      accelerate 1
>      turn 2
>      fire 3 unless events['robot_scanned'].empty?
>    end
> end
> ----------------------- code -----------------------
>
> all you need to implement is the tick method which should
> accept a hash of events occured turing the last tick.
>
> By including Robot you get all this methods to controll your bot:
>
>    battlefield_height  #the height of the battlefield
>    battlefield_width   #the width of the battlefield
>    energy              #your remaining energy (if this drops
>                        #below 0 you are dead)
>    gun_heading         #the heading of your gun, 0 pointing east,
>                        #90 pointing
>                        #north, 180 pointing west, 270 pointing south
>    gun_heat            #your gun heat, if this is above 0 you can't shoot
>    heading             #your robots heading, 0 pointing east, 90 pointing
>                        #north, 180 pointing west, 270 pointing south
>    size                #your robots radius, if x <= size you hit
>                        #the left wall
>    radar_heading       #the heading of your radar, 0 pointing east,
>                        #90 pointing north, 180 pointing west,
>                        #270 pointing south
>    time                #ticks since match start
>    velocity            #your velocity (-8/8)
>    x                   #your x coordinate, 0...battlefield_width
>    y                   #your y coordinate, 0...battlefield_height
>    accelerate(param)   #accelerate (max speed is 8,
>                        #max accelerate is 1/-1,
>                        #negativ speed means moving backwards)
>    stop                #accelerates negativ if moving forward
>                        #(and vice versa), may take 8 ticks to stop (and
>                        #you have to call it every tick)
>    fire(power)         #fires a bullet in the direction of your gun,
>                        #power is 0.1 - 3, this power will heat your gun
>    turn(degrees)       #turns the robot (and the gun and the radar),
>                        #max 10 degrees per tick
>    turn_gun(degrees)   #turns the gun (and the radar), max 30 degrees
>                        #per tick
>    turn_radar(degrees) #turns the radar, max 60 degrees per tick
>    dead                #true if you are dead
>
> These methods are intentionally of very basic nature, you are free to
> unleash the whole power of ruby to create higher level functions.
> (e.g. move_to, fire_at and so on)
>
> Some words of explanation: The gun is mounted on the body, if you turn
> the body the gun will follow. In a simmilar way the radar is mounted on
> the gun. The radar scans everything it sweeps over in a single tick (100
> degrees if you turn your body, gun and radar in the same direction) but
> will report only the distance of scanned robots, not the angle. If you
> want more precission you have to turn your radar slower.
>
> RRobots is implemented in pure ruby using a tk ui and should run on all
> platforms that have ruby and tk. (until now it's tested on windows only)
>
> To start a match call e.g.
>
> ruby rrobots.rb SittingDuck NervousDuck
>
> the classes have to be defined in files with the same name.
> (SittingDuck.rb and NervousDuck.rb for the example above)
>
> You can download the 0.1 release from rubyforge:
>
> http://rubyforge.org/frs/?group_id=1109
>
> The best way to help and keep me motivated would be to post some cool
> bots here (along with the bug-reports and feature requests)
>
> cheers
>
> Simon
>
> (and thanks to the robocode project for the nice graphics)
>
>

Really great work!

It runs on my Linux desktop very well by only modifying image path. :)
However, ruby can handle unix style path separator(/) on other platforms,
(If I am wrong, correct me.) though 'File.join' will be better for that use.

--- rrobots.rb.orig     2005-11-24 23:14:55.000000000 +0900
+++ rrobots.rb  2005-11-24 23:15:20.000000000 +0900
@@ -136,15 +136,15 @@
 %w{red green}.each do |color|
        bodies, guns, radars = [], [], []
        36.times do |i|
-               bodies << TkPhotoImage.new(:file =>
"images\\#{color}_body#{(i*10).to_s.rjust(3, '0')}.gif")
-               guns << TkPhotoImage.new(:file =>
"images\\#{color}_turret#{(i*10).to_s.rjust(3, '0')}.gif")
-               radars << TkPhotoImage.new(:file =>
"images\\#{color}_radar#{(i*10).to_s.rjust(3, '0')}.gif")
+               bodies << TkPhotoImage.new(:file =>
"images/#{color}_body#{(i*10).to_s.rjust(3, '0')}.gif")
+               guns << TkPhotoImage.new(:file =>
"images/#{color}_turret#{(i*10).to_s.rjust(3, '0')}.gif")
+               radars << TkPhotoImage.new(:file =>
"images/#{color}_radar#{(i*10).to_s.rjust(3, '0')}.gif")
        end
        colors << TkRobot.new(bodies << bodies[0], guns << guns[0],
radars << radars[0])
 end

 bum = (0..14).map do |i|
-  TkPhotoImage.new(:file => "images\\explosion#{i.to_s.rjust(2, '0')}.gif")
+  TkPhotoImage.new(:file => "images/explosion#{i.to_s.rjust(2, '0')}.gif")
 end

 robots, bullets, explosions = {}, {}, {}
@@ -177,4 +177,4 @@
   end
 }).start

-Tk.mainloop
\ No newline at end of file
+Tk.mainloop

--
http://nohmad.sub-port.net