数据库中的移动跟踪

时间:2013-09-09 20:19:14

标签: mysql sql database perl database-design

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

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

SHIP:

  • 播放器(Varchar)
  • Ship(Varchar)
  • CurrentXCoOrd(int)
  • CurrentYCoOrd(int)的

MAP

  • STARID(Int)
  • SystemName(varchar)
  • XCoOrd(int)
  • YCoOrd(Int)

让我们假设我的玩家在位于坐标(1,1)处的系统中有一艘船,并希望前往坐标(2,2)处的系统。如果这个旅程要花10分钟,那么设置数据库记录船舶到达新星系统的最佳方法是什么? (船只不需要从一个坐标到另一个坐标,只需从原点消失并出现在目的地即可。)

我正在考虑更新数据库,以显示船舶处于运动状态,然后在10分钟后再次更新数据库以显示船只到达,但说实话我不确定如何设置该计划。考虑到这一点,我现在考虑的是,不是在船舶发射时及其到达时记录,而是仅记录到达时间戳,显示船舶何时着陆,并且如果船舶处于运动状态,则从中计算。

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

位置:

  • 播放器(Varchar)
  • ArrivalTime(DateTime)
  • XCoOrd(int)
  • YCoOrd(int)

然后,网站将检查到达时间戳是否已经过去,以便在船舶运动时计算出来。

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

数据库是MySQL,网站将在Perl。

这是我在这里发表的第一篇文章,如果我的问题不够清楚,请接受我的道歉。我搜索了档案,但没有发现任何符合我要求的内容。

非常感谢,

2 个答案:

答案 0 :(得分:0)

捕获DepartureTime和ArrivalTime。在船舶离开时设置它们:DepartureTime = NOW(), ArrivalTime = NOW() + INTERVAL 10 MINUTE。在NOW() BETWEEN DepartureTime AND ArrivalTime时发货。

答案 1 :(得分:0)

一般来说似乎是一种明智的做法。但有两个建议。

  1. 考虑使用“stardate”时间(int?)并实时翻译。这样,如果您因为服务器处于离线状态而需要在游戏中暂停,那么您可以。

  2. 决定是否要记录行动(旅程表)或结果(职位表)或两者。

  3. 从审核/回放+重播的角度来看,一组行动表(旅程,着陆,攻击,修理)可能有意义。但是,对于“当前的游戏状态”,您可能不希望自游戏开始以来重新运行每个动作。虽然带有时间戳的冗余常规“结果”表(position,ship_damages,ship_stores)可以让您跟踪过去的“当前”状态或关键点。可以从起始状态和所有后续操作重新生成表,并且可以将其视为缓存。没有直接更新 - 当您向数据库添加新操作时,let触发器会为您执行此操作。

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