基于QT实现的宠物小精灵人机对战游戏

Tempted

发布日期: 2018-11-06 18:59:59 浏览量: 1314
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

1 依赖环境

  • C++ 11 Support

    • MSVC >= 14 (2015)
    • GCC >= 5
  • SQLite 3 (include in ./include)

  • QT5

2 特性

  • 使用C++11编写

  • 实现了简单反射,可以通过GetClassByName通过字符串获得相应类的对象

  • 使用反射工厂来创建Pokemon对象,配合多态大大简化代码并提供扩展性

  • 通过宏注入获得类元数据,实现ORM(对象关系模型)封装SQLite数据库操作,运用访问者模式来自动生成SQL语句

  • 使用JSON提高协议的可扩展性

  • 良好的人机交互界面,支持多用户同时在线

  • 健全的错误恢复处理

3 界面设计

登陆及注册

游戏主界面

用户列表

抓取

背包

对战

实时对战(动画)

战斗结束

4 框架设计

5 协议设计

游戏通讯协议基于json,以达到良好的扩展性

登录

  1. {"define" : LOG_IN, "username" : username, "password" : password}
  2. {"define" : LOG_IN_SUCCESS/LOG_IN_FAIL_WP/LOG_IN_FAIL_AO/SERVER_ERROR}

注册

  1. {"define" : SIGN_UP, "username" : username, "password" : password}
  2. {"define" : SIGN_UP_SUCCESS/SIGN_UP_FAIL/SERVER_ERROR}

获取在线用户列表

  1. {"define" : GET_ONLINE_LIST}
  2. {"define" : QUERY_SUCCESS/SERVER_ERROR, "info" : [list]}

获取离线用户列表

  1. {"define" : GET_OFFLINE_LIST}
  2. {"define" : QUERY_SUCCESS/SERVER_ERROR, "info" : [list]}

获取用户背包内容

  1. {"define" : GET_USER_BAG, "username" : username}
  2. {"define" : QUERY_SUCCESS,
  3. "info" : [{"id" : id,
  4. "name" : name,
  5. "level" : level,
  6. "exp" : exp,
  7. "type" : type,
  8. "atttackPoint" : ap,
  9. "defensePoint" : dp,
  10. "healthPoint" : hp,
  11. "attackFrequence" : af,
  12. "property" : property
  13. }]}
  14. {"define" : SERVER_ERROR}

获取用户成就

  1. {"define" : GET_USER_ACH}
  2. {"define" : QUERY_SUCCESS,
  3. "rate" : rate,
  4. "sum_ach" : sum ,
  5. "advance_ach" : advance_sum
  6. }
  7. {"define" : SERVER_ERROR}

获取对战精灵列表

  1. {"define" : GET_POKEMON_LIST}
  2. {"define" : QUERY_SUCCESS, "info" : [list]}
  3. {"define" : SERVER_ERROR}

获取对战精灵信息

  1. {"define" : GET_POKEMON_INFO}
  2. {"define" : QUERY_SUCCESS,
  3. "info" : {"name" : name,
  4. "type" : type,
  5. "attackPoint" : ap,
  6. "defensePoint" : dp,
  7. "healthPoint" : hp,
  8. "attackFrequence" : af,
  9. "property" : property,
  10. "exp" : exp}
  11. }
  12. {"define" : SERVER_ERROR}

反馈对战胜利

  1. {"define" : GAME_WIN,
  2. "get" : acquire_pokemon, #对战胜利小精灵的名字
  3. "name" : user_pokemon, #用户对战小精灵的名字
  4. "type": type,
  5. "attackPoint" : ap,
  6. "defensePoint" : dp,
  7. "healthPoint" : hp,
  8. "attackFrequence" : af,
  9. "property" : property,
  10. "level" : level,
  11. "exp" : exp,
  12. "id" : id #小精灵信息在数据库中的唯一id
  13. }
  14. {"define" : ACCEPT/SERVER_ERROR}

反馈对战失败

  1. {"define" : GAME_LOSE, "isLose" : true/false}
  2. if isLose == true:
  3. {"define" : ACCEPT,
  4. "info" : [{"id" : id,
  5. "name" : name,
  6. "level" : level,
  7. "exp" : exp,
  8. "type" : type,
  9. "atttackPoint" : ap,
  10. "defensePoint" : dp,
  11. "healthPoint" : hp,
  12. "attackFrequence" : af,
  13. "property" : property
  14. }]
  15. }
  16. else
  17. {"define" : ACCEPT/SERVER_ERROR}

