Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

README
Turn-based capture the flag game for University of Helsinki AI Challenge course

Usage
=====

$ cabal configure
$ cabal build
$ ./dist/build/ctf/ctf config "(cat input_a.txt; cat >/dev/null)" "(cat input_b.txt; cat >/dev/null)"

$ (cd brains; javac *.java)
$ ./dist/build/ctf/ctf config "(cd brains; java RandomWalk)" "(cd brains; java Capturer)"

Example input_[ab].txt included.

Rules of the game
=================

The idea of the game is to capture the enemy's flag and bring it to
your home base. Killing enemy soldiers gives additional points.

The game is carried out on a 2d grid that contains walls, a base for
both teams, and a spawn point for both teams. The flags are initially
in the bases.

The game is turn-based. Both teams submit orders for their all of
their soldiers, and the orders are carried out simultaneously. During
a turn, a soldier can move (up, down, left or right) and/or throw a
grenade.

Grenades can only be thrown to a certain distance. A grenade thrown on
turn N explodes in the beginning of turn N+3. The grenade explosion
kills all soldiers in the 3x3 square centered on the grenade. Grenades
are not visible to the enemy. Grenades have a cooldown time, which
means that you have to wait a certain amount of time before the same
soldier can throw a new grenade.

A dead soldier respawns in the team's spawn point after being dead for
one round.

A flag is picked up by walking into the same square that it is in. You
can only pick up your enemy's flag. Once a flag gets moved to the base
of the opposing team, the opposing team gets points and the flag warps
back to its home base. If a soldier carrying a flag dies, the flag
stays where it is.

Brain->Engine communication format
==================================

This is what your brain should output on stdout:

<soldiername> <movementdirection> [<grenadecoord>]
<soldiername> <movementdirection> [<grenadecoord>]
...

movementdirection: either U (meaning y--), L (x--), D (y++), R (x++)
or S (stay still)
grenadecoord: optional and should be of the form (<x>,<y>)

Engine->Brain format
====================

This is what your brain gets from the engine on stdin.

AT THE START OF THE GAME:

<yourteam>
<map>
<emptyline>

yourteam: "A" or "B"
map: m lines of n characters representing an mxn tile map.

NB! The coordinate system of the map is as follows:
  - (0,0) is the first character on the first line
  - x increases along one line and
  - y increases with every line change.
    
The meanings of the tiles are:
  . -- empty
  # -- obstacle
  A,B -- spawn of team A, spawn of team B
  a,b -- base (flag) of team A, base of team B


FOR EACH ROUND:

<yourpoints> <enemypoints>
Flag <x> <y>
Soldier <name> <x> <y> <cooldown> <alive> <flag>
Soldier <name> <x> <y> <cooldown> <alive> <flag>
Soldier <name> <x> <y> <cooldown> <alive> <flag>
Grenade <x> <y> <countdown>
EnemyFlag <x> <y>
Enemy <name> <x> <y> <alive> <flag>
Enemy <name> <x> <y> <alive> <flag>
Enemy <name> <x> <y> <alive> <flag>
<an empty line signals the end>

x, y: integers
cooldown: integer. 0 means you can throw a grenade
countdown: integer
name: matched by the regex [A-Za-z]+
alive: either "True" or "False"
flag: either "No", "A", or "B"

The entries are always in this order. There number of Soldier, Enemy
and Grenade records can vary, but there will always be exactly one
Flag and exactly one EnemyFlag record.

Config format
=============

The first line should contain a Rules struct in Haskell format. The
fields are:

nRounds - number of rounds
nSoldiers - number of soldiers per team
pointsKill - how many points a kill awards
pointsCapture - how many points capturing a flag awards
grenadeRange - the range of a grenade
grenadeCooldown - how long a soldier has to wait before throwing a new grenade

The rest of the lines should describe the game map, one character per
tile, rows ended by newlines. All lines should be of equal length. The
meanings of the characters are:

'.' - empty
'#' - obstacle
'A' - spawn of team A
'B' - spawn of team B
'a' - flag of team A
'b' - flag of team B

See the provided file "config" for an example.

Engine output
=============

The stdout of the engine contains a log of game events. The last line
on stdout is either the score in the format "Final score: A 0 - B 101"
or "<teamname> failed" if a brain terminates prematurely.

The stderr of the engine contains the stderrs of the two brains, each
line labeled by the team of the brain that produced it.

TODO
====

- timeouts for reading commands?
Something went wrong with that request. Please try again.