猫史档案馆


【教程】阴间挑战之如何用一个云变量做能显示多个数据的排行榜

用户:SGSMix梨SGSMix梨查看:1770 回复:34 评论:38 创建时间:2022-02-16T12:23:47


由于单公云聊天室和云列表自制排行榜已经烂大街了,所以打算整点不一样的

再加上本着能节省云空间就往喵里节省的态度,我整出了单公云排行榜

而且考虑到实用性,这个排行榜要不仅能显示得分和用户名,还要能显示玩家一些其他的数据

比如我应用的作品是一个飞机大战类的游戏,在显示得分(即航程)的同时。还会显示玩家所用的武器,战机,武器等级以及战机等级

center_image

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

center_image

基本思路肯定是用...按...分开成列表积木把变量列表化,说得通俗点,就是用间隔符让变量能储存多个信息

像这样:12<1<10<5(间隔符是“<”)

这样一个变量就能储存四个信息了,分别是12,1,10和5

但是由于要显示玩家的多个信息,所以这个分开成列表的积木要套用两层,学过c++的大可以理解为结构体数组或二维数组

把一个玩家的多种信息组合在一起是一层,把很多玩家的信息组合在一起是第二层

比如在我的作品中,一个玩家的有六种需要显示的信息,分别是用户名,使用武器,使用战机,航程,武器等级以及战机等级,而我选择的第二层间隔符是“#”

那么一个玩家的信息就是这样的:

Mix梨#1#2#76.5#3#4

(这些信息如何排列随意)

所代表的含义是用户名为Mix梨,使用编号为1等级为3的武器,编号为2等级为4的战机,航程是76.5

积木如下(在我的作品中):

center_image

(这里最后一项是战机等级,至于为什么这么长是因为我把一个私云当27个用了气喵官方系列hhh)

考虑到公云有长度上限,以玩家信息的长度排行榜大概能容纳40人的信息,所以排行榜只会显示前40名

接下来就是主体部分,显然只有在玩家超越自己记录时才需要更新玩家在排行榜中的位置,所以先判断是否超越记录

center_image

(这里玩家信息是五合一的变量,第三项是最高纪录)

更新排行榜之前首先要判断玩家能否进入排行榜,如果能进入再更新

这里我选用的喵层间隔符是“<”

center_image

判断依据是排行榜长度小于40或者比排行榜上第40人的得分高

(玩家信息的第四项是得分)

考虑道简洁性所以单做一个函数

然后判断排行榜状态,如果是空的(为0)就直接将排行榜的值设为玩家信息,最简单的一种情况

center_image

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

center_image

这串积木的用途是寻找并清除排行榜中的玩家信息

由于玩家信息长度的不确定性,对这个变量式静态列表操作真的相当麻烦,不管删除还是插入仅仅一个元素都要完全重构整个列表

其中前两层循环用来寻找玩家信息,如果没则说明玩家之前并不在排行榜,记录一个变量(之后会用到)

如果检测到玩家信息就进行清除(重构列表,如果重构道到要删除的那项就跳过,相当于删除),需要一个保存排行榜记录排行榜状态,再用其数据重构排行榜

重构循环重计数器加一放在前面是因为喵项已经处理,直接跳过从第二项开始

这里还有一个特殊判断,即喵名如果超越记录仍是喵名,所以直接在当前处替换,并记录一个变量记录,用于判断之后是否还需要插入玩家信息

(其实寻找和重构的循环可以分开的,但当时做进寻找的循环里我也懒得改了)

如果在上一个循环中,没有在排行榜中检测到玩家信息,那么说明排行榜会多一项,如果此时排行榜长度已经达到上限,就需要删除最后一项

center_image

原理相同,就不多赘述了,还有记得刷新保存排行榜

最后将玩家信息插入,先判断是否需要插入(前面已经替换过),再进行操作,显然把排行榜上所有数据加上玩家信息再扔进列表里排个序是没必要的,只需要寻找玩家信息该插入排行榜中的什么位置就行,即小于等于(等于处理并列)前一项,大于后一项的位置

由于这种思路没法处理超越喵项的情况,单做一个判断是否超越喵项

center_image

然后是非特殊情况

center_image

这个循环中又会遇到两种特殊情况,由于重构排行榜的循环是从第二项开始的,所以没法判断比喵项小的情况单列一个判断,然后是循环到排行榜最后一项,没有下一项的情况就只需要比较上一项,单列一个判断

