go游戏后端开发23:赢三张游戏逻辑

发布于:2025-04-05 ⋅ 阅读:(23) ⋅ 点赞:(0)

在游戏开始之前,我们需要完善一个重要的逻辑:座位号的生成与管理。

当玩家加入房间时,系统会为玩家分配一个座位号。座位号用于标识玩家在房间中的位置。例如,一个房间最多可容纳6人,当玩家进入房间时,系统会根据当前房间内的空位情况,为玩家分配一个座位号,从0号开始,依次递增。如果房间内已有玩家,系统会自动分配一个未被占用的座位号。

然而,在游戏过程中,可能会出现玩家离开房间的情况,这会导致座位号出现空缺。因此,我们需要重新设计座位号的分配逻辑,以避免出现重复或错误的座位号。当玩家加入房间时,系统会调用该函数,检查当前房间内的座位占用情况,并为玩家分配一个空闲的座位号。

在分配座位号的过程中,我们需要确保线程安全,避免多个玩家同时加入房间时出现座位号冲突的问题。因此,在分配座位号时,我们需要对相关数据进行加锁操作,确保在同一时间只有一个线程能够修改座位号信息。

当玩家准备开始游戏时,我们需要检查房间内已准备的玩家人数是否满足游戏开始的条件。如果满足条件,则触发游戏开始的逻辑。游戏开始后,我们需要进行一系列的操作,包括:

  1. 用户信息变更推送:推送玩家当前的状态信息,例如游戏准备完成等。

  2. 庄家推送:随机选择一名玩家作为庄家,并将庄家信息推送给所有玩家。庄家在游戏过程中具有一定的优先权,例如发牌顺序等。

  3. 局数推送:推送当前游戏的局数信息,让玩家了解当前是第几局游戏。

  4. 游戏状态推送:推送游戏的当前状态,例如“发牌中”“操作中”等,以便玩家了解游戏的进度。

在游戏的具体流程中,首先进入发牌阶段。发牌逻辑如下:

  1. 洗牌:将所有牌(52张)进行随机洗牌,确保牌的顺序是随机的。

  2. 发牌:按照座位号顺序,依次为每个玩家发3张牌。发牌时,牌面朝下,其他玩家无法看到具体牌面。发牌完成后,系统会推送发牌信息给所有玩家,告知牌已发出,但不显示具体牌面。

发牌完成后,进入玩家操作阶段。玩家可以根据自己的牌面情况,进行相应的操作。系统会记录每个玩家的操作,并在适当的时候进行结算。

在游戏过程中,还需要考虑玩家的操作顺序。每次只能有一个玩家进行操作,其他玩家需要等待。当一个玩家完成操作后,系统会将操作权移交给下一个玩家,并推送相应的操作信息。

此外,游戏中还涉及一些特殊情况的处理,例如玩家超时未操作时的自动处理逻辑等。这些逻辑需要在后续的开发中逐步完善。

通过以上逻辑,我们可以实现一个基本的赢三张游戏流程。在实际开发中,还需要对各种边界情况进行测试和优化,以确保游戏的稳定性和公平性。


~~~go
type MessageReq struct {
	Type int         `json:"type"`
	Data MessageData `json:"data"`
}
type MessageData struct {
	Coupai bool `json:"coupai"`
}

~~~

~~~go
func (g *GameFrame) onGameLook(user *proto.RoomUser, coupai bool, session *remote.Session) {
	if g.gameData.GameStatus != PourScore || g.gameData.CurChairID != user.ChairID {
		logs.Warn("ID:%s room, sanzhang game look err: gameStatus=%d,curChairID=%d,chairID=%d",
			g.r.GetId(), g.gameData.GameStatus, g.gameData.CurChairID, user.ChairID)
		return
	}
	if !g.IsPlayingChairID(user.ChairID) {
		logs.Warn("ID:%s room, sanzhang game look err: not playing", g.r.GetId())
		return
	}
	g.gameData.UserStatusArray[user.ChairID] = Look
	g.gameData.LookCards[user.ChairID] = 1
	for _, v := range g.r.GetUsers() {
		if user.ChairID == v.ChairID {
			//当前看牌的用户
			g.ServerMessagePush([]string{v.UserInfo.Uid}, GameLookCardsPushData(v.ChairID, g.gameData.HandCards[v.ChairID], coupai), session)
		} else {
			g.ServerMessagePush([]string{v.UserInfo.Uid}, GameLookCardsPushData(user.ChairID, nil, coupai), session)

		}
	}
}