用户:
SGSMix梨查看:38 回复:34 评论:38 创建时间:2022-02-16T12:23:47
由于单公云聊天室和云列表自制排行榜已经烂大街了,所以打算整点不一样的
再加上本着能节省云空间就往喵里节省的态度,我整出了单公云排行榜
而且考虑到实用性,这个排行榜要不仅能显示得分和用户名,还要能显示玩家一些其他的数据
比如我应用的作品是一个飞机大战类的游戏,在显示得分(即航程)的同时。还会显示玩家所用的武器,战机,武器等级以及战机等级

作品链接:https://shequ.codemao.cn/work/131898272

基本思路肯定是用...按...分开成列表积木把变量列表化,说得通俗点,就是用间隔符让变量能储存多个信息
像这样:12<1<10<5(间隔符是“<”)
这样一个变量就能储存四个信息了,分别是12,1,10和5
但是由于要显示玩家的多个信息,所以这个分开成列表的积木要套用两层,学过c++的大可以理解为结构体数组或二维数组
把一个玩家的多种信息组合在一起是一层,把很多玩家的信息组合在一起是第二层
比如在我的作品中,一个玩家的有六种需要显示的信息,分别是用户名,使用武器,使用战机,航程,武器等级以及战机等级,而我选择的第二层间隔符是“#”
那么一个玩家的信息就是这样的:
Mix梨#1#2#76.5#3#4
(这些信息如何排列随意)
所代表的含义是用户名为Mix梨,使用编号为1等级为3的武器,编号为2等级为4的战机,航程是76.5
积木如下(在我的作品中):

(这里最后一项是战机等级,至于为什么这么长是因为我把一个私云当27个用了气喵官方系列hhh)
考虑到公云有长度上限,以玩家信息的长度排行榜大概能容纳40人的信息,所以排行榜只会显示前40名
接下来就是主体部分,显然只有在玩家超越自己记录时才需要更新玩家在排行榜中的位置,所以先判断是否超越记录
![]()
(这里玩家信息是五合一的变量,第三项是最高纪录)
更新排行榜之前首先要判断玩家能否进入排行榜,如果能进入再更新
这里我选用的喵层间隔符是“<”

判断依据是排行榜长度小于40或者比排行榜上第40人的得分高
(玩家信息的第四项是得分)
考虑道简洁性所以单做一个函数
然后判断排行榜状态,如果是空的(为0)就直接将排行榜的值设为玩家信息,最简单的一种情况

如果不为零,就要判断当前用户是否已经在排行榜,如果已经在就清除之前的信息

这串积木的用途是寻找并清除排行榜中的玩家信息
由于玩家信息长度的不确定性,对这个变量式静态列表操作真的相当麻烦,不管删除还是插入仅仅一个元素都要完全重构整个列表
其中前两层循环用来寻找玩家信息,如果没则说明玩家之前并不在排行榜,记录一个变量(之后会用到)
如果检测到玩家信息就进行清除(重构列表,如果重构道到要删除的那项就跳过,相当于删除),需要一个保存排行榜记录排行榜状态,再用其数据重构排行榜
重构循环重计数器加一放在前面是因为喵项已经处理,直接跳过从第二项开始
这里还有一个特殊判断,即喵名如果超越记录仍是喵名,所以直接在当前处替换,并记录一个变量记录,用于判断之后是否还需要插入玩家信息
(其实寻找和重构的循环可以分开的,但当时做进寻找的循环里我也懒得改了)
如果在上一个循环中,没有在排行榜中检测到玩家信息,那么说明排行榜会多一项,如果此时排行榜长度已经达到上限,就需要删除最后一项

原理相同,就不多赘述了,还有记得刷新保存排行榜
最后将玩家信息插入,先判断是否需要插入(前面已经替换过),再进行操作,显然把排行榜上所有数据加上玩家信息再扔进列表里排个序是没必要的,只需要寻找玩家信息该插入排行榜中的什么位置就行,即小于等于(等于处理并列)前一项,大于后一项的位置
由于这种思路没法处理超越喵项的情况,单做一个判断是否超越喵项

然后是非特殊情况

这个循环中又会遇到两种特殊情况,由于重构排行榜的循环是从第二项开始的,所以没法判断比喵项小的情况单列一个判断,然后是循环到排行榜最后一项,没有下一项的情况就只需要比较上一项,单列一个判断
到这里基本上就完成了,最后剩下显示部分,非常简单就不展示了,到这里能看懂的应该都做得出来
摆烂ing
寂梦晨风不就是二维数组吗……还有,正因极限压缩的修改之难(当然交给计算机不算太难吧?不过),所以一些使用人数太多/数据大的应用/网站就要加入验证,尤其是Microsoft,基本不把我们当自然人() 一个私云当多个用很常见,用于大数据 另外提醒,云列喵能装1000项,每项容纳128个字符(Unicode和ASCII都算,离谱),云变量喵为1000字符,别因存不下导致丢失数据哦~(我就被害过,我用一个公云装几百训练师的数据,结果溢出没装下,只得重新收集)
点赞0
评论