赞
踩
本项目主要实现一个网页版的五子棋对战游戏,其主要支持以下核心功能:
实现用户注册,用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等。
实现两个玩家在网页端根据天梯分数匹配游戏对手,并进行五子棋游戏对战的功能。
实现两个玩家在下棋的同时可以进行实时聊天的功能。
实用工具类模块主要是负责提前实现一些项目中会用到的边缘功能代码,提前实现好了就可以在项目中用到的时候直接使用了。
数据管理模块主要负责对于数据库中数据进行统一的增删改查管理,其他模块要对数据操作都必须通过数据管理模块完成。
MYSQL *_mysql; //mysql操作句柄
std::mutex _mutex;//互斥锁保护数据库的访问操作
user_table() {};
~user_table() {};
注册时新增用户:bool insert(Json::Value &user);
登录验证,并返回详细的用户信息:bool login(Json::Value &user);
通过用户名获取用户信息:bool select_by_name(const std::string &name, Json::Value &user);
通过用户名获取用户信息:bool select_by_id(uint64_t id, Json::Value &user);
胜利时天梯分数增加30分,战斗场次增加1,胜利场次增加1 :bool win(uint64_t id);
失败时天梯分数减少30,战斗场次增加1,其他不变:bool lose(uint64_t id);
在线用户管理,是对于当前游戏大厅和游戏房间中的用户进行管理,主要是建立起用户与Socket连接的映射关系。
当一个用户发送了消息(实时聊天消息/下棋消息),我们可以找到房间中的其它用户,在在线用户管理模块中,找到这个用户对应的websocket连接,然后将消息发给指定用户。
#ifndef __M_ONLINE_H__
#define __M_ONLINE_H__
#include "util.hpp"
#include <mutex>
#include <unordered_map>
class online_manager{
private:
std::mutex _mutex;
//用于建立游戏大厅用户的用户ID与通信连接的关系
std::unordered_map<uint64_t, wsserver_t::connection_ptr> _hall_user;
//用于建立游戏房间用户的用户ID与通信连接的关系
std::unordered_map<uint64_t, wsserver_t::connection_ptr> _room_user;
public:
//websocket连接建立的时候才会加入游戏大厅&游戏房间在线用户管理
void enter_game_hall(uint64_t uid, wsserver_t::connection_ptr &conn) {
std::unique_lock<std::mutex> lock(_mutex);
_hall_user.insert(std::make_pair(uid, conn));
}
void enter_game_room(uint64_t uid, wsserver_t::connection_ptr &conn) {
std::unique_lock<std::mutex> lock(_mutex);
_room_user.insert(std::make_pair(uid, conn));
}
//websocket连接断开的时候,才会移除游戏大厅&游戏房间在线用户管理
void exit_game_hall(uint64_t uid) {
std::unique_lock<std::mutex> lock(_mutex);
_hall_user.erase(uid);
}
void exit_game_room(uint64_t uid) {
std::unique_lock<std::mutex> lock(_mutex);
_room_user.erase(uid);
}
//判断当前指定用户是否在游戏大厅/游戏房间
bool is_in_game_hall(uint64_t uid) {
std::unique_lock<std::mutex> lock(_mutex);
auto it = _hall_user.find(uid);
if (it == _hall_user.end()) {
return false;
}
return true;
}
bool is_in_game_room(uint64_t uid) {
std::unique_lock<std::mutex> lock(_mutex);
auto it = _room_user.find(uid);
if (it == _room_user.end()) {
return false;
}
return true;
}
//通过用户ID在游戏大厅/游戏房间用户管理中获取对应的通信连接
wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid) {
std::unique_lock<std::mutex> lock(_mutex);
auto it = _hall_user.find(uid);
if (it == _hall_user.end()) {
return wsserver_t::connection_ptr();
}
return it->second;
}
wsserver_t::connection_ptr get_conn_from_room(uint64_t uid) {
std::unique_lock<std::mutex> lock(_mutex);
auto it = _room_user.find(uid);
if (it == _room_user.end()) {
return wsserver_t::connection_ptr();
}
return it->second;
}
};
对匹配成功的玩家创建房间,建立起一个小范围的玩家之间的关联关系!房间里一个玩家产生的动作将会广播给房间里的其他用户。
将这些房间管理起来,以便于进行房间生命周期的控制!
管理的数据,处理房间中产生的动作,两个动作,下棋和聊天。
需要管理的数据:
所有玩家,根据得分,分为三个档次!
// 1. 将所有玩家,根据得分,分为三个档次!
// 2. 为三个不同档次创建三个不同的匹配队列!
// 3. 如果有玩家想要进行对战匹配,根据玩家分数,将玩家的id,加到指定的队列中!
// 4. 当一个队列中元素数量 >= 2,则表示有两个玩家要进行匹配,匹配成功
// 5. 出对队列中的前两个元素,为这两个玩家创建房间!
// 6. 给匹配成功的玩家,发送匹配响应,对战匹配成功!
进行玩家匹配对战管理。
⼀个浏览器独占⼀个session对象(默认情况下)。因此,在需要保护用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,识别该连接对应的用户,并为用户提供服务。
保存客户端的用户状态信息。
1.game_hall.html :大厅界面
2.game_room.html:游戏房间界面
3.login:登陆界面
4.register:注册界面
新用户注册:
登录:
匹配:
对战:
2023.10.26
又一程
善始善终
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。