反馈损失小精灵

  1. {"define" : LOSE_POKEMON, "id" : id}
  2. {"define" : ACCEPT/SERVER_ERROR}

随机获得一个新小精灵

  1. {"define" : GET_ONE_POKEMON}
  2. {"define" : ACCEPT, "name" : name}
  3. {"define" : SERVERE_ERROR}

6 结构说明

6.1 通用

6.1.1 Connor_Socket::Socket(socket.h)

完成WSA最基本的初始化,加载库文件,以及释放相关资源
  1. #define DEFAULT_BUFLEN 10000 // Socket传输缓冲区大小
  2. #define CLIENT_PORT 5150 // 客户端连接端口
  3. #define SERVER_PORT 2222 // 服务器监听端口
  4. // 单机模式下都指向localhost
  5. #define CLIENT_ADDR "127.0.0.1" // 客户端IP地址
  6. #define SERVER_ADDR "127.0.0.1" // 服务器IP地址

6.1.2 Reflector(reflector.h)

反射类,维护类名与之对应构造函数的map

定义

  1. // 定义生成Pokemon对象的函数指针
  2. typedef Pokemon* (*PTRCreateObject)(std::string, unsigned int, unsigned int, Attribute, int);
  3. // 新建全局函数以new类对象,模拟反射
  4. #define REGISTER(_CLASS_NAME_) \
  5. _CLASS_NAME_* Create##_CLASS_NAME_(std::string name, unsigned int level,\
  6. unsigned int exp, Attribute attribute, int id) \
  7. { \
  8. return new _CLASS_NAME_(name, level, exp, attribute, id); \
  9. } \
  10. \
  11. RegisterAction createRegister##_CLASS_NAME_( \
  12. #_CLASS_NAME_, (PTRCreateObject)Create##_CLASS_NAME_)

成员函数

  1. // 使用单例模式,获得Reflector实例
  2. // @return:
  3. // Reflector唯一对象的引用
  4. static Reflector& GetInstance()
  5. {
  6. static Reflector instance;
  7. return instance;
  8. }
  9. // 通过类名获得类的构造函数
  10. // @param:
  11. // className 需要获得的类名
  12. // @return:
  13. // 生成相应类的函数指针
  14. PTRCreateObject GetClassByName(std::string className);
  15. // 将类名和构造函数注册到map中
  16. // @param:
  17. // className 需要注册的类名
  18. // method 生成相应类的函数指针
  19. void RegistClass(std::string className, PTRCreateObject method);
  20. // 隐藏Reflector的构造函数,单例模式只运行使用GetInstance获得Reflector唯一实例
  21. Reflector() {}

成员变量

  1. // 类名与之对应构造函数的map
  2. std::map<std::string, PTRCreateObject> _classMap;

6.1.3 RegisterAction(reflector.h)

注册行为类,通过构造函数以实现自动向Reflector注册

成员函数

  1. // 将类与回调函数注册到Reflector
  2. // @param:
  3. // className 类名
  4. // PtrCreatFn 创建相应类的回调函数
  5. RegisterAction(std::string className,PTRCreateObject PtrCreateFn);

6.1.4 PokemonFactory(pokemonfactory.h)

产生小精灵对象的工厂,通过多态获得小精灵对象

成员函数

  1. // 产生对战电脑的小精灵实体
  2. // @param:
  3. // name 对战小精灵的名字
  4. // client 与服务器连接的socket指针
  5. // @return:
  6. // 小精灵对象指针
  7. static Pokemon* CreateComputer(std::string name, Connor_Socket::Client *client);
  8. // 产生用户的小精灵实体
  9. // @param:
  10. // str 用户小精灵的序列化数据,包含各种属性
  11. // @return:
  12. // 小精灵对象指针
  13. static Pokemon* CreateUser(std::string str);

6.1.5 Pokemon(pokemon.h)

产生小精灵对象的工厂,通过多态获得小精灵对象

