SYMBOL INDEX (78 symbols across 8 files) FILE: game.py class Game (line 6) | class Game: method __init__ (line 7) | def __init__(self, player_configs: List[Dict[str, str]]) -> None: method _create_deck (line 31) | def _create_deck(self) -> List[str]: method deal_cards (line 37) | def deal_cards(self) -> None: method choose_target_card (line 50) | def choose_target_card(self) -> None: method start_round_record (line 55) | def start_round_record(self) -> None: method is_valid_play (line 88) | def is_valid_play(self, cards: List[str]) -> bool: method find_next_player_with_cards (line 95) | def find_next_player_with_cards(self, start_idx: int) -> int: method perform_penalty (line 104) | def perform_penalty(self, player: Player) -> None: method reset_round (line 130) | def reset_round(self, record_shooter: bool) -> None: method check_victory (line 156) | def check_victory(self) -> bool: method check_other_players_no_cards (line 173) | def check_other_players_no_cards(self, current_player: Player) -> bool: method handle_play_cards (line 180) | def handle_play_cards(self, current_player: Player, next_player: Playe... method handle_challenge (line 221) | def handle_challenge(self, current_player: Player, next_player: Player... method handle_system_challenge (line 283) | def handle_system_challenge(self, current_player: Player) -> None: method handle_reflection (line 331) | def handle_reflection(self) -> None: method play_round (line 360) | def play_round(self) -> None: method start_game (line 391) | def start_game(self) -> None: FILE: game_analyze.py function analyze_game_records (line 5) | def analyze_game_records(folder_path): function print_statistics (line 121) | def print_statistics(stats, win_rates, game_count, player_names): FILE: game_record.py function generate_game_id (line 7) | def generate_game_id(): class PlayerInitialState (line 13) | class PlayerInitialState: method to_dict (line 20) | def to_dict(self) -> Dict: class PlayAction (line 29) | class PlayAction: method to_dict (line 43) | def to_dict(self) -> Dict: method update_challenge (line 58) | def update_challenge(self, was_challenged: bool, reason: str, result: ... class ShootingResult (line 66) | class ShootingResult: method to_dict (line 71) | def to_dict(self) -> Dict: class RoundRecord (line 78) | class RoundRecord: method to_dict (line 89) | def to_dict(self) -> Dict: method add_play_action (line 101) | def add_play_action(self, action: PlayAction) -> None: method get_last_action (line 105) | def get_last_action(self) -> Optional[PlayAction]: method set_shooting_result (line 109) | def set_shooting_result(self, result: ShootingResult) -> None: method get_latest_round_info (line 113) | def get_latest_round_info(self) -> str: method get_latest_round_actions (line 120) | def get_latest_round_actions(self, current_player: str, include_latest... method get_latest_play_behavior (line 166) | def get_latest_play_behavior(self) -> str: method get_latest_round_result (line 184) | def get_latest_round_result(self, current_player: str) -> str: method get_play_decision_info (line 207) | def get_play_decision_info(self, self_player: str, interacting_player:... method get_challenge_decision_info (line 224) | def get_challenge_decision_info(self, self_player: str, interacting_pl... class GameRecord (line 242) | class GameRecord: method __init__ (line 244) | def __init__(self): method to_dict (line 255) | def to_dict(self) -> Dict: method start_game (line 263) | def start_game(self, player_names: List[str]) -> None: method start_round (line 267) | def start_round(self, round_id: int, target_card: str, round_players: ... method record_play (line 279) | def record_play(self, player_name: str, played_cards: List[str], remai... method record_challenge (line 294) | def record_challenge(self, was_challenged: bool, reason: str = None, r... method record_shooting (line 302) | def record_shooting(self, shooter_name: str, bullet_hit: bool) -> None: method finish_game (line 310) | def finish_game(self, winner_name: str) -> None: method get_current_round (line 315) | def get_current_round(self) -> Optional[RoundRecord]: method get_latest_round_info (line 319) | def get_latest_round_info(self) -> Optional[str]: method get_latest_round_actions (line 324) | def get_latest_round_actions(self, current_player: str, include_latest... method get_latest_play_behavior (line 329) | def get_latest_play_behavior(self) -> Optional[str]: method get_latest_round_result (line 336) | def get_latest_round_result(self, current_player: str) -> Optional[str]: method get_play_decision_info (line 341) | def get_play_decision_info(self, self_player: str, interacting_player:... method get_challenge_decision_info (line 347) | def get_challenge_decision_info(self, self_player: str, interacting_pl... method auto_save (line 353) | def auto_save(self) -> None: FILE: json_convert.py function convert_game_record_to_chinese_text (line 4) | def convert_game_record_to_chinese_text(json_file_path): function process_game_records (line 107) | def process_game_records(input_directory, output_directory): FILE: llm_client.py class LLMClient (line 5) | class LLMClient: method __init__ (line 6) | def __init__(self, api_key=API_KEY, base_url=API_BASE_URL): method chat (line 13) | def chat(self, messages, model="deepseek-r1"): FILE: multi_game_runner.py class MultiGameRunner (line 5) | class MultiGameRunner: method __init__ (line 6) | def __init__(self, player_configs: List[Dict[str, str]], num_games: in... method run_games (line 16) | def run_games(self) -> None: function parse_arguments (line 27) | def parse_arguments(): FILE: player.py class Player (line 12) | class Player: method __init__ (line 13) | def __init__(self, name: str, model_name: str): method _read_file (line 31) | def _read_file(self, filepath: str) -> str: method print_status (line 40) | def print_status(self) -> None: method init_opinions (line 45) | def init_opinions(self, other_players: List["Player"]) -> None: method choose_cards_to_play (line 57) | def choose_cards_to_play(self, method decide_challenge (line 128) | def decide_challenge(self, method reflect (line 194) | def reflect(self, alive_players: List[str], round_base_info: str, roun... method process_penalty (line 245) | def process_penalty(self) -> bool: FILE: player_matchup_analyze.py function format_challenge_event (line 6) | def format_challenge_event(history_item, round_data, player_states, game... function extract_matchups (line 67) | def extract_matchups(game_data, game_id): function save_matchups_to_files (line 112) | def save_matchups_to_files(all_matchups, output_dir): function process_all_json_files (line 135) | def process_all_json_files(input_dir, output_dir):