有一个 storage foo:example,其中的内容如下:
{
Data:[
{Money:100,Items:[{id:"stone",Count:2b}]},
{Money:230,Items:[{id:"grass_block",Count:5b}]},
{Money:175,Items:[{id:"book",Count:3b},{id:"stick",Count:1b}]},
{Money:120,Items:[]},
{Money:80,Items:[{id:"oak_planks",Count:4b}]}
]
}
我们可以将列表 Data 视为是一个数据表,其中的每个元素(复合标签)视为是一条记录。
例如,这里一共存储了 5 名玩家的 Money 和 Items,这 5 名玩家在 uid 记分板上的分数分别是 0~4,对应着自己的记录的索引值。(例如 uid 为 3 的玩家的记录是数据表中的第 4 条)。
我们使用函数寻找和修改玩家的记录。
假如我们要对很久没上线的玩家(例如 uid 为 0 和 2 的玩家)的数据进行清理,删除他的 uid 和在数据表中的记录,并将后面的玩家的 uid 前移,但是发现 uid 为 1 和 4 的玩家已经下线,无法使用 @a 选中。
那么,在这种情况下应如何处理?
{
Data:[
{Money:100,Items:[{id:"stone",Count:2b}]},
{Money:230,Items:[{id:"grass_block",Count:5b}]},
{Money:175,Items:[{id:"book",Count:3b},{id:"stick",Count:1b}]},
{Money:120,Items:[]},
{Money:80,Items:[{id:"oak_planks",Count:4b}]}
]
}
我们可以将列表 Data 视为是一个数据表,其中的每个元素(复合标签)视为是一条记录。
例如,这里一共存储了 5 名玩家的 Money 和 Items,这 5 名玩家在 uid 记分板上的分数分别是 0~4,对应着自己的记录的索引值。(例如 uid 为 3 的玩家的记录是数据表中的第 4 条)。
我们使用函数寻找和修改玩家的记录。
假如我们要对很久没上线的玩家(例如 uid 为 0 和 2 的玩家)的数据进行清理,删除他的 uid 和在数据表中的记录,并将后面的玩家的 uid 前移,但是发现 uid 为 1 和 4 的玩家已经下线,无法使用 @a 选中。
那么,在这种情况下应如何处理?
1.可以来个删除记录 类似这样
{Delete:[{key:0,uid:0},{key:1,uid:1}]}
(第一次删了编号为1的玩家,第二次删了编号(原)为2的玩家)
2.玩家分数done记录该玩家已处理到的删除记录的键值。
记录删除记录总数的假实体#all的done分数被设置为1,与最后一次删除记录的键值同步。
已经进行了两次删除操作。
设3号玩家在线,那么原本3号玩家的uid被设置为1,done被设置为1;
而1,4号玩家不在线,初始done被设置为-1。
3.若(原)1号玩家重新上线,发现该玩家的done分数比#all要小
则从键值为0(-1+1)的删除记录开始遍历
第一次删除了0号玩家,0<1,所以该玩家的uid - 1=0
第二次删除了(原)2号玩家,也就是第一次删除后的1号玩家,1>0,所以该玩家的分数不变动
最后遍历完把该玩家的done分数与最后一次删除记录的键值同步
4.长时间没有登陆的玩家会被删去记录,那么该玩家所要同步的删除记录也可以被清理
前移操作真的有必要吗,反正在读取修改玩家记录的时候横竖都要遍历Data列表,为什么一定要把uid当作列表的索引值,而不是在每条玩家记录中把该玩家的uid直接塞进去?(类似 Data:[{Uid:0,Money:100,Items:[{id:"stone",Conut:2b}]},{Uid:2,Money:230,Items:[{id:"grass_block",Conut:5b}]},{Uid:1,Money:175,Items:[{id:"book",Conut:3b},{id:"stick",Conut:1b}]}])
{Delete:[{key:0,uid:0},{key:1,uid:1}]}
(第一次删了编号为1的玩家,第二次删了编号(原)为2的玩家)
2.玩家分数done记录该玩家已处理到的删除记录的键值。
记录删除记录总数的假实体#all的done分数被设置为1,与最后一次删除记录的键值同步。
已经进行了两次删除操作。
设3号玩家在线,那么原本3号玩家的uid被设置为1,done被设置为1;
而1,4号玩家不在线,初始done被设置为-1。
3.若(原)1号玩家重新上线,发现该玩家的done分数比#all要小
则从键值为0(-1+1)的删除记录开始遍历
第一次删除了0号玩家,0<1,所以该玩家的uid - 1=0
第二次删除了(原)2号玩家,也就是第一次删除后的1号玩家,1>0,所以该玩家的分数不变动
最后遍历完把该玩家的done分数与最后一次删除记录的键值同步
4.长时间没有登陆的玩家会被删去记录,那么该玩家所要同步的删除记录也可以被清理
前移操作真的有必要吗,反正在读取修改玩家记录的时候横竖都要遍历Data列表,为什么一定要把uid当作列表的索引值,而不是在每条玩家记录中把该玩家的uid直接塞进去?(类似 Data:[{Uid:0,Money:100,Items:[{id:"stone",Conut:2b}]},{Uid:2,Money:230,Items:[{id:"grass_block",Conut:5b}]},{Uid:1,Money:175,Items:[{id:"book",Conut:3b},{id:"stick",Conut:1b}]}])
为什么一定要把 uid 当作列表的索引值
这样的话不用比对玩家的 uid 和记录的 uid 是否相同,方便并且节省资源,例如:
```
Data = [0, 1, 2, 3, 4]
Temp = []
i = int(input('uid'))
while i > 0 :
Temp.append(Data[0])
del Data[0]
i -= 1
print(Data[0])
```