#tournament #social #sport #double #tabletennis

social_tournament

创建社交双打或单打比赛的库

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

MIT/Apache

7MB
2K SLoC

crates.io Documentation Workflow License License: MIT

社交比赛

这是一个为心爱的运动创建比赛赛程的库。

🏓 乒乓球 🏓

重点是尽可能在比赛中遇到更多的对手和队友。可以绘制单打或双打比赛。

示例

单打

获取单打比赛的轮次(循环赛)

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-2.0 许可证的定义,应按上述方式双许可,不附加任何额外条款或条件。

依赖

~18MB
~137K SLoC