所在位置:首页 > 手游攻略 >  如何实现异步,第二篇贪吃蛇游戏为例异步应用教程

如何实现异步,第二篇贪吃蛇游戏为例异步应用教程

发布时间:2022-11-26 14:06:26来源:网络整理浏览:17

在本教程系列中,我们使用多人贪吃蛇游戏的示例开发了一个异步应用程序。第一篇文章介绍如何实现异步,第二篇文章重点介绍如何编写游戏循环。前两个门户如下:

跟随并编写一个多人在线游戏(1)。

跟随并编写多人在线游戏(II)。

作者是一家IT咨询公司的工程师。由翻译,校对:@。

译者简介:oo7ww,北京邮电大学大三学生,计算机科学与技术专业,指导网络。

4. 制作一个完整的游戏

4.1 项目概述

在这一部分中,我们将回顾一个完整的在线游戏的设计。

这是一款经典的贪吃蛇游戏,增加了玩家的数量。你可以试试()。源代码托管在上面。游戏包含以下文件:

4.2 游戏循环内部

由于简单,多人贪吃蛇游戏是一个很好的学习例子。每一帧,所有的蛇都会移动一个位置,帧以非常慢的速度变化,这使您可以观察游戏引擎的工作原理。由于游戏速度较慢,对玩家键盘输入没有立即响应。记录每个按下的键,然后在游戏循环迭代结束时计算下一帧时,将计算该键。

现代动作游戏以相对较高的帧速率运行,服务器和客户端的帧速率不相等。客户端帧速率通常取决于客户端的硬件性能,而服务器帧速率是固定的。客户端可能会在获取与“游戏滴答”对应的数据后呈现多个帧。这允许您创作仅受客户端性能限制的平滑动画。

在这种情况下,服务器不仅应该传递这些目标的当前位置,还应该传递它们的运动方向、速度和加速度。客户端帧速率以 FPS(每秒帧数)表示,而服务器帧速率以 TPS(每秒时钟周期)表示。

在此贪吃蛇游戏示例中,两个值相等,并且在客户端上呈现的帧是在服务器的 tick 事件中计算的。

我们将使用类似于文本格式的游戏区域。实际上,这是一个包含许多单字符单元格的 HTML 表。游戏中的所有对象都由放置在单元格中的不同颜色的角色渲染。大多数情况下,客户端将密钥的代码传递给服务器,并获得与每个“tick”对应的游戏区域的更新。从服务器获取的更新包含表示生成的字符及其坐标和颜色的信息。因此,我们将所有游戏逻辑保存在服务器上,只将生成的数据发送给用户。此外,我们通过替换网络发送的信息来减少黑客攻击游戏的可能性。

4.3 它是如何工作的?

此游戏的服务器类似于例 3.2 的简单示例。但是,我们没有使用全局列表,而是使用了服务器范围的 Game 对象。Game 实例包含一个对象列表(在 self. 属性中),表示加入游戏的玩家及其私有数据和对象。所有与游戏相关的数据都放置在一个游戏对象中,该对象还允许我们拥有多个游戏室。在这种情况下,我们需要维护多个 Game 对象,因为每个游戏在开始时都需要一个。

服务器和客户端之间的所有交互都是通过以 JSON 格式编码的消息完成的。从客户端发送的消息仅包含一个数字,这是玩家按键的代码。所有其他从属客户端消息都按以下格式发送:[, 参数

1, 参数2, ...argN]

服务器消息以列表形式发送,因为通常需要立即发送许多消息(主要是呈现的数据):[

[, arg1,arg2多人在线游戏, ...argN], ... ]

在每个游戏循环迭代结束时,将计算下一帧并将其发送到所有客户端。当然,我们不会每次都发送完整的帧,只是下一帧的更改列表。

需要注意的是,玩家在连接到服务器后不会立即加入游戏。连接后,启动“旁观者”模式,以便您可以看到其他人的比赛方式。如果游戏已经开始,或者游戏之前出现在“游戏结束”屏幕上。玩家只能按“加入”按钮加入现有游戏。或者,如果游戏当前未运行,则可以创建新游戏(没有其他活动的玩家)。在后一种情况下,在开始之前会清除游玩区。

