go游戏后端开发24:写完赢三张游戏

下分功能

(一)功能描述

下分功能是玩家在游戏中根据自己的牌面大小决定是否下分以及下多少分的操作。玩家点击"下分"按钮后,系统会发起一个下分请求,请求中包含下分的类型(如一档、二档)和具体分数。下分完成后,系统会向所有玩家推送当前各玩家的下分情况,包括每个座位的下分金额、当前座位的总下分金额以及所有座位的总下分金额。

(二)实现逻辑

  1. 请求发起:玩家点击"下分"按钮后,系统生成一个下分请求,请求类型为304,包含下分的分数和类型。

  2. 数据处理:服务器接收到下分请求后,首先验证玩家是否处于可下分状态(如是否在游戏中、是否已输等)。若验证通过,则将玩家的下分数据保存到对应座位的记录中。

  3. 数据推送:下分完成后,系统向所有玩家推送当前的下分情况,包括每个座位的下分金额、当前座位的总下分金额以及所有座位的总下分金额。

  4. 轮次推进:下分完成后,游戏轮次推进到下一个玩家,系统推送当前轮次信息和下一个玩家的操作提示。

比牌功能

(一)功能描述

比牌功能允许玩家在游戏过程中选择与其他玩家进行比牌操作。玩家点击"比牌"按钮后,系统会比较双方的牌面大小,根据比较结果判定输赢,并向所有玩家推送比牌结果。

(二)实现逻辑

  1. 请求发起:玩家选择比牌对象并发起比牌请求,请求中包含比牌对象的ID。

  2. 牌面比较:系统获取双方的牌面数据,根据牌面大小规则进行比较。比较规则包括牌型(如单牌、对子、顺子等)和牌面数值大小。

  3. 结果推送:比较完成后,系统向所有玩家推送比牌结果,包括输赢情况、牌面信息等。

  4. 游戏结算:若比牌后只剩一名玩家未输,则游戏结束,系统进行结算并向所有玩家推送结算结果。

弃牌功能

(一)功能描述

弃牌功能允许玩家在游戏过程中选择放弃当前局游戏。玩家点击"弃牌"按钮后,系统判定该玩家输掉当前局游戏,并向所有玩家推送弃牌信息。

(二)实现逻辑

  1. 请求发起:玩家点击"弃牌"按钮后,系统生成一个弃牌请求。

  2. 状态更新:系统将该玩家标记为输家,并更新游戏状态。

  3. 结果推送:系统向所有玩家推送弃牌信息,包括弃牌玩家的ID和弃牌原因(如主动弃牌或超时弃牌)。

  4. 游戏结算:若弃牌后只剩一名玩家未输,则游戏结束,系统进行结算并向所有玩家推送结算结果。

游戏结算

(一)功能描述

游戏结算功能在游戏结束时对玩家的得分进行计算和更新,并向所有玩家推送结算结果。结算结果包括各玩家的得分、输赢情况以及牌面信息等。

(二)实现逻辑

  1. 得分计算:系统根据游戏规则计算各玩家的得分,包括下分金额、输赢情况等。

  2. 结果推送:系统向所有玩家推送结算结果,包括各玩家的得分、输赢情况以及牌面信息等。

  3. 游戏重置:结算完成后,系统重置游戏状态,准备开始下一局游戏。

(三)代码实现

复制代码
func (g *GameFrame) OnEventRoomDismiss(reason enums.RoomDismissReason, session *remote.Session) {
	g.delScheduleIDs()
	var result = make([]*DismissResult, 0)
	for _, v := range g.UserWinRecord {
		result = append(result, &DismissResult{
			Uid:      v.Uid,
			Nickname: v.Nickname,
			Score:    v.Score,
			Avatar:   v.Avatar,
		})
	}
	var creator Creator
	for _, v := range g.r.GetUsers() {
		if v.UserInfo.Uid == g.r.GetCreator().Uid {
			creator = Creator{
				Uid:      v.UserInfo.Uid,
				Nickname: v.UserInfo.Nickname,
				Avatar:   v.UserInfo.Avatar,
			}
		}
	}
	var winMost any
	var lostMost any
	if len(result) > 0 {
		win := 0
		lost := 0
		for index, v := range result {
			if v.Score > result[win].Score {
				win = index
			}
			if v.Score < result[lost].Score {
				lost = index
			}
		}
		winMost = result[win].Uid
		lostMost = result[lost].Uid
	}
	g.sendDataAll(GameEndPushData(result, winMost, lostMost, &creator, nil), session)
}
相关推荐
冬天给予的预感4 分钟前
DAY 54 Inception网络及其思考
网络·python·深度学习
钢铁男儿9 分钟前
PyQt5高级界而控件(容器:装载更多的控件QDockWidget)
数据库·python·qt
亿牛云爬虫专家4 小时前
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
分布式·python·架构·kubernetes·爬虫代理·监测·采集
蹦蹦跳跳真可爱5898 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij8 小时前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien8 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt
敲键盘的小夜猫9 小时前
LLM复杂记忆存储-多会话隔离案例实战
人工智能·python·langchain
深海潜水员9 小时前
【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
游戏·unity·c#
高压锅_12209 小时前
Django Channels WebSocket实时通信实战:从聊天功能到消息推送
python·websocket·django
群联云防护小杜10 小时前
构建分布式高防架构实现业务零中断
前端·网络·分布式·tcp/ip·安全·游戏·架构