A Dominion simulator in Haskell
Haskell Makefile
Permalink
Failed to load latest commit information.
spec
src
.gitignore
.travis.yml travis-ci should only run on master Feb 6, 2014
LICENSE
Makefile
README.md
TODOS.markdown
dominion.cabal
stack.yaml I do want to check this in Dec 8, 2016

README.md

Dominion

Build Status

An easy to use Dominion simulator! It allows you to test competing strategies and see what works best.

Screencast

Screenshot

Usage:

import Dominion
import Dominion.Strategies

main = dominion ["adit" `uses` bigMoney, "maggie" `uses` bigMoneySmithy]

Or you can pass in options:

players = ["adit" `uses` bigMoney, "maggie" `uses` bigMoneySmithy]
main = dominionWithOpts [Log True, Iterations 1] players

Strategies

Here's a simple strategy, the "big money" strategy:

bigMoney playerId = playerId `buysByPreference` [province,
                                                 gold,
                                                 duchy,
                                                 silver,
                                                 copper]

The big money strategy is simple: buy the most expensive victory or treasure card you can, and repeat.

bigMoneySmithy playerId = do
    playerId `plays` smithy
    playerId `buysByPreference` [province,
                                 gold,
                                 duchy,
                                 smithy,
                                 silver,
                                 copper]

It's just like big money, except now the player buys up smithys too. And the player plays a smithy whenever possible. So now we can compare Big Money vs Big Money + Smithy. And the results are:

Out of 5000 games:

player adit won 1867 times using "big money"
player maggie won 3133 times using "big money + smithy"

Just as a control, lets use the same strategy with both players:

player adit won 2444 times
player maggie won 2556 times

So clearly, adding the smithy to big money makes a big difference!

Followup actions

Some action cards have a followup action. For example, if you use throne room, you can pick another card and play it twice. Here's how that looks:

throneRoom playerId = do
    playerId `plays` throneRoom `with` (ThroneRoom market)

And of course you can play throne room on throne room:

multiThroneRoom playerId = do
    playerId `plays` throneRoom `with` (ThroneRoom throneRoom) `withMulti` [ThroneRoom market,
                                                                            ThroneRoom market]

Documentation

See the full documentation on Hackage.