Train your blackjack skills by playing against the dealer and learning the expected values of each move you make. Solved with closed form Dynamic Programming. Solver trained using Q Learning. Designed using the Curiously Recurring Template Pattern (CRTP), also known as F-bound Polymorphism. See video below for walk through.
Solvation.Walk.Through.mov
It's important to make the best move, even when you are in an unfavorable situation. Even if you make a suboptimal move and end up winning, or the optimal move and end up losing, it's important to refrain from being results-oriented and understand that these outcomes are results of variance, and that in the long term, the EV of the optimal move will always be realized.
- Can only split once
- Player blackjack pushes against dealer blackjack
- Dealer stands on soft 17
- No insurance (coming soon)
- You can only get blackjack on initial deal, not splits
- Player can double after split
- Player cannot act after reaching 21, whether soft or hard
- Run
dotnet runin/backendto start the backend atlocalhost:5256 - If a change was made that affects the logic of player/dealer interactions or probabilities, the command will fail, and you can view changes in
/Test/PlayerInteractions.txtor/Test/DealerInteractions.txt
- Run
npm startin/frontendto start the frontend atlocalhost:3000 - Install linting using
npm install eslint --save-devandnpm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier - Lint all files using
npx eslint . --fix