No description
| .claude | ||
| .direnv | ||
| src/knife_fight | ||
| target | ||
| .envrc | ||
| .lein-repl-history | ||
| flake.lock | ||
| flake.nix | ||
| project.clj | ||
| README.md | ||
Knife Fight
A terminal-based card game where lower cards win and players bleed to death. Built with Clojure and Lanterna.
Game Rules
Objective
Force your opponent to bleed out (run out of deck cards).
How to Play
-
Setup: Each player starts with a deck of cards (configurable, default is 2 suits = 27 cards) and draws 3 cards to their hand.
-
Each Round:
- Both players play one card simultaneously
- Lower card wins (Ace=1 is the lowest, highest numbered cards lose)
- Winner's card goes to loser's damage pile
- Both players draw back to 3 cards
- Bleeding: Each player discards cards from their deck equal to (damage pile sum ÷ 3, rounded up)
-
Winning: When a player runs out of deck cards (bleeds to death), they lose.
Face Card Abilities
- Jack (Parry): Nullifies the round completely - no damage dealt to either player
- Queen (Field Dressing): Swap a card from your damage pile with opponent's played card (not yet implemented)
- King (Feint): After cards are revealed, play a second card from your hand (not yet implemented)
- Joker (Reflect): Reverse damage direction - opponent's card goes to their own damage pile
Deck Configuration
You can configure the number of suits per player (1-4):
- 1 suit: 14 cards per player (quick game)
- 2 suits: 27 cards per player (standard game) [Default]
- 3 suits: 40 cards per player (longer game)
- 4 suits: 54 cards per player (maximum length game)
Each suit includes:
- 13 numbered cards (Ace through King)
- 1 Joker
Installation & Running
Prerequisites
- Leiningen (already in your Nix flake)
- Clojure (already in your Nix flake)
- A terminal with at least 80x24 size
Running the Game
cd /Users/tepichord/Projects/knife-fight
lein run
Building a Standalone JAR
lein uberjar
java -jar target/uberjar/knife-fight-0.1.0-SNAPSHOT-standalone.jar
Game Controls
Main Menu
1- Start a new game2- Configure deck size3- View help/rules4- Quit
During Gameplay
1,2,3- Select card from your hand (numbered left to right)Q- Quit to main menu
Configuration Screen
1,2,3,4- Select number of suits per playerQ- Return to main menu
Game Architecture
The game follows functional programming principles with immutable data structures:
- cards.clj: Card data structures and operations
- deck.clj: Deck generation and manipulation (configurable sizes)
- game.clj: Game state management
- config.clj: Configuration system for deck sizes
- rules.clj: Game mechanics (damage, bleeding, abilities)
- ai.clj: AI opponent strategy
- ui/: Terminal UI layer
- screen.clj: Lanterna screen management
- menu.clj: Main menu and configuration screens
- render.clj: Game state rendering
- input.clj: Keyboard input handling
- core.clj: Main menu loop and game orchestration
AI Strategy
The AI uses a scoring system to select cards:
- Prioritizes medium-value cards (4-7) for consistent wins
- Saves very low cards (Ace, 2, 3) for critical moments
- Uses Jokers strategically when opponent has high damage (>15)
- Adapts strategy based on hand size and opponent's damage
Development
REPL
lein repl
Checking Code
lein check
Known Limitations
- Queen (Field Dressing) ability requires UI selection - simplified in current version
- King (Feint) ability requires playing a second card - not yet implemented
- No save/load functionality
- No multiplayer support (only Human vs AI)
Future Enhancements
- Full implementation of Queen and King abilities
- Save/load game state
- Statistics tracking
- Multiple AI difficulty levels
- Tournament mode (best of N games)
- Network multiplayer
- Replay system
License
EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0