[linux环境] 基于thrift模拟游戏的简易匹配机制(三.完结)

目录

save服务的客户端和服务端

呜呜呜,报错了

测试一波

 本次commit记录

match server:3.0(考虑到段位)

消费者队列稍作改动

设计一下匹配机制 

本次conmmit记录

match server:4.0(多线程)

本次commmit记录

match server:5.0(兼顾段位和匹配时长)

新增秒数队列wt

判断段位匹配范围

匹配(删的时候注意先删后面的,再删前面的,因为先删前面的下标会变)

本次commmit记录



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记录

 implement save-client (0e5d2c9e) · Commits · Knight bit / thrift_lesson · GitLabhttps://git.acwing.com/knight/thrift_lesson/-/commit/0e5d2c9e198a789fa4dcc8ce7a223b00bb290f97


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 version:3.0 (683ee628) · Commits · Knight bit / thrift_lesson · GitLabAC Githttps://git.acwing.com/knight/thrift_lesson/-/commit/683ee6288d0dc2f665d1fa6d4ae609473df2b1f3


match server:4.0(多线程)

Apache Thrift - C++https://thrift.apache.org/tutorial/cpp.html#server官网给我们的server端样例是多线程的,直接搬过来稍作改动即可

测试成功

本次commmit记录

match-server version:4.0 (fb06077e) · Commits · Knight bit / thrift_lesson · GitLabhttps://git.acwing.com/knight/thrift_lesson/-/commit/fb06077efd68df22f2273815015e4331a4ccf6be


match server:5.0(兼顾段位和匹配时长)

如果匹配池里已经有几个玩家了,但段位都差很多,总不能一直等,我们可以根据时间的推移,给所有在等待的玩家能匹配到的段位范围逐步扩大

新增秒数队列wt

判断段位匹配范围

匹配(删的时候注意先删后面的,再删前面的,因为先删前面的下标会变)

1,2先开始匹配,二十秒后会匹配成功

3,4随后进入先开始匹配,十秒后会匹配成功

本次commmit记录

match-server version:5.0 (60175cbe) · Commits · Knight bit / thrift_lesson · GitLabAC Githttps://git.acwing.com/knight/thrift_lesson/-/commit/60175cbeb1d5867f40b1fcfc744fe8205a09c95b

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泥烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值