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

Comments closed

Comments have been closed since this content was published more than 30 days ago, but if you'd like to send us feedback you can Contact Us.