定义

  1. // 获得对象运行时多态类型
  2. // 多编译器支持
  3. #ifdef __GNUC__
  4. #include <cxxabi.h>
  5. #define GET_CLASS_TYPE(_OBJECT_) \
  6. std::string(abi::__cxa_demangle(typeid(_OBJECT_).name(), nullptr, nullptr, nullptr))
  7. #elif _MSC_VER && !__INTEL_COMPILER
  8. #include <typeinfo>
  9. #define GET_CLASS_NAME(_OBJECT_) \
  10. std::string(typeid(_OBJECT_).name())
  11. #define GET_CLASS_TYPE(_OBJECT_) \
  12. GET_CLASS_NAME(_OBJECT_).substr(GET_CLASS_NAME(_OBJECT_).find("class ") + 6, \
  13. GET_CLASS_NAME(_OBJECT_).length() - 6)
  14. #else
  15. #define GET_CLASS_TYPE(_OBJECT_) \
  16. std::string(typeid(_OBJECT_).name())
  17. #endif
  18. #define CRTICAL_RATE 0.1 // 暴击概率
  19. #define MISS_RATE 0.2 // 闪避概率
  20. // 小精灵主属性类别
  21. enum class Type
  22. {
  23. Strength, //高攻击
  24. Tanker, //高生命值
  25. Defensive, //高防御
  26. Swift, //低攻击间隔
  27. };
  28. // 小精灵属性
  29. typedef struct struct_Attribute
  30. {
  31. Type type; // 小精灵主属性类型
  32. int attackPoint; // 攻击力
  33. int defensePoint; // 防御力
  34. int healthPoint; // 生命值
  35. int attackFrequence; // 攻击间隔
  36. }Attribute;
  37. // 经验值列表
  38. const int LEVEL_EXP_LIST[15] = {0, 100, 250, 500, 800, 1200, 1800, 2500,
  39. 3300, 4500, 6000, 7000, 8000, 9000, 10000};

成员函数

  1. // 各种获取属性函数
  2. Type GetType() const { return _attribute.type; }
  3. std::string GetName() const { return _name; }
  4. int GetLevel() const { return _level; }
  5. unsigned long GetExp() const { return _exp; }
  6. int GetAttackPoint() const { return _attribute.attackPoint; }
  7. int GetHealthPoint() const { return _attribute.healthPoint; }
  8. int GetDefensePoint() const { return _attribute.defensePoint; }
  9. int GetAttackFrequence() const { return _attribute.attackFrequence; }
  10. int GetHp() const { return _hp; }
  11. int GetId() const { return _id; }
  12. // 判断是否最近一次攻击为暴击
  13. bool IsCritical() const { return _critical; }
  14. // 小精灵受伤函数
  15. // 小精灵真正受到的伤害 = (damage-小精灵的防御值) * 随机系数
  16. // 同时有几率闪避
  17. // @param:
  18. // damage 受到的伤害
  19. // @return:
  20. // 小精灵是否死亡
  21. virtual bool Hurt(int damage);
  22. // 小精灵攻击函数
  23. // @param:
  24. // opPokemon 攻击小精灵的指针
  25. // @return:
  26. // 攻击造成的伤害
  27. virtual int Attack(Pokemon * opPokemon) = 0;
  28. // 根据获得的经验增加经验值并自动升级,返回是否升级
  29. // @param:
  30. // exp 小精灵获得的经验值
  31. // @return:
  32. // 小精灵是否升级
  33. virtual bool Upgrade(int exp);
  34. // 小精灵升级时各属性的成长
  35. // @param:
  36. // master 小精灵主属性
  37. virtual void Grow(int *master);
  38. // 在攻击、防御、升级时有一定的随机性
  39. // @return:
  40. // 产生随机的比例系数(0~1)
  41. virtual double Bonus();

成员变量

  1. // 精灵名字
  2. std::string _name;
  3. // 等级
  4. int _level;
  5. // 经验值
  6. unsigned long _exp;
  7. // 各种属性
  8. Attribute _attribute;
  9. // 对战时的实时血量
  10. int _hp;
  11. // 在数据库中对应的唯一id
  12. int _id;
  13. // 暂存最近一次攻击是否暴击
  14. bool _critical;

6.2 客户端

6.2.1 Connor_Socket::Client(client.h)

继承于Socket类,封装winsock,管理socket的发送与接受信息

