我正在 flutter 中创建一个 2D 游戏,使用 firebase 作为后端服务。
我如何根据他们的分数计算用户的排名。目前,我通过使用索引获得他们的排名,但如果两个或更多用户的分数相同,那么我如何向他们展示相同的排名位置。
这是代码:
StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance
.collection('teams')
.orderBy('points', descending: true)
.snapshots(),
builder: (context, snapshot) {
return ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index) {
return Container(
child: Text('Rank ${index +1}'),
);
});
},
),
这可能有效:只计算得分较高的元素的数量。我还添加了 _denseRank 函数,如果您想以这种方式显示它(例如,排名将变为 1、2、2、3、3 等)。这只计算得分较高的唯一元素的数量 - toSet() 用于删除重复项 - 即获取唯一值。
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatelessWidget {
final a=<int>[10,9,9,8,8,4,4];
int _rank(int index) => a.where( (element) => element>a[index]).length+1;
int _denseRank(int index) => a.where( (element) => element>a[index]).toSet().length+1;
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
for (var index=0; index<a.length;index++) Row(children: <Widget>[Text('Index $index'), Text('Rank ${_rank(index)}'), Text('Dense Rank ${_denseRank(index)}')])
]);
}
}