go游戏后端开发34:补杠功能与到时出牌

补杠功能的实现

接下来,我们来实现补杠功能。补杠是指在已经碰牌的情况下,又摸到一张相同的牌,可以组成杠。

功能设计
  1. 自摸补杠

    • 如果玩家自摸到一张牌,且这张牌可以与已碰的牌组成杠,则可以进行自摸补杠。

    • 自摸补杠后,玩家需要从牌堆中再摸一张牌。

  2. 吃牌补杠

    • 如果玩家通过吃牌形成杠,则称为吃牌补杠。

    • 吃牌补杠后,玩家不需要再摸牌,直接出牌即可。

实现步骤
  1. 判断是否可以补杠

    • 检查玩家是否已经碰牌。

    • 检查新摸到的牌是否可以与已碰的牌组成杠。

  2. 执行补杠操作

    • 如果可以补杠,更新玩家的牌组。

    • 发送补杠操作的消息给所有玩家。

  3. 处理自摸和吃牌的区别

    • 自摸补杠后,玩家从牌堆中再摸一张牌。

    • 吃牌补杠后,玩家直接出牌。

代码实现
复制代码
// 判断是否可以补杠
func canPung(user *User, card int) bool {
    for _, record := range user.Records {
        if record.Type == "pung" && record.Card == card {
            return true
        }
    }
    return false
}

// 执行补杠操作
func pung(user *User, card int) {
    if canPung(user, card) {
        // 添加杠操作记录
        user.Records = append(user.Records, Record{Type: "pung", Card: card})

        // 发送补杠消息
        msg := &Message{
            Type: 5,
            Data: map[string]interface{}{
                "userId": user.Id,
                "card":   card,
            },
        }
        user.Room.Broadcast(msg)

        // 自摸补杠,再摸一张牌
        if user.LastDrawnCard == card {
            user.DrawCard()
        }
    }
}

托管功能的实现

接下来,我们来实现托管功能。托管是指在倒计时结束后,系统自动为玩家出牌。

功能设计
  1. 倒计时

    • 每个玩家在操作时都有一个倒计时。

    • 如果倒计时结束,玩家还没有操作,则触发托管。

  2. 自动出牌

    • 如果玩家可以弃牌,则自动弃牌。

    • 如果玩家有其他操作,则不做任何操作。

实现步骤
  1. 设置倒计时

    • 在玩家操作时,设置一个倒计时定时器。

    • 定时器每秒触发一次,检查倒计时是否结束。

  2. 触发托管

    • 如果倒计时结束,触发托管操作。

    • 根据玩家的牌组,选择一个合适的牌进行操作。

  3. 取消定时器

    • 如果玩家在倒计时内进行了操作,则取消定时器。
代码实现
复制代码
// 设置倒计时
func startTimer(user *User, duration int) {
    user.Timer = time.NewTimer(time.Duration(duration) * time.Second)
    go func() {
        <-user.Timer.C
        if user.NeedAutoPlay() {
            autoPlay(user)
        }
    }()
}

// 自动出牌
func autoPlay(user *User) {
    if user.CanDiscard() {
        user.DiscardCard()
    }
}

// 取消定时器
func cancelTimer(user *User) {
    if user.Timer != nil {
        user.Timer.Stop()
        user.Timer = nil
    }
}
相关推荐
NCIN EXPE2 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台2 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路2 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家2 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE2 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow122 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO2 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623922 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele3 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python