The Goal

Don't get destroyed by the troll.

  Rules

If you have stones, shoot 1 or more of them.
If you don't have stones, shoot 0 exactly.

  Rule Evolution

The game isn't finished, but I'm not taking any more suggestions at this time, the path is now determined. There will be three leagues:

  1. single small map, cheating is tolerated, boss plays tit for tat (9/10) or cheats (1/10)
  2. rock troll and ice troll unlocked; multiple rounds; four maps available; no cheating; boss plays well but not perfect
  3. all races unlocked; map continuum, no boss but default AI doesn't lose.

For the WIP phase of this draft, I'll likely merge the last two leagues into one because we need data on what makes the games interesting.

You're still welcome to discuss the game on the forum or report a bug on the contribution's page.

Victory Condition
Your opponent loses.
Defeat Condition
  • The troll reaches your castle.
  • When no player has stones left, the troll is closer to your castle.

  I/O Protocol

This place used to read: “Just read the sample code. You can figure this out.” Here are the formalities for that other part of the audience.

Map Input

Your first line of input contains five space-separated parameters:

roadLength
distance between both castles, between 6 and 14.
initialStones
number of stones a castle starts the day with, between 0 and 50.
gameSeed
the game's seed. The game AIs use it to provide you with reproducible matches even when they use stochastic algorithms, and you're encouraged to do the same! See examples section below for simple ways to achieve that.
gameSide
which side you're on, as -1 or 1. It's not supposed to make a difference to how you handle the rest of the game, but you can XOR it to your gameSeed to have a (reproducible) random that doesn't necessarily draw when it plays against itself.
reserved
reserved for future use, ignore for now.
Turn Input

At each turn, you are provided with the following three space-separated values:

trollDistance
distance between the troll and your castle
stones
number of stones you have left
opponentStones
number of stones your opponent has left
Turn Output

After having received your turn input, you are to output a single integer stones: the number of stones you wish to throw at the troll.

You may optionally provide a message you wish your castle to yell at the troll or at your opponent. Just append it to your output, being sure to separate it with at least one space.

Timing Considerations

You're allowed the default SDK timings. I think it's one second for the first turn and 50 ms then, but don't quote me on this.

  Proper RNG seeding examples

Language Family Inspiration
JVM long mySecretSalt = 0x4242424242424242L;
Random random = new Random(gameSeed ^ gameSide ^ mySecretSalt);
C, C++, Perl… srand(gameSeed ^ gameSide ^ 0xdeadb33f);
std::srand(gameSeed ^ gameSide ^ 12345);
srand( $gameSeed ^ $gameSide ^ 0xCAFE_BABE );
Other Unachievable until proven otherwise

  Expert rules

In the lower leagues, the following maps are available and randomly yet extremely fairly (you wouldn't believe the effort that went into this) chosen uniformly at random among the following:

Road length Stones
6 15
6 30
14 30
14 50

You may also override them via game settings roadLength and initialStones, so long as you remember you won't be choosing them for ranking play.

  Change Log

I'm not maintaining the full changelog here anymore as the game's source repository is now publicly available. I'll just make note of the single latest change, so you can know how far behind you were lagging. Patches welcome, BTW.

This draft's last change is: not taking any more suggestions.

“Trolls simply detest the very sight of dwarves (uncooked).”
— J.R.R. Tolkien, The Hobbit

Based on an involuntary suggestion by Zaap38 on the #Fr channel. The original appears to be by Romain André-Lovichi .