1

我对网站和数据库设计相当陌生,我之前唯一的经验是一些非常基本的 MS Access 数据库和 Codeacademy 的基础课程。我决定尝试制作一个基于网络的游戏来减少我的编程难度。我希望有人能给我一些关于数据库设计的见解,特别是未来事件的临时安排。

目前的计划是做一款简单的太空冒险游戏;星星布置在二维笛卡尔平面上(因此,每颗星星都有一个(X,Y)坐标)。所以,我有 2 个基本表格显示:

船:

  • 播放器 (Varchar)
  • 船(瓦查)
  • CurrentXCoOrd (int)
  • 当前YCoOrd(int)

地图

  • STARID(国际)
  • 系统名称(varchar)
  • XCoOrd (int)
  • YCoOrd(整数)

假设我的玩家在坐标 (1,1) 的系统中有一艘船,并希望前往坐标 (2,2) 的系统。如果这段旅程要花 10 分钟,那么建立数据库以记录新星系统的船只到达的最佳方式是什么?(船不需要从一个坐标到另一个坐标,只需从原点消失并出现在目的地就足够了。)

我正在考虑更新数据库以显示船舶在移动,然后在 10 分钟后再次更新数据库以显示船舶到达,但老实说,我不确定如何设置该调度。考虑到这一点,我现在正在考虑,而不是记录船何时启动和何时到达,而应该只记录到达时间,并带有显示船何时着陆的时间戳,并从中计算船是否在运动。

所以,我会从 SHIP 表中删除 X 和 Y CoOrdinate 字段,取而代之的是一个名为 POSITION 的表

位置:

  • 播放器 (Varchar)
  • 到达时间(日期时间)
  • XCoOrd (int)
  • YCoOrd (整数)

然后,该网站将检查到达时间戳是否已经过去,以便确定船舶是否在运动。

这样,如果玩家关闭浏览器并稍后重新打开,则不会中断任何内容,现在我只更新数据库一次(显示到达)而不是两次(显示启动和到达)。谁能确认这是否是跟踪玩家动作的可行方法?我这样做是为了学习,所以非常愿意尝试提供的任何建议。:)

数据库是 MySQL,网站是 Perl。

这是我在这里的第一篇文章,所以如果我的问题不够清楚,请接受我的道歉。我搜索了档案,但没有找到任何与我正在寻找的东西相匹配的东西。

提前谢谢了,

4

2 回答 2

0

通常似乎是一种明智的方法。不过有两个建议。

  1. 考虑使用“stardate”时间(int?)并转换为/从实时。这样,如果您因为服务器离线而需要暂停游戏,那么您可以。

  2. 决定是否要记录操作(旅程表)或结果(职位表)或两者兼而有之。

从审计/倒带+重放的角度来看,一组行动表(旅程、着陆、攻击、修复)可能是有意义的。但是,对于“当前游戏状态”,您可能不想重新运行自游戏开始以来的每个动作。尽管冗余,但带有时间戳的常规“结果”表(位置、ship_damages、ship_stores)可让您跟踪过去的“当前”状态或关键点。这些表可以从起始状态和所有后续操作重新生成,并且可以被视为缓存。没有直接更新 - 当您向数据库添加新操作时,让触发器为您执行此操作。

最后,考虑DBIx::Class以满足您的数据库需求 - 它很大,可能需要一段时间才能掌握它,但无论语言如何,它都是更好的基于对象的数据库包装器之一。

于 2013-09-10T07:15:23.197 回答
0

捕获出发时间和到达时间。当船离开时将它们都设置好:DepartureTime = NOW(), ArrivalTime = NOW() + INTERVAL 10 MINUTE. 时船在运动NOW() BETWEEN DepartureTime AND ArrivalTime

于 2013-09-09T20:54:38.573 回答