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
    }
}
相关推荐
子春一15 分钟前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
Goat恶霸詹姆斯1 小时前
mysql常用语句
数据库·mysql·oracle
前端不太难1 小时前
HarmonyOS 游戏上线前必做的 7 类极端场景测试
游戏·状态模式·harmonyos
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草1 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程1 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0801 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥2 小时前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
Tony Bai2 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
微祎_2 小时前
Flutter for OpenHarmony:构建一个 Flutter 重力弹球游戏,2D 物理引擎、手势交互与关卡设计的工程实现
flutter·游戏·交互