#pragma once #include #include #include #include #include "network/NetData.h" class Client : public std::enable_shared_from_this { public: // 事件回调类型 using MoveCallback = std::function; using TurnCallback = std::function; Client(asio::io_context& ioContext); ~Client() = default; // 设置等待状态 void setShouldWait(bool shouldWait) { m_shouldWait = shouldWait; } void setCallbackes(MoveCallback onOpponentMove, TurnCallback onMyTurn, TurnCallback onGameStart); void connect(const std::string& host, int port, bool iAmFirst = true); void sentClickPosition(const NetData& data, bool isChangeTurn = false); void closeConnection(); private: asio::io_context& m_ioContext; // 添加引用 asio::ip::tcp::resolver m_resolver; asio::ip::tcp::socket m_socket; std::string m_host; int m_port; bool m_isHost = false; MoveCallback m_onOpponentMove; TurnCallback m_onMyTurn; TurnCallback m_onGameStart; char m_readBuffer[NetData::size()]; // 新增状态控制 bool m_shouldWait = false; // 是否应该等待对手 bool m_isWaiting = false; // 当前是否正在等待 bool m_isMyTurn = false; // 是否是我的回合 void onConnected(bool iAmFirst); void waitForOpponent(); void stopWaiting(); // 停止等待 void attemptReconnect(); // 尝试重新连接 };