基于websocket的多用户网页五子棋(五)
一.前期回顾
对于前面内容不太了解的,可以去看一看下面的文章:
https://blog.csdn.net/weixin_60668256/article/details/152456527?fromshare=blogdetail&sharetype=blogdetail&sharerId=152456527&sharerefer=PC&sharesource=weixin_60668256&sharefrom=from_link
二.游戏房间设计
1.游戏房间类的设计
#include <iostream>
#include <vector>
#include <jsoncpp/json/json.h>#include "db.hpp"
#include "online.hpp"#define BOARD_ROW 15
#define BOARD_COL 15
#define CHESS_WHITE 1
#define CHESS_BLACK 2enum room_status{GAME_START,GAME_OVER
};class room{private:uint64_t _room_id;room_status _status;int _player_count;uint64_t _white_id;uint64_t _black_id;user_table* _tb_user;online_manager* _online_user;std::vector<std::vector<int>> _board;private:uint64_t check_win(int row,int col,int color){//从四个不同的方向上检测是否出现了五个及以上的相同颜色的格子return ;/*返回胜利玩家的ID,否则没有胜利者返回0*/}public:room(uint64_t room_id,user_table* tb_user,online_manager* online_user):_room_id(room_id),_status(GAME_START),_player_count(0),_tb_user(tb_user),_online_user(online_user),_board(BOARD_ROW,std::vector<int>(BOARD_COL,0)){DLOG("%lu 房间创建成功!!",_room_id);}~room(){DLOG("%lu 房间销毁成功!!",_room_id);}uint64_t id(){return _room_id;}room_status status(){return _status;}int player_count(){return _player_count;}void add_white_user(uint64_t uid){_white_id = uid;_player_count++;}void add_black_user(uint64_t uid){_black_id = uid;_player_count++;}uint64_t get_white_user(){return _white_id;}uint64_t get_black_user(){return _black_id;}//处理下棋动作Json::Value handle_chess(Json::Value &req){}//处理聊天动作Json::Value handle_chat(Json::Value &req){}//处理退出动作void handle_exit(uint64_t uid){}//总的请求处理函数,区分请求类型,根据不同的请求调用不同的处理函数,得到响应进行广播void handle_request(Json::Value& req){}//处理广播动作void broadcast(Json::Value &req){}
};
2.接口格式了解
走棋输入的json格式:
走棋输出的json格式:
聊天的输入的json格式:
聊天的输出的json格式:
3.handle_chess()实现
Json::Value handle_chess(Json::Value &req){Json::Value json_resp;//1.当前请求房间号与当前房间号是否匹配uint64_t room_id = req["room_id"].asUInt64();if(room_id != _room_id){json_resp["optype"] = "put_chess";json_resp["result"] = false;json_resp["reason"] = "房间号不匹配!";return json_resp;}//2.判断房间中两个玩家是否都在线,任意一个不在线,就是另一方胜利int chess_row