成员函数

  1. // 默认构造函数
  2. // 委托到带名字的构造函数,传参为UNKOWN
  3. Client() : Client("UNKNOWN") { }
  4. // 带名字的构造函数,表明与该socket绑定的用户名
  5. // @param:
  6. // name 用户名
  7. Client(string name);
  8. // 注册、登陆时使用的函数
  9. // 建立与服务器的连接
  10. // @param:
  11. // requestInfo json序列化后请求信息
  12. // @return:
  13. // json序列化后的返回信息
  14. // @exception:
  15. // Server关闭连接/发送失败,抛出 runtime_error;
  16. std::string Connect(std::string requestInfo);
  17. // 建立连接后使用此函数向服务器发送数据
  18. // @param:
  19. // requestInfo json序列化后请求信息
  20. // @return:
  21. // json序列化后的返回信息
  22. // @exception:
  23. // Server关闭连接/发送失败,抛出 runtime_error;
  24. std::string Send(std::string requestInfo);
  25. // 关闭与服务器的连接
  26. void Close();
  27. // 获取该client绑定的用户名
  28. // @return:
  29. // 用户名
  30. std::string GetUserName();

成员变量

  1. // 与服务器通信的socket
  2. SOCKET _connectSocket;
  3. // 服务器的地址信息
  4. SOCKADDR_IN _serverAddr;
  5. // 用户名
  6. std::string _username;

6.2.2 Widget(widget.h)

登录及注册界面

成员函数

  1. // 登陆
  2. void Login();
  3. // 注册
  4. void Signup();
  5. // 初始化UI界面
  6. void InitUi();
  7. // 初始化信号槽
  8. void InitConnect();

成员变量

  1. // 该widget的ui界面指针
  2. Ui::Widget *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;

6.2.3 StackWidget(stackwidget.h)

管理多个视图的切换

成员函数

  1. // 刷新用户列表信号
  2. void refreshUserList();
  3. // 刷新用户背包信号
  4. void refreshBag();
  5. // 刷新对战界面信号
  6. void refreshFight();
  7. // 设置当前显示的视图
  8. // index = 0 游戏主界面
  9. // index = 1 用户列表界面
  10. // index = 2 抓取界面
  11. // index = 3 用户背包界面
  12. // index = 4 对战选择界面
  13. // @param:
  14. // index 视图的编号
  15. void SetCurrentIndex(int index);
  16. // 返回到主界面
  17. void BackToLobby();
  18. // 初始化UI界面
  19. void InitUi();
  20. // 初始化信号槽
  21. void InitConnect();

成员变量

  1. // 该widget的ui界面指针
  2. Ui::StackWidget *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;
  5. // 管理多个视图切换的stacklayout
  6. QStackedLayout *_stackLayout;
  7. // 各个分视图指针
  8. GameLobby *_gameLobby;
  9. UserListWidget *_userListWidget;
  10. BagWidget *_bagWidget;
  11. FightWidget *_fightWidget;
  12. ScratchWidget *_scratchWidget;

6.2.4 GameLobby(gamelobby.h)

游戏主界面,包括进入四个功能界面的入口

成员函数

  1. // 鼠标点击在相应的区域信号
  2. void clicked(int type);
  3. // 关闭程序信号
  4. void closeAll();
  5. // 登出
  6. void LogOut();
  7. // 重载鼠标点击事件,对四个不规则区域监测鼠标点击事件
  8. void mousePressEvent(QMouseEvent *event);
  9. // 初始化UI界面
  10. void InitUi();
  11. // 初始化信号槽
  12. void InitConnect();

6.2.5 UserListWidget(userlistwidget.h)

用户列表界面,包括查看在线用户和所有用户的背包及胜率

成员函数

  1. // 返回到主界面信号
  2. void back();
  3. // 设置用户列表界面的内容
  4. void SetUserList();
  5. // 显示背包内容
  6. // @param:
  7. // username 要查看背包的所属用户
  8. void ShowBag(QString username);
  9. // 初始化UI界面
  10. void InitUi();
  11. // 初始化信号槽
  12. void InitConnect();

成员变量

  1. // 该widget的ui界面指针
  2. Ui::UserListWidget *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;
  5. // 在选择用户背包按钮的mapper
  6. QSignalMapper *_signalMapper;

6.2.6 ScratchWidget(scratchwidget.h)

抓取界面,点击精灵球有机率随机获得小精灵

