Maximilian Keßler
5c4a2bb4f7
Instead of storing a rational for evey game state, we just store how many of the factorial(draw pile size) many game states can be won. This allows us to save only one 64-bit integer per game state instead of two and thus reduces memory consumption of the program significantly. Also, this makes some computations a bit easier, since we do not have to normalize when recursing - we can just add the numbe of winnable states for each possible draw. On the other hand, this means that upon lookup, we have to normalize the stored values again to retrieve the probabilities. In particular, one needs to know what the draw pile size of the game state is in order to interpret the value of the state. |
||
---|---|---|
cmake-modules | ||
include | ||
src | ||
test | ||
.gitignore | ||
CMakeLists.txt | ||
LICENSE | ||
README.md |
Endgame-Analyzer
This is a dynamic program written in C++ to solve Hanabi endgames. Some optimizations are performed, but it is not particularly well-written at the moment and could also use some code cleanup.
As of now, you can run the executable with an id from a hanab.live game and a turn number and the winning percentage for the corresponding game state with optimum play will be calculated.
Here, optimum play refers to the assumption that everbody knows their cards, but not the draw pile.
For example, if the output of the program is 1, then this means that even if an evil adversary is allowed to pick the next card in the deck each time a card is drawn, there is still a strategy that guarantees a win.
Compilation
The build uses CMake. Additionally, you need the following libraries:
- boost: For some faster containers and JSON parsing
- cpr: For easy requests (to download games from hanab.live
- GNU readline: For the command-line interface. Refer to the corresponding pages for installation instructions. On Linux distributions, readline is probably already installed.
Note that the libraries are all FOSS software and GPL-compatible. For installation help, see below.
Now, building the project is quite easy (this assumes you have installed above libraries system-wide):
cmake -DCMAKE_BUILD_TYPE=RELEASE . // Release build recommended for performance, unless you want to develop
make // Rerun this every time you change sources
Installing the libraries
I can't provide information for all distributions, but in general it should be like the following:
Linux systems:
boost
andcmake
: should be available as a system package via your package manager.readline
should be installed already, otherwise try your package manager as well.cpr
is a bit more complicated:- On Arch, there is a package in the AUR.
- On Fedora, there is also a package via rpm.
- There might be packages for other distributions, check out the CPR project on Github.
- If there is no package available for your distribution, see [Installing cpr as a local CMake dependency](# Installing cpr as a local CMake dependency).
Mac OS:
- I recommend installing packages with Homebrew.
- So
brew install boost cpr readline cmake
should do the job.
Windows:
- Currently, I have no idea regarding windows, sorry for that.
Installing cpr as a local CMake dependency
- There is also the option to install
cpr
directly as a dependency throughCMake
. For this, inCMakeLists.txt
, replace the line
with the linesfind_package(cpr)
You might need to replace theinclude(FetchContent) FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git GIT_TAG 2553fc41450301cd09a9271c8d2c3e0cf3546b73) FetchContent_MakeAvailable(cpr)
GIT_TAG
with the latest release tag from Github, but the above should usually work. You can find details on this installation method on the cpr github page as well.
Usage
# ./endgame-analyzer (GAME_ID | GAME_FILE) TURN
where
GAME_ID
is a game from hanab.live.GAME_FILE
is a path to a file containing the game as JSON in the hanab.live format.TURN
specifies the turn of the game state to analyze. Turn 1 is the state before actions have been taken.
Be cautious about specifying too low turn counts, your program will eventually run out of memory. Typically, turn counts where roughly 8 cards are still in the draw pile are reasonably fast, but running times depend heavily on the exact game state you want to analyze.
License
This is GPLv3-licensed. See LICENSE for details.