#ifndef __CUSTOM_PLAYER__ #define __CUSTOM_PLAYER__ #include "player.h" #include "common.h" #include "board.h" #include #include class CustomPlayer : public IPlayer { private: Board board; // Game board to track state char player_box; // Character representing the player's boxes char player_line; // Character representing the player's lines Loc* empty_lines; // Array to store available line locations int empty_lines_count; // Number of available line locations public: CustomPlayer(); ~CustomPlayer(); // Initializes the player with board details and player symbols void Init(int dots_in_rows, int dots_in_cols, char player_box, char player_line) override; // Cleans up dynamically allocated memory void Close() override; // Returns the player information std::string PlayerInfo() override; // Called when a line is added to the board void EventAddLine(char bar, const Loc& loc) override; // Called when a box is completed on the board void EventAddBox(char box, const Loc& loc) override; // Determines the next move based on the current state of the board Loc SelectLineLocation() override; private: // Updates the list of available line locations void ListEmptyLines(); // Helper function to check if a line completes a box bool DoesLineCompleteBox(const Loc& loc); // Helper function to avoid giving the opponent a chance to complete a box bool WouldGiveOpponentBox(const Loc& loc); // Evaluate the best line location strategically Loc GetBestStrategicMove(); }; #endif