成员函数

  1. // 返回到主界面信号
  2. void back();
  3. // 重载事件过滤器
  4. // 当鼠标移动到精灵球上对其实现震动动画
  5. bool eventFilter(QObject *watched, QEvent *event);
  6. // 初始化UI界面
  7. void InitUi();
  8. // 初始化信号槽
  9. void InitConnect();
  10. // 该widget的ui界面指针
  11. Ui::ScratchWidget *ui;
  12. // 与服务器连接的socket指针
  13. Connor_Socket::Client *_client;

成员变量

  1. // 该widget的ui界面指针
  2. Ui::ScratchWidget *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;

6.2.7 BagWidget(bagwidget.h)

用户背包界面,包括查看背包内小精灵属性和用户胜率及成就的显示

成员函数

  1. // 返回到主界面信号
  2. void back();
  3. // 设置背包界面的内容
  4. void SetBag();
  5. // 初始化UI界面
  6. void InitUi();
  7. // 初始化信号槽
  8. void InitConnect();

成员变量

  1. // 该widget的ui界面指针
  2. Ui::BagWidget *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;

6.2.8 FightWidget(fightwidget.h)

对战选择界面,包括选择用户精灵和对战的电脑精灵

成员函数

  1. // 返回到主界面信号
  2. void back();
  3. // 设置背包界面的内容
  4. void SetBag();
  5. // 对战开始,构建fightroom
  6. // @param:
  7. // isLose 对战失败用户是否会损失小精灵
  8. void FightBegin(bool isLose);
  9. // 重载事件过滤器,监测鼠标对背包小精灵label的点击
  10. bool eventFilter(QObject *watched, QEvent *event);

成员变量

  1. // 该widget的ui界面指针
  2. Ui::FightWidget *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;
  5. // 父对象指针
  6. QWidget *_parent;
  7. // 选中出战的小精灵
  8. QObject *_select;

6.2.9 FightRoom(fightroom.h)

实时对战界面,包括小精灵打斗动画和血量显示以及实时计算

成员函数

  1. // 开始对战
  2. void Fight();
  3. // 重载关闭事件
  4. void FightRoom::closeEvent(QCloseEvent *event);
  5. // 小精灵普通攻击信号
  6. void attack(QLabel *, QLabel *);
  7. // 小精灵特殊攻击信号
  8. void attack_SP(std::pair<Pokemon *, QLabel *> *, std::pair<Pokemon *, QLabel *> *);
  9. // 游戏结束信号
  10. void over(Pokemon *);
  11. // 小精灵受伤害信号
  12. void hurt(QLabel *attacker, QLabel *suffer);
  13. // 窗口关闭信号
  14. void isClosed();
  15. // 清除掉血文字信号
  16. void clearText();
  17. // 隐藏招式标签信号
  18. void hideLabel();
  19. // 设置普通攻击动画
  20. // @param:
  21. // attacker GUI中攻击方的Label指针
  22. // suffer GUI中被攻击方的Label指针
  23. void setAnimation(QLabel *attacker, QLabel *suffer);
  24. // 设置特殊攻击动画
  25. // @param:
  26. // attacker 攻击方的小精灵对象指针和GUI中的显示Label
  27. // suffer 被攻击方的小精灵对象指针和GUI中的显示Label
  28. void setAnimation_SP(std::pair<Pokemon *, QLabel *> *attacker,
  29. std::pair<Pokemon *, QLabel *> *suffer);
  30. // 对战完成
  31. // @param:
  32. // winner 胜利小精灵的对象指针
  33. void GameComplete(Pokemon *winner);
  34. // 更新双方血量
  35. // @param:
  36. // attacker GUI中攻击方的Label指针
  37. // suffer GUI中被攻击方的Label指针
  38. void UpdateHp(QLabel *attacker, QLabel *suffer);
  39. // 设置掉血数值
  40. void setText();
  41. // 设置招式Label
  42. void setLabel();
  43. // 选择损失的小精灵
  44. void Choose(int);
  45. // 初始化UI界面
  46. void InitUi();
  47. // 初始化信号槽
  48. void InitConnect();

