[linux环境] 基于thrift模拟游戏的简易匹配机制(三.完结)
目录
匹配(删的时候注意先删后面的,再删前面的,因为先删前面的下标会变)
save服务的客户端和服务端
在thrift的文件夹下创建save.thrift
这里的password为服务器(基于ac terminal)的密码经md5加密后的前八位 7e379f37
AC Terminal (acwing.com)https://www.acwing.com/file_system/file/content/whole/index/content/2543025/
namespace cpp save_service
service Save {
/**
* username: myserver的名称
* password: myserver的密码的md5sum的前8位
* 用户名密码验证成功会返回0,验证失败会返回1
* 验证成功后,结果会被保存到myserver:homework/lesson_6/result.txt中
*/
i32 save_data(1: string username, 2: string password, 3: i32 player1_id, 4: i32 player2_id)
}
生成对应的cpp文件并更改gen-cpp 名为save_client
~/thrift_lesson/match_system/src$
thrift -r --gen cpp ../../thrift/save.thrift
mv gen-cpp/ save_client
需要删除save_client下的Save_server.skeleton.cpp, 在客户端并不需要该服务且 cpp编译时是不能同时存在两个main函数
Apache Thrift - C++https://thrift.apache.org/tutorial/cpp.html#client
在main.cpp中,按照官方文档的client样例,把缺少的头文件,save_client/save.h加上,以及引入命名空间save_service
记得把client.py的"localhost"改为 客户端本地IP (即127.0.0.1)
把main.cpp的"localhost"改为 服务器地址
因为game的服务是起在本地的, 而save的服务是起在服务器的
编译链接(先编译save_client下的cpp文件)
g++ -c save_client/*cpp
g++ *.o -o main -lthrift -pthread
呜呜呜,报错了
经群内大佬指点,应该是有main的进程占用了端口,我一看,
果然是昨天的tmux的窗口还连着,kill进程后重新运行./main报错消失了!!!
上面的编译环节千万别忘了编译main.cpp, 否则就会像我一样在服务器中找不到数据的存储而以为出了bug(其实没有....
测试一波
(左下为服务器模拟游戏数据存储的服务端,,左上模拟的是游戏数据的客户端和匹配系统的服务端,右上模拟的是游戏的客户端,三者均可为不同的服务器)
本次commit记录
match server:3.0(考虑到段位)
简单的流程算是写完了
新增/删除玩家 👉 在匹配池中匹配 👉 匹配成功的话会在服务器中记录
但匹配机制过于拉胯(没有考虑段位,匹配时长等),接下来完善一下这个匹配的函数
消费者队列稍作改动
这块还是有些模棱两可,
看到一位弹幕老哥这样解释,蛮有道理
每当当前进程为空时, 由其他进程持有锁,判断是否可以匹配,这个过程1s后再进行后面的判断
设计一下匹配机制
每当运行match函数时,都会对匹配池中的玩家按照段位由低到高排序,每当两个玩家段位差在50以内,就将他们匹配到一块(匹配整体趋势还是从前往后的)
测试一下
- 当加入1,2,3时,可见他们都没匹配到一块,因为段位大于50
- 加入4时,2满足匹配条件, 则有 2 VS 4
- 移除1,加入5,可见1,5并未匹配到一块,说明我们的remove操作是成功的
- 之后同理, 加入了6,7 出现 3 VS 6 5 VS 7
本次conmmit记录
match server:4.0(多线程)
Apache Thrift - C++https://thrift.apache.org/tutorial/cpp.html#server官网给我们的server端样例是多线程的,直接搬过来稍作改动即可
测试成功
本次commmit记录
match server:5.0(兼顾段位和匹配时长)
如果匹配池里已经有几个玩家了,但段位都差很多,总不能一直等,我们可以根据时间的推移,给所有在等待的玩家能匹配到的段位范围逐步扩大
新增秒数队列wt
判断段位匹配范围
匹配(删的时候注意先删后面的,再删前面的,因为先删前面的下标会变)
1,2先开始匹配,二十秒后会匹配成功
3,4随后进入先开始匹配,十秒后会匹配成功
本次commmit记录
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799077.html