top | item 6656419

Show HN: Game where you write Python robots to fight other players

142 points| _g2lm | 12 years ago |robotgame.org

98 comments

order
[+] _g2lm|12 years ago|reply
I was looking through the code and saw someone submitted this but didn't run it:

    def x():
        g = yield
        yield g.gi_frame.f_back.f_back

    g = x()
    g.next()
    frame = g.send(g)

    player_id = frame.f_locals['player_id']
    globals = frame.f_back.f_globals

    CODE = """
    class Game:

        def _""" """_init_""" """_(self, *players):
            pass

        def run_turn(self):
            pass

        def get_game_history(self):
            return ''

        def get_scores(self):
            scores = [0, 0]
            scores[player_id] = 2000
            return scores
    """

    exec CODE

    globals["Game"] = Game
Clearly I have some security problems. Thanks to whoever made this for bringing this to my attention without actually screwing me.
[+] praptak|12 years ago|reply
As pointed out in another subthread, Python code is practically impossible to sandbox. Most competition isolate player code by running it in a separate process which has the additional benefit of easily allowing different implementation languages.

Making sure the process doesn't use your network to spread malware is not 100% trivial but still easier than sandboxing Python code within Python.

Good luck with your project!

[+] sitkack|12 years ago|reply
Id run in docker containers or zerovm. You _cannot_ sandbox Python.
[+] Kiro|12 years ago|reply
What does this code do?
[+] nilkn|12 years ago|reply
Is this anything like Robocode?

http://robocode.sourceforge.net/

Because I had an amazing time in high school doing some local Robocode competitions. This could really bring some memories back.

Edit: Ahh, I see, it appears to be a sort of discrete turn-based version.

[+] smilliken|12 years ago|reply
At Mixrank we've started doing mini-AI competitions. We'll have to try your game!

We've been doing Connect Four the last two weeks: https://github.com/smilliken/aigames/tree/master/connect-fou.... The runner is in Python, but you can write a bot in any language you like.

PS: if anyone wants to join, we're in San Francisco by the ballpark, and compete on Wednesday evenings.

[+] kirubakaran|12 years ago|reply
It has been a lot of fun. Thanks for organizing it.
[+] bigiain|12 years ago|reply
So did anyone else ever play Core War back in the mid '80s?

http://en.wikipedia.org/wiki/Core_War

I wonder whether modern virtualization techniques are secure enough to allow you to provide unrestricted access to a virtualized OS and allow people complete access to fight for control?

[+] lawn|12 years ago|reply
Hah!

I wasn't born then, but me and my friends implemented a CoreWars 88' standard microprocessor in an FPGA for a school hardware project. It was possible to write code snippets in redcode and then we compiled it and sent it through usb and the FPGA was connected to a screen so we could see the progress.

The source is fairly messy but have a peek if it interests you: https://github.com/treeman/MARC

[+] blueblob|12 years ago|reply
Not me, but I read about a contest that was similar to this. Unfortunately I can't find a link but the general idea was that people could write worms under a very small size limit and fight for control of memory much like this game.
[+] lennel|12 years ago|reply
yes, (early 90's for me), I wondered if anyone else remembered this. Also played another variant of this with a subset of C when at varsity.
[+] Ihmahr|12 years ago|reply
Why did you disable some of my favourite language features?[1]

    set dict map reduce sum min max 

Surely they don't pose a security risk?

[1] http://robotgame.org/api

[+] oneeyedpigeon|12 years ago|reply
You need to say somewhere that:

python kit/run.py yourcode.py yourothercode.py map.py --render

is required to view the simulation. The "--render" argument doesn't seem to be mentioned anywhere on the site.

[+] _g2lm|12 years ago|reply
Right you are. Let me add that.
[+] Xephyrous|12 years ago|reply
I'm having a lot of fun with this. I'll submit something soon. You swallow all exceptions and make the robot guard instead. This is nice, but it makes it hard to develop, because you can't see what went wrong. Here's a way you can modify it to have your exception and eat it too:

from http://docs.python.org/2/library/traceback.html#traceback-ex...

In game.py, at the top, put

    import sys, traceback
and around line 285, replace this:

    except Exception:
        next_action = ['guard']
with this:

    except Exception:
        print "The robot at (%s, %s) raised an exception:" % robot.location
        print '-'*60
        traceback.print_exc(file=sys.stdout)
        print '-'*60
        next_action = ['guard']

That makes your robot a lot easier to debug. Awesome game, have you thought about putting it on github so people can submit patches?
[+] _g2lm|12 years ago|reply
Wow, great work. Mind if I steal this? And yeah, I'll open-source it pretty soon.
[+] benhamner|12 years ago|reply
Brandon - what methods are you using to run untrusted Python code in a secure sandbox?
[+] _g2lm|12 years ago|reply
Right now what I'm doing is:

1. search code for double underscores (to block magic methods)

2. replace `__builtins__` with a whitelisted version

3. hook `__import__` to only allow a whitelist

4. hook `getattr` to reject any key containing double underscores

[+] Xephyrous|12 years ago|reply
Looks fun, can't wait to get started. In your instructions, you said to run the program, call:

    python kit/run.py yourcode.py yourothercode.py --render
If you try to run run.py from outside of its directory, it can't import settings.py

    Traceback (most recent call last):
      File "kit/run.py", line 1, in <module>
        import game
      File "/home/<name>/robotgame/kit/game.py", line 30, in <module>
        settings = SettingsDict('settings.py').d
      File "/home/<name>/robotgame/kit/game.py", line 28, in __init__
        self.d = AttrDict(ast.literal_eval(open('settings.py').read()))
    IOError: [Errno 2] No such file or directory: 'settings.py'
[+] _g2lm|12 years ago|reply
Thanks for the tip. I updated the instructions.
[+] pmiller2|12 years ago|reply
[+] DanBC|12 years ago|reply
So, has anyone compiled a list of these types of software?

Because it feels like there's some space for i) Something that can run on RPi for youth to learn programming and ii) a bi-monthly competition for HN, with rankings (most victories, smallest code with at least one win etc).

[+] bloometal|12 years ago|reply
Haven't had the chance to play around, but it looks clean and it's a nice concept.

Have you checked out https://www.hackerrank.com/ ? They initially started out with bot challenges as well.

[+] anilgulecha|12 years ago|reply
We still have bot challenges, and can easily host something like, with the added advantage of supporting a dozen other advantages, and a truck load of users.
[+] _g2lm|12 years ago|reply
This game is still pre-alpha. If anything breaks, please just post it here and I'll probably see it faster.
[+] cosarara97|12 years ago|reply
I started my first match. The page were I'm taken keeps saying the match is running and hasn't finished yet. I don't see what could take so much, but it's ok. The problem is that if robot A is fighting against B, in A's profile it'll say it's lost against B, and in B's profile it'll say it's lost against A. This is happening with all the robots in the warehouse, ("I", which is my robot, and the other two, who are fighting with each other).
[+] cosarara97|12 years ago|reply
I get an IndexError exception when starting a challenge right now.
[+] drblast|12 years ago|reply
I've been working on a similar concept off and on for a few years. To avoid all the security problems you're having, I've written a virtual machine that emulates a CPU and 64k of RAM. Instead of submitting code, you submit a 64k memory image of robot byte code.

Every turn of the game involves running a single cycle of the virtual CPU for every robot. Conceptually, the robots have radios and weapons that are controlled via memory-mapped IO in the virtual machine.

Things are slightly more complex than that because you don't want to give the first robot in the cycle an advantage (especially if they're firing lasers at each other), so you have to do each turn in multiple stages (run cycle, resolve real-world effects, update robot sensor state)

