Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/xy3/aliens
Alien Invasion Simulation
https://github.com/xy3/aliens
Last synced: 4 days ago
JSON representation
Alien Invasion Simulation
- Host: GitHub
- URL: https://github.com/xy3/aliens
- Owner: xy3
- License: apache-2.0
- Created: 2022-03-16T17:37:07.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-03-28T01:29:01.000Z (over 2 years ago)
- Last Synced: 2024-06-19T19:31:34.978Z (5 months ago)
- Language: Go
- Size: 75.2 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Alien Invasion
**Author: Theodore Coyne Morgan | March 2022**
This program simulates an alien invasion on a map of cities.
## Usage
Running the simulation:
```shell
git clone [email protected]:xy3/aliens.git
cd aliens
go run cmd/main.go -h
```When you run the program it will give you a summary of program arguments, flags and a brief description of the application.
For example:
```
Simulate an alien invasion using a configurable amount of aliens and a custom map.You may use the -h flag to view help for this program. To modify the default config,
modify 'config.json' in the program's working directory.
Author:
Theodore Coyne Morgan | March 2022Usage:
aliens [alien_count] [flags]Flags:
-n, --alien-names string text file with names of simulation aliens on each line (default "alien-names.txt")
-d, --debug debug mode to view more logging
-h, --help help for aliens
-m, --map string text file with cities and routes for the simulation (default "map.txt")
```An example use of this program is as follows:
```shell
go run cmd/main.go 10 -n alien-names.txt -m map.txt -d
# run the application using 10 random aliens
# -n: use the alien-names.txt file to choose names from
# -m: use map.txt to load in the world map
# -d: view debug logs
```The contents of the map file could be as follows:
```
Paris east=London south=Rome
Madrid north=London south=Milan east=Tokyo west=Rome
Tokyo north=Dublin west=Madrid east=Lisbon
Dubai west=Dublin south=Lisbon
Milan west=Amsterdam east=Naples south=Berlin
Budapest north=Amsterdam east=Berlin
```Each line defines a city with connections in each compass direction separated by a space.
## Configuration
If you wish to configure the application using a json file, you may do so by placing a file called `config.json` in the program's working directory.
It will also automatically be created after running the program once.
Here is an example value for the config:
```json
{
"MaxAlienMoves": 100000,
"MapFile": "map.txt",
"AlienNamesFile": "alien-names.txt",
"DebugMode": false
}
```The names should be self-explanatory.
## Running tests
From the repo root run:
```shell
go test ./... -cover
```## Example output
```go
INFO[0000] Loading config from: /Users/tcoynemorgan/go/src/github.com/xy3/aliens/config.json
INFO[0000] PARSED SIMULATION WORLD MAP
Amsterdam east=Milan south=Budapest
Berlin north=Milan west=Budapest
Budapest north=Amsterdam east=Berlin
Dubai south=Lisbon west=Dublin
Dublin east=Dubai south=Tokyo
Lisbon north=Dubai west=Tokyo
London south=Madrid west=Paris
Madrid north=London east=Tokyo south=Milan west=Rome
Milan east=Naples south=Berlin west=Amsterdam
Naples west=Milan
Paris east=London south=Rome
Rome north=Paris east=Madrid
Tokyo north=Dublin east=Lisbon west=Madrid
INFO[0000] CREATED 8 RANDOM ALIENS SUCCESSFULLY
INFO[0000] Deployed Galen to Rome
INFO[0000] Deployed Korben to Amsterdam
INFO[0000] Deployed Soval to Budapest
INFO[0000] Deployed Vaastot to Dublin
INFO[0000] Deployed Malcom to London
INFO[0000] Deployed Jaina to Madrid
INFO[0000] Deployed Tasha to Berlin
INFO[0000] Deployed Tharen to Dubai
INFO[0000] Madrid has been destroyed by Galen and Jaina destroyedCity=Madrid opponents="Galen vs Jaina"
INFO[0000] Milan has been destroyed by Tasha and Korben destroyedCity=Milan opponents="Tasha vs Korben"
INFO[0000] Tokyo has been destroyed by Vaastot and Tharen destroyedCity=Tokyo opponents="Vaastot vs Tharen"
INFO[0000] 10000 DAYS HAVE PASSED
INFO[0000] 10000 DAYS HAVE PASSED
INFO[0001] 10000 DAYS HAVE PASSED
INFO[0001] 10000 DAYS HAVE PASSED
INFO[0001] 10000 DAYS HAVE PASSED
INFO[0002] 10000 DAYS HAVE PASSED
INFO[0002] 10000 DAYS HAVE PASSED
INFO[0002] 10000 DAYS HAVE PASSED
INFO[0003] 10000 DAYS HAVE PASSED
INFO[0003] 10000 DAYS HAVE PASSED
INFO[0003] ==== SIMULATION RESULTS: ====
INFO[0003] Result daysPassed=107291 dead=6 exhausted=2 stuck=0
INFO[0003] The world map that still remains is:
Amsterdam east=Milan south=Budapest
Berlin north=Milan west=Budapest
Budapest north=Amsterdam east=Berlin
Dubai south=Lisbon west=Dublin
Dublin east=Dubai south=Tokyo
Lisbon north=Dubai west=Tokyo
London south=Madrid west=Paris
Naples west=Milan
Paris east=London south=Rome
Rome north=Paris east=Madrid
```## Possible design changes / future work
There are a number of various changes that could be made to make this task more exciting or efficient:
- Make each Alien run on its own go routine and handle interactions with the world map using locks
- Make the world map exist somewhere on the network and communicate with it remotely
- Display the world map via the console as a spacial representation of the input map
- Add results analysis
- Preemptively shutdown the simulation if Aliens are stuck in a loop## Challenges
- Managing mutability with the world map and pointers
- Writing unit tests for the simulation---
### Thanks for this task!
Email: [email protected]