Skip to content

Commit

Permalink
Create team ranking algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
SiekamCebule committed Nov 10, 2024
1 parent ab576d6 commit 5f21b97
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 24 deletions.
39 changes: 39 additions & 0 deletions lib/algorithms/jumpers_ranking/country_team_ranking_creator.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import 'package:sj_manager/models/simulation/flow/jumper_dynamic_params.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';

class CountryTeamRankingCreator {
const CountryTeamRankingCreator({
required this.jumpers,
required this.dynamicParams,
});

final List<Jumper> jumpers;
final Map<Jumper, JumperDynamicParams> dynamicParams;

List<Jumper> create() {
final ratings = {
for (final jumper in jumpers) jumper: _calculateRating(jumper),
};
final sorted = List.of(jumpers)
..sort((first, second) {
return ratings[second]!.compareTo(ratings[first]!);
});
return sorted;
}

double _calculateRating(Jumper jumper) {
return (jumper.skills.takeoffQuality / 1) +
(jumper.skills.flightQuality / 1) +
(jumper.skills.landingQuality / 10) +
(dynamicParams[jumper]!.jumpsConsistency / 1.5) +
(dynamicParams[jumper]!.form * 2);
}
}

/*
takeoff quality: 15
flight quality: 15
landing quality: 15 / 10
jumps consistency: 14 / 1.5
form: 10 * 2
*/
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';
import 'package:sj_manager/ui/screens/simulation/large/widgets/simulation_jumper_image.dart';

class JumperInRankingTile extends StatelessWidget {
const JumperInRankingTile({
super.key,
required this.jumper,
required this.position,
this.onTap,
});

final Jumper jumper;
final int position;
final VoidCallback? onTap;

@override
Widget build(BuildContext context) {
return ListTile(
leading: Text(
position.toString(),
style: Theme.of(context).textTheme.bodyLarge,
),
trailing: SimulationJumperImage(
jumper: jumper,
width: 25,
),
title: Text(jumper.nameAndSurname()),
onTap: onTap,
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';
import 'package:sj_manager/ui/reusable_widgets/jumpers_ranking/jumper_in_ranking_tile.dart';

class TeamJumpersRankingList extends StatelessWidget {
const TeamJumpersRankingList({
super.key,
required this.jumpers,
});

final List<Jumper> jumpers;

@override
Widget build(BuildContext context) {
return ListView(
children: [
for (var i = 0; i < jumpers.length; i++)
JumperInRankingTile(
jumper: jumpers[i],
position: i + 1,
),
],
);
}
}
41 changes: 20 additions & 21 deletions lib/ui/screens/simulation/large/subscreens/__teams_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -157,23 +157,26 @@ class _ListView extends StatelessWidget {
await showDialog(
context: context,
builder: (context) {
return MultiProvider(
providers: [
Provider.value(value: flagsRepo),
],
child: Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(15),
child: Container(
width: MediaQuery.of(context).size.width * 0.7,
height: MediaQuery.of(context).size.height * 0.8,
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceContainerHigh,
borderRadius: BorderRadius.circular(15),
),
child: CountryTeamProfileWidget(
team: team,
return BlocProvider.value(
value: context.read<SimulationDatabaseCubit>(),
child: MultiProvider(
providers: [
Provider.value(value: flagsRepo),
],
child: Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(15),
child: Container(
width: MediaQuery.of(context).size.width * 0.7,
height: MediaQuery.of(context).size.height * 0.8,
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceContainerHigh,
borderRadius: BorderRadius.circular(15),
),
child: CountryTeamProfileWidget(
team: team,
),
),
),
),
Expand All @@ -187,7 +190,3 @@ class _ListView extends StatelessWidget {
);
}
}

// francja
// musi zawierac f i r
// fr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:gap/gap.dart';
import 'package:material_symbols_icons/material_symbols_icons.dart';
import 'package:sj_manager/models/user_db/team/country_team/country_team.dart';
import 'package:sj_manager/ui/reusable_widgets/countries/country_flag.dart';
import 'package:sj_manager/ui/screens/simulation/large/widgets/teams/country_team_profile/overview/country_team_profile_overview.dart';
import 'package:sj_manager/utils/icons.dart';

class CountryTeamProfileWidget extends StatefulWidget {
Expand Down Expand Up @@ -42,7 +43,7 @@ class _CountryTeamProfileWidgetState extends State<CountryTeamProfileWidget> {
length: 3,
child: Column(
children: [
TabBar(
const TabBar(
tabs: [
Tab(
text: 'Przegląd',
Expand All @@ -57,7 +58,22 @@ class _CountryTeamProfileWidgetState extends State<CountryTeamProfileWidget> {
icon: Icon(Symbols.analytics),
),
],
)
),
const Gap(10),
Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 5),
child: TabBarView(
children: [
CountryTeamProfileOverview(
countryTeam: widget.team,
),
const Placeholder(),
const Placeholder(),
],
),
),
),
],
),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:sj_manager/algorithms/jumpers_ranking/country_team_ranking_creator.dart';
import 'package:sj_manager/bloc/simulation/simulation_database_cubit.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';
import 'package:sj_manager/models/user_db/team/country_team/country_team.dart';
import 'package:sj_manager/ui/reusable_widgets/card_with_title.dart';
import 'package:sj_manager/ui/reusable_widgets/jumpers_ranking/team_jumpers_ranking_list.dart';

class CountryTeamProfileOverview extends StatelessWidget {
const CountryTeamProfileOverview({
super.key,
required this.countryTeam,
});

final CountryTeam countryTeam;

@override
Widget build(BuildContext context) {
final database = context.watch<SimulationDatabaseCubit>().state;
final subteams = database.subteamJumpers.keys.where(
(subteam) => subteam.parentTeam == countryTeam,
);
final unorderedJumpers = <Jumper>[];
for (var subteam in subteams) {
final jumperIds = database.subteamJumpers[subteam]!;
unorderedJumpers.addAll(
jumperIds.map((id) => database.idsRepo.get(id) as Jumper),
);
}
final ranking = CountryTeamRankingCreator(
jumpers: unorderedJumpers, dynamicParams: database.jumperDynamicParams)
.create();

return Row(
children: [
SizedBox(
width: 250,
child: CardWithTitle(
title: Text(
'Ranking',
style: Theme.of(context).textTheme.headlineSmall,
),
child: TeamJumpersRankingList(
jumpers: ranking,
),
),
)
],
);
}
}

// ranking skoczków
// perspektywa
// podstawowe rekordy (wygranych konkursow druż pś, wygranych konkursów ind pś)
// gwiazdki
// płeć na fladze
//
2 changes: 1 addition & 1 deletion lib/ui/screens/simulation/simulation_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import 'package:sj_manager/ui/screens/simulation/large/widgets/team/team_screen/
import 'package:sj_manager/ui/screens/simulation/large/widgets/team/team_screen/team_screen_personal_coach_bottom_bar.dart';
import 'package:sj_manager/ui/screens/simulation/large/widgets/team/team_screen/team_summary_card.dart';
import 'package:sj_manager/ui/screens/simulation/large/widgets/teams/country_team_overview_list_tile.dart';
import 'package:sj_manager/ui/screens/simulation/large/widgets/teams/country_team_profile_widget.dart';
import 'package:sj_manager/ui/screens/simulation/large/widgets/teams/country_team_profile/country_team_profile_widget.dart';
import 'package:sj_manager/utils/filtering.dart';
import 'package:sj_manager/utils/show_dialog.dart';
import 'package:sj_manager/utils/translating.dart';
Expand Down

0 comments on commit 5f21b97

Please sign in to comment.