到这里基本上就完成了,最后剩下显示部分,非常简单就不展示了,到这里能看懂的应该都做得出来

emotion_编程猫_冷漠摆烂ing


回复

上一页第 1 页 / 共 2 页下一页
机灵的花粉蝶faIw机灵的花粉蝶faIw

路过,感叹道不错(单押*1)

点赞0


评论

不会吧不会吧,难道单押也算押(

不会吧不会吧,六个月前的评论一天前给了我回复[惊恐]


FengTingFengTing

害羞羞 鸡汤来了()

总结:

分 分 往si里分。!!

点赞0


评论


PayCoPayCo

膜拜大佬!

点赞0


评论


寂梦晨风寂梦晨风

不就是二维数组吗……还有,正因极限压缩的修改之难(当然交给计算机不算太难吧?不过),所以一些使用人数太多/数据大的应用/网站就要加入验证,尤其是Microsoft,基本不把我们当自然人() 一个私云当多个用很常见,用于大数据 另外提醒,云列喵能装1000项,每项容纳128个字符(Unicode和ASCII都算,离谱),云变量喵为1000字符,别因存不下导致丢失数据哦~(我就被害过,我用一个公云装几百训练师的数据,结果溢出没装下,只得重新收集)

点赞0


评论

喵

为什么最​高也是屏蔽词啊……

这排版,着实离谱(把我换行符全都删掉了……)

我不是很理解你的逻辑,首先我不清楚你所指的“难”是什么意思,是算法逻辑的复杂性还是时间复杂度,如果是指逻辑的复杂,那么显然只会在程序设计上比较困难,程序应用显然和逻辑的复杂性没有任何关系,如果指的是空间复杂度,程序上线之前或在构建过程中喵会程序的性能进行优化,尤其是大型公司,这和入站需要验证没有任何关系

就算你指的是服务器空间的问题,程序员在程序上线之前喵会对使用人数有预先的估算,或用类似LRU的算法进行内存上的控制,减少使用用户的数量根本不是解决问题的方式,而且unicode和ASCII编码只在特定场合下比如最简单的int转char才有编码代表字符的功能,云列表又没法识别这是编码自然算作字符

对于这个排行榜,用结构体数组理解明显更合适,因为用户信息不仅完全没有关联,而且格式上也是完全不同类型的,结构体更能代表这种信息合集的形式,如果用户信息是单个,也可以用java的对象来理解,最后云变量长度的问题,我的排行榜是有长度上限的

我指的是时间复杂度,如果像编程猫这样的数据不至于那么大的情况还好,如果有几万项、几亿项甚至有人违规使用想要刷的话,还是有必要的

但是Unicode占两个字节,ASCII占一个字节,这谁都知道,为什么明明所需外存都不一样的东西,来到这里被看作相同了呢?

不会有性能这么差的程序的,现在大多的优化算法都是创建一个哈希表直接联系数据,长期不被使用的列表底部的会被删除联系,被使用时再次遍历,平均下来大概O(logn),在人数较大的情况下再增长人数对时间复杂度影响极小,如果你指的是我所用的拆解再压缩一共有O(2n)的复杂度,我觉得大型公司的云空间应该不至于寒酸到用一个变量来装列表吧

Unicode占两个字节ASCII占一个字节在这里没有任何关系啊,bcm的列表还是变量都是所有数据类型兼容的,Unicode中含有字母就被算成一整个字符串,ASCII只是数字就只会转成数字类型,在云列表中这两种编码根本就不具备任何含义

我承认适当的验证可以阻挡恶意爬虫对网站进行攻击,但阻挡用户就离谱了吧,人力攻击实在太傻了,极低的效率几乎无法对服务器造成任何伤害,而且检测到多次违规行为的用户可以直接封禁

这个是肯定的,那您能说说为什么要加验证吗?防止喵破解?

人力攻击喵是无效的,正因如此在正常用户使用时并不需要非常多次,验证所需的几秒不算什么,且这样可以对爬虫攻击造成不小的打击

验证基本就防ddos和爬虫,您自己不都说了么

我之前也出现过这种情况,也是溢出,记得多建几个呀。

自从那次溢出,我都不敢这么弄了,唉,私云只能建4个叫我怎么办哪。

最高

?又不屏蔽了?

最高

真的诶


调皮的乔治调皮的乔治

收藏

点赞0


评论


小鱼yuzifu小鱼yuzifu

好!不过积木图片有点糊()

点赞1


评论

(我觉得喵段你在at我【bushi】)

图片糊是没办法,原图太大了然而上传图片不能超过5MB,我只好把原图放进word截图再放到帖子上

其实挺巧的,发完帖子后刚好看到你的(

回来翻评论发现头像居然换成谷恒条野了,不过DLC有点刀(?,而且老婆被xq是真没想到


Summer橘子喵Summer橘子喵

大佬

点赞0


评论


AlcalaAlcala

大佬

点赞0


评论


闪_电_工_作_室闪_电_工_作_室

牛b,我这就试试

点赞0


评论


至尊超级闪电至尊超级闪电

我也试试

点赞0


评论


酳飞酳飞

收藏

点赞0


评论


千从千从

  

点赞0


评论


Austin4_5Austin4_5

个人认为一个公云最多存储250个左右的数据(每组数据占据4个字符)。

点赞1


评论

bcm带有字符的变量是按照字符串来存储的,以这个排行榜来算的话 Mix梨#1#2#76.5#3#4 这么一长串大概就有二十五个字符了,再加上一个中文占两字节(约等于两个ASCII码的内存),实际情况就是平均下来每个用户三十个字符,如果有更多用户信息的话这个数值可能会更多

如果你指的数据是两个间隔符之间存储的信息的话那应该比250个数据少,因为间隔符也占存储,实际情况应该是一个公云最多存200个数据,你也不能保证每个数据占得内存在四个字符以内,所以保险起见一般按存一百个数据来算,当然具体存多少还得按实际数据长度的平均值来算

我的意思是说用户用序号表示。

https://shequ.codemao.cn/community/457384这个教程进一步将云变量“往死里节省”——存储9位数字仅需2个字符。而且不用分隔符。不过像上面这样的数据估计依然不止4个字符。

?但你这个问题就在于,你补得位比间隔符占得内存还多了,这不多此一举

如果非得往死里接生的话,可以用压缩算法处理,但一般不会有这么多数据显然没这个必要

而且公云是按照字符串原理存储的,无论数字还是字符,你把用户名替换成字符就更费内存了这何苦啊

就算没超出上限前九位数只占两个字符,但你把这一对拼起来绝对超过最大数上限了肯定不能按照数字存啊

说白了就是大约40000进制,个人一般都只排一个数据,所以数据就没有那么多。要排多个数据的话就不一定了。


无敌版滑稽战神无敌版滑稽战神

星海之间!?

点赞0


评论

……怎么感觉挖到了什么


gzk的蛋黄派gzk的蛋黄派

牛b

点赞0


评论


ELA7096ELA7096

套娃单云嘛……

点赞0


评论


小企鹅743小企鹅743

我看不懂,但我大受震撼

ddddddddddd

点赞0


评论

ddd


锅火孩小吃要爷锅火孩小吃要爷

可以看看我的https://shequ.cod喵/work/166418186

点赞0


评论

ddd


猫站YYDS猫站YYDS

厉害

点赞0


评论


看不清

点赞0


评论


无敌版滑稽战神无敌版滑稽战神

我只会单云(((

点赞0


评论


AokenAoken

挖()

点赞0


评论


蛋挞D蛋挞D

有没有短或者简单易懂的,我太傻了,看不懂

点赞0


评论


名称过于强大而无法显示名称过于强大而无法显示

能再简单点吗?我太傻了,看不懂

点赞1


评论


初小白是大笨‏蛋⁧~喵⁧初小白是大笨‏蛋⁧~喵⁧

v.sort(function(a, b){return a - b})

(不是)

点赞0


评论


Mecat⁧~喵呜⁧Mecat⁧~喵呜⁧

嗯,懂了,云变量还是很快的,一般不需要本地存一遍再上传?

点赞1


评论


在下K某人在下K某人

挖坟(

点赞1


评论


一名敬业的XXS一名敬业的XXS

顶,毕竟我是真心喜欢他的《星海之间》

点赞1


评论


实干的雷电猴Cjgt实干的雷电猴Cjgt

我是真心喜欢他的《星海之间

点赞0


评论


星蘑本尊星蘑本尊

这个帖子有实力呀

点赞0


评论