游戏区域保存在游戏中。 属性,它是二维数组的嵌套列表。它是用来保存游戏区域的内部状态。数组中的每个元素表示单元格区域,然后再将单元格呈现为 HTML 表单元格。

它具有 Char 类型,该类型包含单个字符和颜色。保持游戏区域与所有连接的客户端同步至关重要,因此应将所有游戏区域的更新与相应的消息一起发送给客户。这是由Game开发的。() 方法实现。它接收 Draw 对象的列表,然后在内部使用它来更新游戏区域并将信息发送到客户端。

我们使用 ,不仅因为它很好地表示了简单的数据结构,还因为它在以 JSON 格式发送消息时比 dict 需要更少的空间。

如果在实际游戏应用中发送复杂的数据结构,建议将它们序列化为普通甚至更短的格式,或者将它们打包成二进制格式(例如 bson,而不是 json)以减少网络流量。

该对象包含一个表示蛇的 deque 对象。此数据类型类似于列表,但可以更有效地添加和删除其上的元素,因此理想情况下它表示一条移动的蛇。此类的方法主要是 。() ,返回渲染数据以将玩家的蛇移动到下一个位置。

基本上,它将蛇头渲染到新位置,删除尾巴所在的最后一个元素。考虑到蛇在吃一个数字时会长大,尾巴不会移动相应的帧数。蛇的渲染数据可以在游戏中使用。() 方法,实现所有游戏逻辑。它将呈现所有蛇的运动,检查每条蛇前面的障碍物多人在线游戏,同时产生数字和“石头”。在每次滴答期间,游戏直接从 () 调用该方法以生成下一帧。

如果蛇头前面有障碍物,它会在游戏中找到。() 在呼叫游戏中。() 。它将在线通知所有客户(死蛇由.( ) 变成石头)蛇死了,最高分表更新。对象的活动标志设置为 False,以便在渲染下一帧时忽略玩家,直到他再次加入游戏。如果没有蛇活着,游戏区域中会显示“游戏结束”消息。同时,主游戏循环将停止,游戏将停止。该标志设置为 False,下次玩家按“加入”键时,游戏区域将被清空。

每次生成下一帧时,数字和石头也会同时出现,由随机值决定。数字或石头的赔率可以在.py中修改。注意,游乐区里每条活着的蛇都有一个对应的编号,所以蛇越多,数量就会越多,所以它们会有足够的食物。

4.4 网络协议

从客户端发送的消息列表

命令参数说明

[姓名]

设置玩家昵称

加入

玩家将加入游戏

从服务器发送的消息列表

命令参数说明

[同上]

为玩家分配 ID

多人在线游戏_猜人游戏日本在线中文免费公开观看_猜人游戏母亲20集在线

世界

[[(字符,颜色), ...], ...]

初始化游戏区域地图

清理地图,将所有字符替换为空格

[x、y、字符、颜色]

在相应位置显示字符

[ID、姓名、颜色、分数]

游戏新手玩家

[同上]

单人游戏结束

[ID,分数]

为玩家设置分数[

[名称、分数、颜色], ...]

更新最高分表

典型的消息交换规则

客户端>

服务器>客户端-服务器->所有客户端注释

名称将传递给服务器

标识分配

世界

初始游戏地图交付已完成

最新的最高分表交付已完成

加入

玩家按下“加入”,游戏循环开始

命令客户端清理游玩区

、,...

第一个游戏徽标,第一帧渲染

(密钥代码)

玩家按下一个键

、,...

第二帧渲染

蛇吃了一个数字

、,...

第三帧渲染

。重复几帧。

蛇在吃这种疾病时死亡

更新最高成绩表(如果有)

5. 总结

老实说,我真的很喜欢使用最新版本的异步功能。新语法不同,因此异步代码现在易于阅读,并且很容易分辨哪些调用是非阻塞的,以及它们是否切换到绿色协程。现在我可以自信地宣称它是异步编程的好工具。

在团队中很受欢迎。如果您决定在公司放松一下,请记住通过 or 向我们提供反馈。

翻译组是由@发起的专注于技术内容翻译的团体,至今已有近30名技术爱好者加入。

翻译团队制作的内容(包括教程、文档、书籍、)将在编程微信公众号发布,欢迎爱好者推荐相关线索。

要推荐线索,可以直接在编程学校微信公众号推文下留言。