昨天接到一个面试通知,今天的时间绝大多数都消耗在了路途上,因为那个面试的offer标的是15k,我报着11k的预期去的。结果boss上标的100-599的规模变成了30个人,15k的薪资也变成了6k。离谱,长记性了,下次面试之前,先问一下公司的产品和规模,不能再这么傻乎乎的过去了。
晚上的时间用来看猜数字的游戏,用lua框架写的。还是利用了先划分服务的特性。首先划分一个main服务,专门处理连接事件。就比如有三个客户端连到了127.0.0.1 的 8888 端口。main是专门用来处理这个连接,然后为每个连接创建一个服务,就是agent。这一共就有4个actor了。
在main启动的时候,还会创建两个服务,一个是redis服务,一个是大厅hall服务。这两个都是唯一的。大厅就像我们玩的棋牌游戏进入的大厅。redis是连接到redis数据库中,用于存储每一个agent的上下文信息。
每个agent无非就是注册登录,准备,猜数字这一类的流程。注册和登录就是去redis中查询有无改name对应的上下文,然后再继续余下的流程,不过多了一点就是断线重连,也就是用于记录agent服务的表多了一个isgame,来确认是否在房间中,如果在房间中就会实现断线重连。
准备的逻辑就是将用户注册到房间room中,首先属于agent的服务会调用属于大厅hall的ready函数,用来判断是否满3个人,如果满3个人就会创建一个房间,然后清空记录agent的数据结构重新记录。
值得一提的是skynet.send 和 skynet.call 虽然都是调用别的服务的回调操作,但是send是异步的,不用阻塞等待返回值,而call是同步地,因为他会阻塞的等待返回值。
猜数字的逻辑也是在room中进行实现的,因为a玩家猜的数字要在b玩家和c玩家的界面上显示,所以就需要有一个服务拥有这三个服务的信息然后将某个服务的操作统一的投射到输出缓冲区上
所以猜数字的具体实现还是在room中,在agent服务中只是调用room的guess函数
猜数字的游戏逻辑
大致逻辑是这样子的,重要的是熟悉lua定义的一些常用的数据结构,然后明白这些表中到底是存放什么信息,可以将整个代码赋值给gpt让gpt分析每个数据结构包含的信息和作用,然后自己再根据这个数据结构去看代码,会更加的清爽。