Files
OnlineRpg/include/client/GameClient.h
2025-10-26 20:44:58 +08:00

131 lines
2.2 KiB
C++

#pragma once
#include "SocketWrapper.h"
#include <string>
#include <thread>
#include <atomic>
#include <memory>
/**
* @brief 游戏客户端
*
* 技术点:
* 1. STL - std::thread (多线程)
* 2. 网络编程 - Socket Client
*
* 设计:
* - 主线程: 处理用户输入和发送
* - 接收线程: 处理服务器消息接收和显示
*/
class GameClient {
private:
std::string m_serverAddress;
int m_serverPort;
SocketWrapper m_socket;
std::thread m_recvThread;
std::atomic<bool> m_isRunning;
std::atomic<bool> m_isConnected;
std::atomic<bool> m_isAuthenticated;
std::string m_username;
std::atomic<bool> m_inBattle;
std::atomic<bool> m_waitingForTurn;
public:
/**
* @brief 构造函数
*/
GameClient(const std::string& serverAddress, int serverPort);
/**
* @brief 析构函数
*/
~GameClient();
/**
* @brief 连接到服务器
*/
bool connect();
/**
* @brief 断开连接
*/
void disconnect();
/**
* @brief 运行客户端主循环
*/
void run();
/**
* @brief 发送消息
*/
bool sendMessage(const std::string& message);
private:
/**
* @brief 接收线程主循环
*/
void recvLoop();
/**
* @brief 处理服务器消息
*/
void handleServerMessage(const std::string& message);
/**
* @brief 显示主菜单
*/
void showMainMenu();
/**
* @brief 显示大厅菜单
*/
void showLobbyMenu();
/**
* @brief 显示战斗菜单
*/
void showBattleMenu();
/**
* @brief 处理注册
*/
void handleRegister();
/**
* @brief 处理登录
*/
void handleLogin();
/**
* @brief 处理大厅输入
*/
void handleLobbyInput(const std::string& input);
/**
* @brief 处理战斗输入
*/
void handleBattleInput(const std::string& input);
/**
* @brief 显示提示符
*/
void showPrompt();
/**
* @brief 清屏
*/
void clearScreen();
/**
* @brief 打印分隔线
*/
void printSeparator();
/**
* @brief 打印标题
*/
void printTitle(const std::string& title);
};