成员变量

  1. // 该widget的ui界面指针
  2. Ui::FightRoom *ui;
  3. // 与服务器连接的socket指针
  4. Connor_Socket::Client *_client;
  5. // 对战用户方的小精灵对象指针和GUI中的显示Label
  6. std::pair<Pokemon *, QLabel *> _fighter;
  7. // 对战电脑方的小精灵对象指针和GUI中的显示Label
  8. std::pair<Pokemon *, QLabel *> _againster;
  9. // 该场对战用户失败是否会损失小精灵
  10. bool _isLose;
  11. // 在选择损失小精灵所用的信号mapper
  12. QSignalMapper *_signalMapper;
  13. // 标识用户在对战中是否中途退出
  14. bool _quit;

6.3 服务器

6.3.1 Connor_Socket::Server(server.h)

继承于Socket类,封装winsock,管理socket的发送与接受信息

成员函数

  1. // 构造函数,打开监听接口等待请求
  2. Server();
  3. // 查询用户是否在线
  4. // @param:
  5. // username 需要查询的用户名
  6. // connection 与该用户名绑定的socket
  7. // @return:
  8. // 是否在线
  9. bool Online(std::string username, SOCKET connection);
  10. // 将某用户从在线列表移除
  11. // @param:
  12. // username 需要移除的用户名
  13. void Offline(std::string username);
  14. // 获得在线用户列表
  15. // @return:
  16. // 装载有所有在线用户名的list
  17. std::list<std::string> GetOnlineList();

成员变量

  1. // 监听客户端访问的socket
  2. SOCKET _listeningSocket;
  3. // 地址信息
  4. SOCKADDR_IN _serverAddr;
  5. // 持有与各个客户端保持通信的线程
  6. std::vector<std::thread> _socketThreads;
  7. // 持有用户名相对应的socket链接
  8. std::unordered_map<std::string, SOCKET> _sockets;
  9. // 连接到服务器的客户端数
  10. size_t _count;

6.3.2 Dispatch(dispatch.h)

继承于Socket类,封装winsock,管理socket的发送与接受信息

成员函数

  1. // 传入SOCKET和Server的构造函数
  2. // @param:
  3. // connection 与相应客户端建立的socket连接
  4. // parent server对象指针
  5. Dispatcher(SOCKET &connection, Connor_Socket::Server *parent);
  6. // 根据请求信息,分发到相应的函数处理请求
  7. // @param:
  8. // requestInfo json序列化后请求信息
  9. // @return:
  10. // json序列化后的返回信息
  11. std::string Dispatch(json requestInfo);
  12. // 登陆处理逻辑
  13. json LoginHandle(json&);
  14. // 注册处理逻辑
  15. json SignupHandle(json&);
  16. // 获取在线用户列表处理逻辑
  17. json OnlineListHandle(json &);
  18. // 查看用户背包处理逻辑
  19. json UserBagHandle(json &);
  20. // 获取离线用户列表处理逻辑
  21. json OfflineListHandle(json &);
  22. // 获取用户成就逻辑
  23. json UserAchievementHandle(json &);
  24. // 获取对战精灵列表处理逻辑
  25. json PokemonListHandle(json &);
  26. // 获取对战精灵信息处理逻辑
  27. json PokemonInfoHandle(json &);
  28. // 对战胜利处理逻辑
  29. json GameWinHandle(json &);
  30. // 对战失败处理逻辑
  31. json GameLoseHandle(json &);
  32. // 损失小精灵处理逻辑
  33. json LosePokemonHandle(json &);
  34. // 为用户随机分发一个宠物小精灵
  35. // @param:
  36. // username 获得小精灵的用户名
  37. // @return:
  38. // 获得小精灵的名字
  39. std::string DispatchPokemon(std::string username);
  40. // 与该Dispatch绑定用户登出
  41. void Logout();
  42. // 获取Dispatcher的内部状态
  43. int getState();

成员变量

  1. // 代表用户处于什么状态,如在线空闲或对战
  2. int _state;
  3. // 与dispatcher绑定的socket连接
  4. SOCKET _connection;
  5. // 与socket连接绑定的用户名
  6. std::string _username;
  7. // server指针,以访问server维护的在线列表
  8. Connor_Socket::Server *_parent;
上传的附件 cloud_download 基于QT实现的宠物小精灵人机对战游戏.7z ( 16.27mb, 22次下载 )
error_outline 下载需要8点积分

发送私信

永远别说永远,凡事都有可能

8
文章数
14
评论数
最近文章
eject