11 个版本
0.5.2 | 2023年8月11日 |
---|---|
0.5.1 | 2021年10月12日 |
0.4.2 | 2021年9月30日 |
0.3.2 | 2021年9月17日 |
0.1.0 | 2021年9月9日 |
#2 in #tournament
7MB
2K SLoC
社交比赛
这是一个为心爱的运动创建比赛赛程的库。
🏓 乒乓球 🏓
重点是尽可能在比赛中遇到更多的对手和队友。可以绘制单打或双打比赛。
示例
单打
获取单打比赛的轮次(循环赛)
use social_tournament::{Round, SocialTournament, TournamentConfig, TableConfig};
let mut tournament = SocialTournament::new(TournamentConfig::Single {
number_of_players: 12,
number_of_rounds: 2,
table_config: TableConfig { available_tables: 10, distribution_option: None }
});
tournament.draw().unwrap();
let rounds: Vec<Round> = tournament.rounds.unwrap();
/*
Creates:
Round number: 0
SingleMatch { a: 0, b: 9 }
SingleMatch { a: 1, b: 8 }
SingleMatch { a: 2, b: 7 }
SingleMatch { a: 3, b: 6 }
SingleMatch { a: 4, b: 5 }
--------------
Round number: 1
SingleMatch { a: 1, b: 9 }
SingleMatch { a: 2, b: 0 }
SingleMatch { a: 3, b: 8 }
SingleMatch { a: 4, b: 7 }
SingleMatch { a: 5, b: 6 }
--------------
...
*/
双打
如果您想获取双打比赛的轮次,您必须执行以下操作
use social_tournament::{Round, SocialTournament, TournamentConfig, TableConfig};
let mut tournament = SocialTournament::new(TournamentConfig::Double {
number_of_players: 24,
number_of_rounds: 2,
draw_option: None,
table_config: TableConfig { available_tables: 10, distribution_option: None }
});
tournament.draw().unwrap();
let rounds: Vec<Round> = tournament.rounds.unwrap();
/*
Creates:
Round number: 0
DoubleMatch { double_a: (2, 37), double_b: (1, 38) }
DoubleMatch { double_a: (3, 36), double_b: (4, 35) }
DoubleMatch { double_a: (5, 34), double_b: (6, 33) }
DoubleMatch { double_a: (7, 32), double_b: (8, 31) }
DoubleMatch { double_a: (9, 30), double_b: (10, 29) }
DoubleMatch { double_a: (11, 28), double_b: (12, 27) }
DoubleMatch { double_a: (13, 26), double_b: (14, 25) }
DoubleMatch { double_a: (15, 24), double_b: (16, 23) }
DoubleMatch { double_a: (17, 22), double_b: (18, 21) }
--------------
Round number: 1
DoubleMatch { double_a: (20, 21), double_b: (2, 0) }
DoubleMatch { double_a: (3, 38), double_b: (7, 34) }
DoubleMatch { double_a: (4, 37), double_b: (6, 35) }
DoubleMatch { double_a: (5, 36), double_b: (9, 32) }
DoubleMatch { double_a: (8, 33), double_b: (10, 31) }
DoubleMatch { double_a: (11, 30), double_b: (15, 26) }
DoubleMatch { double_a: (12, 29), double_b: (14, 27) }
DoubleMatch { double_a: (13, 28), double_b: (17, 24) }
DoubleMatch { double_a: (16, 25), double_b: (18, 23) }
--------------
...
*/
双打选项
对于不能被4完全整除的玩家数量,您可以选择三种 DrawOption
。根据所选选项,您可以有只有3名球员的双打比赛、单打比赛或免赛球员。您必须确保在赛程后处理中正确地处理玩家ID >= number_of_players
。例如,您可以将其标记为免赛。
表格分配
比赛在房间或体育馆的桌子上进行。如果比赛被抽签,您可以将每轮的比赛分配到可用的桌子上。指定您在房间或体育馆中可以为比赛提供的桌子数量。算法确保形成足够的子轮次。您可以通过提供分配选项来指定形成方法。根据您选择的选项,可以在子轮次中进行尽可能多的比赛,或者在子轮次中主要进行比赛。
use social_tournament::{Round, SocialTournament, TournamentConfig, TableConfig};
use social_tournament::table::Table;
let mut tournament = SocialTournament::new(TournamentConfig::Double {
number_of_players: 24,
number_of_rounds: 2,
draw_option: None,
table_config: TableConfig { available_tables: 10, distribution_option: None }
});
tournament.draw().unwrap();
tournament.distribute().unwrap();
let tables: Vec<Vec<Table>> = tournament.tables.unwrap();
/*
Creates:
Table { table_number: 0, occupied_number: 0 }
Table { table_number: 1, occupied_number: 0 }
Table { table_number: 2, occupied_number: 0 }
Table { table_number: 3, occupied_number: 0 }
Table { table_number: 0, occupied_number: 1 }
Table { table_number: 1, occupied_number: 1 }
--------------
Table { table_number: 0, occupied_number: 0 }
Table { table_number: 1, occupied_number: 0 }
Table { table_number: 2, occupied_number: 0 }
Table { table_number: 3, occupied_number: 0 }
Table { table_number: 0, occupied_number: 1 }
Table { table_number: 1, occupied_number: 1 }
--------------
*/
创建 PDF
目前,只有双打比赛可以生成路线卡作为 PDF。将来将会有单打和裁判表生成。支持的语言有英语和德语。
use social_tournament::{Round, SocialTournament, TournamentConfig, TableConfig};
use social_tournament::table::Table;
use social_tournament::pdf::language::Language;
let mut tournament = SocialTournament::new(TournamentConfig::Double {
number_of_players: 24,
number_of_rounds: 2,
draw_option: None,
table_config: TableConfig { available_tables: 10, distribution_option: None }
});
tournament.draw().unwrap();
tournament.distribute().unwrap();
tournament.create_route_cards_pdf(Language::EN).unwrap();
let pdf: Vec<u8> = tournament.pdf.unwrap();
一个示例 PDF 看起来像这样 这个。
许可
根据您选择的以下任一项许可
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您提交的任何贡献,根据 Apache-2.0 许可证的定义,应按上述方式双许可,不附加任何额外条款或条件。
依赖
~18MB
~137K SLoC