I'd LOVE to collaborate with a group of people to get something like this going because I think this would be a great way to introduce kids to programming at a machine level/electrical engineering. If anyone is interested, please send me an email. You can find my address in my profile.

[+] _g2lm|12 years ago|reply
That sounds like the much more fully developed version of what I have that I'd like to get to someday. I'm down for that collaboration thing. Let's get a group started.

The radios you mentioned are something I'd like to have someday. I think what makes games like these cool is the fact that your code controls an army of robots. It's more fun than just having two robots duel it out.

[+] gamegoblin|12 years ago|reply
I am working on a marginally similar concept (interface in browser, battles on server) game, but I chose Lua as the scripting language since it is much easier to sandbox. I could not find an effective way to sandbox python for sure, and I am still not 100% on Lua.
[+] _g2lm|12 years ago|reply
Yeah, I considered Lua but I was stubbornly in love with Python. Judging by the responses on here, I seem to have made a mistake.

Do you have a link to your project?

[+] L8D|12 years ago|reply
Hey, I think something that would make the experience a lot better would be to incorporate Ace editor into it, so you get a very well-featured editor incase you don’t have easy access to a better-than-<textarea> editor.
[+] _g2lm|12 years ago|reply
Thanks for the idea! Yeah, I'm thinking it would be ideal if eventually there could be some kind of IDE on the site with simulator and all (like on fightcodegame.com).
[+] Xephyrous|12 years ago|reply
Is there any way to access the map in the Robot class? For the default map, I can just hardcode it, but if you do intend for a robot to be playable on multiple maps, they'll need some way of knowing which squares are obstacles and spawn points. Without preserving state between turns, there's no way to figure that information out over time, either.
[+] _g2lm|12 years ago|reply
You can preserve state between turns; it's the same Robot object being called. Thanks for the suggestion though, I'll try to make that a feature.
[+] lemiffe|12 years ago|reply
Sad, I spent two days writing a program I was sure to beat all the rest. Now I won't be able to run it :( Hope you fix the "gaping security holes" soon (whilst keeping the code Python-based), as seriously, I love Python.
[+] _g2lm|12 years ago|reply
Sorry to hear that :( I'm working day and night at the moment to get this back up and running. Want me to shoot you an update when it's ready?
[+] _g2lm|12 years ago|reply
Sorry, the games weren't being run for a bit. I was only catching security exception and one game threw some other exception, which crashed the whole process. I restarted it and now it should be working.
[+] _g2lm|12 years ago|reply
Any suggestions for the language? The game and site are written in Python so that seemed most natural, plus it's a high-level language with a simple syntax. I could add more if people wanted though.
[+] wtracy|12 years ago|reply
It's a little obscure, but look at Embryo: http://docs.enlightenment.org/auto/embryo/

The interpreter was specifically designed with the assumption that Embryo scripts would come from untrusted sources. I believe that Enlightenment allows Embryo scripts to be embedded inside of theme files, for example.

[+] tarikjn|12 years ago|reply
Maybe Lua would be a good candidate? From the usages I have seen of Lua, it could match the use case.
[+] code_duck|12 years ago|reply
Make it language neutral - communicate by HTTP. That would also greatly reduce security concerns.
[+] asdddd333|12 years ago|reply
What is the advantage of trying to sandbox native python code?

Why not expose a RESTful API and let people implement in whatever language they want and not have to worry about malicious code?