Building Battling Bots with DumbBots.Net

Sign in to queue


Today's project was one that I just happened across and I thought kind of cool, I mean what's more fun than programming bots to hunt down a kill each other? (Answer: Playing with the source of the project that lets you program bots to hunt down and kill each other)


Project Description
A simple programming game that allows editing of scripts while the game is still being run. The scripts control the AI of some combatants in a Quake III-style game.

The game can be used as a tool to get people interested in coding, or simply as a competitive game between different code.

Some extensibility provided to create a simple sandbox environment. A "director" AI can be programmed to alter the dynamics of the game for a customizable experience.

Scripts are currently written in C#.


  • Program scripts while game is in play to immediately view results
  • Scintilla.NET code editor
  • Basic "intellisense" to quickly find method needed
  • "Director" AI allows a customizable experience - change the game rules, load custom models, etc
  • Basic messaging system allows interaction between different AI's
  • Powered by Irrlicht engine


The arena is 3D which is kind of cool too;



Included is a simple map editor;


Here's the Solution;


So how does it work? Here's an abbreviated view of the code path that handles the runtime code compiling.

private void btnCompileTeam1_Click(object sender, EventArgs e)
private void CompileScript(Team team)
    ScriptCompiler sc = new ScriptCompiler();
    List<string> dllList = new List<string>();

    //TODO: need to reimplement referencing assemblies

    if (team == Team.Director)
        rchTxtBoxErrors.Text = sc.CompileDirectorScript("C#", _txtCode.Text, dllList);
        rchTxtBoxErrors.Text = sc.CompileScript("C#", _txtCode.Text, (int)team, dllList);

internal string CompileScript(string language, string code, string fileName, List<string> dllList)
    CodeDomProvider cdp = CodeDomProvider.CreateProvider(language);
    CompilerParameters cp = new CompilerParameters();

    cp.OutputAssembly = fileName;
    for (int i = 0; i < dllList.Count; i++)
        cp.ReferencedAssemblies.Add(dllList[i]); //Add external DLLs mentioned in user script

    cp.WarningLevel = 1;

    cp.CompilerOptions = "/target:library /optimize";
    cp.GenerateExecutable = false;
    cp.GenerateInMemory = false;

    System.CodeDom.Compiler.TempFileCollection tfc = new TempFileCollection(AppDomain.CurrentDomain.BaseDirectory, false);
    CompilerResults cr = new CompilerResults(tfc);

    cr = cdp.CompileAssemblyFromSource(cp, code);

    StringBuilder sb = new StringBuilder();

    if (cr.Errors.Count > 0)
        foreach (CompilerError ce in cr.Errors)
            sb.AppendLine(ce.ErrorNumber + ": " + ce.ErrorText + " Line: " + ce.Line);
        sb.AppendLine("Build succeeded");

    return sb.ToString();

internal static void ReflectScript(Team team)
          byte[] rawAssembly = LoadFile(String.Format("AI\\AIscript{0}.dll", (int)team));
          Assembly assembly = AppDomain.CurrentDomain.Load(rawAssembly);

          TeamScripts[team] = (ICommand)assembly.CreateInstance("Scripting.AIScript");

          assembly = null;
          rawAssembly = null;
      catch (Exception)
          TeamScripts[team] = null;

If you've ever thought about building bots that battle, interested in runtime code compiling or just looking for something fun to play with, here you go...

The Discussion

Add Your 2 Cents