Alien Invasion simulator in Go

This is a deterministic simulator written in Go to simulate an alien invasion.

Build & Run

To run the alien-invasion have a working Golang environment installed. If you are all set, just run the following:

$ go run main.go

This will run the simulation using all defaults and current Unix time as a random source of entropy.

To list all cli options ask for help:

$ go run main.go -help
Usage of /main:
  -aliens int
        number of aliens invading (default 10)
  -entropy int
        random number used as entropy seed
  -intel string
        a file used to identify aliens (default "./test/aliens.txt")
  -iterations int
        number of iterations (default 10000)
  -simulation string
        name hashed and used as entropy seed
  -world string
        a file used as world map input (default "./test/example.txt")

You can run the specific simulation by providing entropy:

$ go run main.go -aliens 4 -entropy 123

Or provide a simulation name (key) from which entropy will be extracted (sha265):

$ go run main.go -aliens 4 -iterations 100 -world "./test/example_2.txt" -simulation "Battle for Cosmos"

Reuse the same entropy (or simulation name) to run exactly the same simulation over again. This next command will run the same "Battle for Cosmos" simulation but this time using provided entropy:

$ go run main.go -aliens 4 -iterations 100 -world "./test/example_2.txt" -entropy -7645731219066279255

Implementation

The simulation is implemented as a deterministic state machine. While Agents make random decisions on every move, that decision is deterministic and is generated using a pseudorandom number generator. A deterministic application like the one implemented here can be deployed as a blockchain smart contract. Using a platform like Cosmos one could make a deterministic game that solely depends on the provided entropy as an input parameter.

Random numbers

While completely random is not really possible, we still can have pseudorandom numbers on computers.

The math/rand package provided by the Go Standard Library gives us pseudo-random number generators (PRNG), also called deterministic random bit generators.

As with all pseudo number generators, any number generated through math/rand is not really random by default, as being deterministic it will always print the same value each time.

Notice: Logs are not deterministic at this point. Nondeterminism is caused by iterating over a hash map in Go.

State

We use flags map for Agents and Nodes to avoid deleting and removing information from the state graph. This can enable us to implement another simulation with slightly different rules. For example, this other implementation could:

  • resurrect Aliens at some point
  • allow Aliens to teleport if trapped in a City
  • rebuild City when Aliens are gone
  • search roads for distant connected undestroyed City to move to (not only next-door-neighbor)

Next steps

  • More map examples
  • More unit tests
  • Deterministic I/O tests
  • Custom logger and log levels
  • Circle CI tests on commit
  • Codecov test coverage report

Tests

To run the tests for alien-invasion run the following from the root of the repo:

$ go test ./... -v