东方吧 关注:621,115贴子:16,856,469
  • 6回复贴,共1

【弹幕程序科普计划】 第十六篇 玩家数据

只看楼主收藏回复

本次简单介绍一下玩家数据的存取问题,为下次Replay存储做个铺垫,然后这个系列也就差不多了。今年也没剩几天了,赶快把这个坑填上。。。
【玩家数据】
  数据存储本身并没有什么复杂的技术,只不过牵涉的数据可能比较多。本文先简单介绍一下数据存储的方法,然后清点一遍要记录的数据。让大家对STG的玩家数据有一个比较直观的认识。
1.数据存储方法
  不管什么游戏,总是需要记录各式各样的数据,来保存玩家的游戏成果。对于一款单机STG而言,并不需要去建立多么复杂的数据库,只是简单的将数据保存下来就可以了。最简单的方法就是将所有数据都转成字符串,保存成纯文本文件,至于数据格式完全自己定义,只要自己知道是什么意思就可以了,读取的时候按顺序将字符串再转换为数据即可。下图是弹幕音乐绘数据文件中的片段,大体就是这个样子。

  如果追求数据精简也可以使用二进制编码来保存一些数据,尤其对于布尔型数据。举例来说,如果有8个布尔量要保存,全转为字符串可能是8个true/false,当然也可以用非0即1的方式记录,那就是8个0或者1,效果是类似的,然而如果使用二进制编码来记录,则变成类似0B00011011这样的格式,这样只是用1byte空间就记录了8个布尔量,非常精简。当然大部分情况是不需要这样做的,用字符串完全可以满足要求。只有面对整组布尔量的时候,这样做的优点才体现出来,比如说Replay中的按键数据,比如说成就列表等等。上图中头几个比较大的数据其实就是用这种方法记录的音乐绘商店物品购买状态、音乐室曲目解锁状态、练习模式解锁状态等数据。顺带提一句,有一种枚举量是可以定义成下面这样的,将枚举类型作为位标志,便于将整组的布尔量存成二进制数字。有兴趣的朋友可以自己研究下,这里就不具体展开了。(示例为c#语言,在其它语言下可能会有不同)

  除此之外,也可以使用类似XML文件之类的结构化文档来记录数据,可能条理更清晰效果更好。由于牵涉到XML文档之类的相关知识,这里也不详细展开了。
2. 数据内容
  下面我来清点一下有哪些内容是需要记录的,尤其像一款标准的东方STG其中到底包含了哪些数据。
  以神灵庙为例,先看PlayerData界面里面比较明显的内容。
  首先是最高分记录,对于各难度各自机,分别记录前10位最高分记录,每条记录的内容包括:机签、分数、日期、时间、最终关卡、数落率。

  换句话说,对于每条分数记录的项目而言,应该包含难度、自机、机签、分数、日期、时间、最终关卡、数落率这些内容,在有些作品中还需要包含自机装备。
  对于各难度各自机还分别记录所有符卡收取历史记录,包括挑战次数和收取次数。这里ZUN做的还是很细的,其中还分别记录了游戏中的收取次数/挑战次数以及符卡练习模式下的收取次数/挑战次数。虽然游戏中的符卡记录和符卡练习模式下的记录并没有在PlayerData界面下分别显示,但是在符卡练习的菜单下都是显示清楚的。

  换而言之,每条符卡数据应该包含符卡编号、自机、难度、游戏中收取次数、游戏中挑战次数、符卡练习模式收取次数、符卡练习模式挑战次数。
  对于每个机体,还记录了游戏次数、游戏时间和通关次数。我习惯将每个机体各难度下的时间和次数分开统计,还记录无续关的通关次数,这里大家也可以根据个人喜好增减一些数据。
  然后是一些不明显的数据。比如关卡记录。对于各难度各机体,在练习模式下挑战各关卡的分数记录会分别保存下来,在练习模式选关画面显示。在东方的早期作品妖妖梦、永夜抄中还会记录练习关卡的挑战次数。

  这里的关卡数据还包括了符卡练习关卡。每个符卡练习关是分别记录最高分数的。

  除了以上内容以外,还有一项容易忽略的东西也稍微提一下,就是默认机签。东方STG在保存一次分数记录或Rep后会把机签记录下来,下次再保存分数记录或Rep时会显示成默认机签,并且光标默认停在确定按钮上。这是个很贴心的细节,很多同人游戏甚至商业STG都没有这个功能,每次保存分数记录或Rep时都要重输一遍机签,显得就不是那么友好了。而要实现这个功能就需要把默认机签存下来了。

  明确了要存储的数据项目以后,将它们逐条存储下来就可以了。最后,把所有数据都存储下来以后还可以对文件加个密。毕竟玩家数据文件如果让玩家能够随意改动的话,显得对正常玩的玩家有些不公平,尤其类似成就、曲目这些需要解锁的东西会显得掉价。所以简单加个密还是必要的。由于是纯文本文件,将文件的字符串整体加密就可以了。
  那么以上就是本次关于玩家数据科普,下次介绍Replay功能的实现方法和数据记录方法,敬请期待。
以下广告时间:
B站兴趣圈已挂,本系列所有文章现汇总在奶牛关中
https://cowlevel.net/game/Barrage_Musical_A_Fantasy_of_Tempest/article


IP属地:上海1楼2017-12-16 16:30回复
    支持


    IP属地:广东来自iPhone客户端2楼2017-12-16 16:38
    回复
      哇 那么长时间的科普! 辛苦了!


      IP属地:贵州来自Android客户端3楼2017-12-16 23:46
      回复
        支持大大


        IP属地:上海来自手机贴吧4楼2017-12-16 23:47
        回复
          我补充一下,许多语言都有serialize(序列化)功能,因此只要做了在打开游戏时加载玩家数据的功能,再给玩家数据类加个序列化,存到文件里,就不必手动写字符串再读取了。


          IP属地:德国来自Android客户端5楼2017-12-21 19:02
          回复
            小怪的固定路线是怎么实现的啊


            IP属地:美国6楼2021-01-18 20:39
            回复