当前位置: 首页 > news >正文

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

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

当玩家加入房间时,系统会为玩家分配一个座位号。座位号用于标识玩家在房间中的位置。例如,一个房间最多可容纳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)

		}
	}
}

http://www.dtcms.com/a/106924.html

相关文章:

  • C语言内存函数详解
  • mycat--垂直分表--
  • mmaction2教程(2) QA
  • LangChain 使用向量数据库介绍与使用
  • Uniapp 持续出现 Invalid Host/Origin header 解决方法
  • Spring AOP + Redis缓存设计实战:基于注解的优雅三防方案(击穿/穿透/雪崩)
  • 【算法手记9】OR26 最长回文子串 NC369 [NOIP2002 普及组] 过河卒
  • 2024蓝桥杯国赛真题——数位翻转
  • 网络安全防护与挑战
  • 在uniapp中,video比普通的标签层级高解决问题
  • 项目实战--登录页面
  • 运维培训班之最佳选择(The best Choice for Operation and Maintenance Training Courses)
  • CSP-J/S冲奖第22天:时间复杂度
  • 内网服务器centos7安装jdk17
  • SSM-SpringMVC篇
  • 【JavaSE】String 类
  • 基于Rust与WebAssembly实现高性能前端计算
  • 一套AI训推一体化解决方案约等于100万个应用?
  • new/delete到底做了啥?
  • Python 数据类型 - 集合(set)
  • 【ACM MM 2024】FiLo++实验步骤总结
  • Python网络爬虫:从入门到实践
  • ROS2 高级组件中的webots介绍
  • 合并相同 patient_id 的 JSON 数据为数组
  • 自注意力与交叉注意力的PyTorch 简单实现
  • DAO 类的职责与设计原则
  • 绘制动态甘特图(以流水车间调度为例)
  • JWT(JSON Web Token)
  • Spring AI Alibaba 快速开发生成式 Java AI 应用
  • 每日总结4.2