The fencing simulator is built with a modular architecture that separates concerns between action definitions, state management, simulation logic, and presentation.
classDiagram
class FencingBout {
-Fencer fencer1
-Fencer fencer2
-DistanceType distance
-Fencer current_fencer
-Fencer opponent_fencer
+simulate_bout()
+simulate_round()
-_update_distance()
-_calculate_modified_success_probability()
}
class EnhancedFencingBout {
-BoutPresenter presenter
-float start_time
-int points_to_win
+simulate_bout()
+simulate_round()
}
class BoutPresenter {
-list bout_log
+draw_piste()
+show_bout_header()
+show_score()
+show_action()
+show_distance_change()
+show_bout_summary()
}
class Fencer {
-string name
-float skill_level
-int score
-BladePosition blade_position
-bool has_preparation
-bool has_priority
-Dict available_actions
-Dict available_defenses
+choose_action()
-_calculate_action_weight()
}
class FencingAction {
-ActionType action_type
-Fencer fencer
-ActionProperties properties
-DistanceType distance
+can_execute()
+get_success_probability()
}
class ActionDatabase {
+get_all_actions()
}
class DefenseDatabase {
+get_all_defenses()
}
class DistanceManager {
+get_distance_properties()
}
class ActionProperties {
+string name
+float execution_time
+float base_success_rate
+Set valid_distances
+Set vulnerable_to
+Set effective_against
+bool preparation_required
+bool priority
+string description
}
class DefenseProperties {
+string name
+float execution_time
+float base_success_rate
+Set effective_against
+Set follow_up_actions
+string description
}
FencingBout *-- Fencer
EnhancedFencingBout --|> FencingBout
EnhancedFencingBout *-- BoutPresenter
Fencer *-- FencingAction
Fencer ..> ActionDatabase
Fencer ..> DefenseDatabase
Fencer ..> DistanceManager
FencingAction ..> ActionProperties
ActionDatabase ..> ActionProperties
DefenseDatabase ..> DefenseProperties
- Defines possible distances between fencers
- Values: OUT_OF_DISTANCE, LONG, MEDIUM, LUNGE, SHORT, INFIGHTING
- Defines all possible fencing actions
- Categories:
- Preparation Actions (ADVANCE, RETREAT, etc.)
- Simple Attacks (DIRECT_THRUST, DISENGAGE, etc.)
- Compound Attacks (ONE_TWO, DOUBLE_DISENGAGE, etc.)
- Counter Attacks (STOP_THRUST, TIME_THRUST, etc.)
- Blade Actions (BEAT, PRESSURE, etc.)
- Defines all possible defensive actions
- Categories:
- Simple Parries (PARRY_1 through PARRY_8)
- Circular Parries (COUNTER_SIXTE, COUNTER_QUARTE, etc.)
- Semi-circular Parries
- Compound Parries
- Defines possible blade positions
- Values: SIXTE, QUARTE, SEPTIME, OCTAVE, etc.
Properties for each action:
@dataclass
class ActionProperties:
name: str
execution_time: float
base_success_rate: float
valid_distances: Set[DistanceType]
vulnerable_to: Set[DefenseType]
effective_against: Set[DefenseType]
preparation_required: bool
priority: bool
description: strProperties for each defense:
@dataclass
class DefenseProperties:
name: str
execution_time: float
base_success_rate: float
effective_against: Set[ActionType]
follow_up_actions: Set[ActionType]
description: strRepresents a fencer in the bout:
- Maintains fencer state (score, position, etc.)
- Makes tactical decisions
- Manages available actions and defenses
Represents a specific action being executed:
- Calculates success probability
- Checks execution validity
- Applies modifiers based on context
Manages the bout simulation:
- Controls flow of the bout
- Updates scores and states
- Manages distance and timing
Extends FencingBout with improved visualization:
- Adds visual presentation
- Maintains bout statistics
- Provides detailed summaries
Central repository for action definitions:
- Defines all possible actions
- Maintains action properties
- Provides action lookup functionality
Central repository for defense definitions:
- Defines all possible defenses
- Maintains defense properties
- Provides defense lookup functionality
Manages distance-related properties:
- Defines valid actions for each distance
- Maintains distance transitions
- Provides distance-specific modifiers
Handles visual presentation of the bout:
- Draws ASCII representation of the piste
- Shows bout progress and statistics
- Manages color coding and formatting
- Maintains bout log for analysis
- Create fencers with skill levels
- Initialize bout with fencers
- Simulate bout:
- Update distance
- Choose actions
- Calculate success
- Update scores
- Present results and statistics
def main():
# Create fencers
fencer1 = Fencer("Alice", skill_level=0.7)
fencer2 = Fencer("Bob", skill_level=0.6)
# Create and simulate bout
bout = EnhancedFencingBout(fencer1, fencer2)
bout.simulate_bout()
if __name__ == "__main__":
main()To add new features:
- Add new enums for new action/defense types
- Define properties in respective databases
- Update success calculation logic if needed
- Add presentation elements for new features