go游戏后端开发32:自摸杠处理逻辑

发布于:2025-04-10 ⋅ 阅读:(32) ⋅ 点赞:(0)

当我们在自摸杠时,实际上在杠完之后,我们还需要进行一个删除操作。因此,我们需要在上面拷贝一个删除操作。由于这是自摸杠,所以这个地方需要删除四次。在这里,我们需要注意的是,自摸杠时,传过来的card是一个空值,相当于暗杠。因为你是自摸的,别人也不知道你到底杠的是什么。如果card有值,那自然就是明杠了。所以,这里card是空的,我们在删除时用它删的话,就是一个空值。因此,我们需要重新拿一个card。我们来拿一个看看,然后用这个card来进行删除操作。

我们进行测试,准备,加入房间,房间号是707646。在测试位置上,我们出五张牌,然后拿一个5。回过来之后,我们随便出一张牌,然后这个地方就过了。接着,我们要杠,杠了之后我们可以看到5万跑这边来了。但是,这个地方我们不能操作,正常情况下,我们在代码里面写的是杠完之后应该能继续操作的。我们来看一下,这个地方报错了,说是越界了。删除就意味着我们的删除代码出错了。在Go语言中,用for循环删除多个元素是有越界风险的。所以,这个地方我们还是采用一种比较古老的方式来处理,给它一个新的part,我们来判断一下,如果我们要删4个,那我们先把这个要删的元素范围确定下来。但是,这里应该是给一个count计数,count等于0。然后,如果count不等于times,我们就继续操作。如果count等于times,我们就把剩下的元素移到新的part里面去。

我们重启之后,开始一个新的游戏,准备,加入房间,房间号是555730。我们准备之后,在测试里面点5万,保证下一个拿到的牌就是5万。回过来之后,我们先过,过了之后我们要杠。杠了之后,我们出牌这个操作是正常的,但是5万还是没有处理掉。我们把这个回过来,这个地方我们把它回过来,我们这个肯定是5万。如果count不等于times,我们就累计一次。累计到4的时候,我们就把剩下的元素移到新的part里面去。看起来应该是没啥问题,我们只能打个断点去测试一下。

我们重启一下,清空数据,进攻,回过来,准备,加入房间,房间号是913164。我们准备之后,测试5万,然后随便抽一个。我们现在要杠,杠了之后,我们在这边打断点。我们拿一个card,现在是one 5,没有问题。我们现在要进行删除,然后进入到删除card的操作。然后,我们继续操作,累计到4的时候,我们把剩下的元素移到新的part里面去。最后,我们把新的card放进去,应该是一二三四五六七八九十,总共10个。这个地方应该是没有问题的。改了之后,我们来看一下,现在我们只有10个牌,应该是没有问题的。

接下来,我们做一个记录,这块没有问题,然后进入到下一个操作,拿牌,把牌append进来,然后是11。这个地方看起来也没有问题,很符合我们的期望。但是,实际上在这个位置上,排队里面还是5万。我们重新加了一下,这个牌换了,这个地方可能是客户端没有处理好。我们在杠的时候,这个地方应该是自摸,我们拿到card后,可以尝试在这个位置上把这个card记录成有card的这种,看看会不会有点不一样。理论上,我们不给他card的话,应该是暗杠。这个地方要么就是我们刚才打断点导致前端没有及时操作的变化,也有可能。我们把这个断点去掉,重新来一遍,不打断点,因为有时候断点会卡住操作,到时候客户端超时之后,可能就来不及做操作了。

我们进入房间,房间号是953988。我们给一个5万,然后回过头来随便来一个。这个是没有问题的,然后我们可以看到5万被处理掉了。这个地方实际上应该是传值的问题,而不是我们打断点的问题。如果没有传值的话,他这个地方就不知道你到底杠的是哪个值。所以,这个地方我们还是需要给他直接传这个card。但是,我们传了card之后,这个操作是告诉所有用户的,这个地方就有问题了。我们应该是在这个位置上操作的,判断一下这个地方,用for循环,i等于0,i小于input,然后count,然后i加加。然后,我们看到i等于user,我们把这个传过来,然后我们给对应的用户传。如果i不等于user,我们在传递的时候就不一样了。这个地方我们再来实验一下。

我们重启之后,再次开启测试。创建房间,准备,房间号是626063。我们准备之后,拿个5万,这边随便抽一个牌,然后回过来。这面是没有问题的,这面也没有问题。但是,这面我们很明显也看不到,大家都看不到别人的牌,但是你能看到自己的牌。这样处理就对了。虽然前面讲的是暗杠的事情,就是我们自摸的时候,别人不应该看到你到底杠什么。这是因为在我们发的时候,是给所有用户发的,你把他的牌给别人发过去之后,相当于所有人都能看见。但是,如果你不给他发这个牌,他也不知道你杠的是什么,客户端也没法处理。这个地方我们是有这么一个问题,我们把这块逻辑处理一下,这块逻辑就正常了。