首页 > 解决方案 > 如何存储类似风险的游戏地图

问题描述

想象一下像Risk这样的多人在线游戏,其中有一张由 NxN 网格表示的地图。每个单元格可以是空闲的,也可以由玩家占据。当玩家访问页面时,会显示网格。

假如说:

在数据库中表示和渲染网格的最有效方法是什么?我的想法是实现一个grid表和一个cell包含属性grid_id, occupying_user_id, pos_x, pos_y,的表other_properties。但是,我不确定这种策略是否可以接受渲染时间。

标签: mysqldatabase-design

解决方案


每个游戏都独立于所有其他游戏,对吗?然后是将game_id游戏中的所有数据与其他游戏隔离开来。现在,让我们看一个“游戏”......

您的网格中有数千个单元格,但可能只有数百个单元格中有有趣的信息(例如城市、军队、玩家等)?每个有趣的单元格都通过几条线连接到其他单元格,总共有数百条线?

我建议(如果使用 PHP)构建少量的

  • 世界:主要有 2D 单元格数组,以及一些用于全局操作的方法。也许单元格之间的链接数组就在这里。
  • 有趣的单元格:名称、属性、单元格上的人的数组等。还有用于操作内容的方法。
  • 玩家:他的代币,他的战利品,随便什么。
  • 令牌:x & y 此刻坐标等。

移动令牌会触及各种对象——

  • 查看它可以移动到哪些单元格
  • 查看它需要与谁交互
  • 更改 x&y 坐标等。

至于“大小”。我所描述的是“小”。单个服务器可以轻松处理数百个,甚至数千个同时运行的“游戏”。让我们做一些数学运算:

  • 在一场比赛中,一名玩家每分钟移动 1 步
  • 一个动作涉及20条SQL语句

如果有 100 个游戏正在运行,那就是每秒 33 个查询。不是问题。一千场比赛可能是个问题。

渲染意味着在屏幕上绘图,不是吗?PHP 没有直接的渲染命令。你仍然需要一些东西来与每个玩家的屏幕进行交互。

你在 JavaScript 中投入的越多,使用的 AJAX 越少,你就越会将渲染分担给每个用户。我假设每个玩家都有自己的电脑(或智能手机或......) 上面的分析假设大部分工作都在 PHP 中。但是如果你把大部分工作推给客户端,那么你可以处理更多的“游戏”。

在极端情况下,整个游戏都在每个玩家的设备中进行,中央计算机仅用于传递诸如“我将我的棋子移至廷巴克图”之类的消息,其编码更像是“在第 17 场游戏中,玩家 3 移动了令牌 4到 [31,42] 并执行了操作 5。” 此时,其他玩家的客户端代码必须复制该动作及其效果。

请注意,在最后一个示例中,我暗示一个程序可以处理多个游戏。使用 PHP(使用 HTML 和 AJAX),这基本上就是事情的工作方式。也就是说,您只有一组代码,并且每次都必须告诉它正在查看哪个游戏。

谁渲染?请记住,服务器(使用 PHP 等)或客户端(使用 JS 等)都可以编排渲染(从 x1,y1 到 x2,y2 画线;显示图像等),但最终客户端会执行在屏幕上产生像素的繁重工作。

一个设计良好的系统会在最佳点分配客户端和服务器之间的工作,这取决于正在完成的工作。例如,如果您想显示一个令牌从一个 xy 位置被拾起并放置在另一个位置,您需要决定是让它从一个位置消失并出现在另一个位置,还是显示它被拖动从一处到另一处。服务器应该首先想到它;客户端应该负担拖放的细节(如果你朝那个方向发展)。


推荐阅读