2个版本
使用旧的Rust 2015
0.1.1 | 2018年11月1日 |
---|---|
0.1.0 | 2018年11月1日 |
#45 in #per
16KB
163 代码行,不包括注释
chess_clock
一个基于future的国际象棋时钟,为其他future提供类似于timeout的功能。
请参阅文档(待链接)以获取更多信息,包括示例用法。
lib.rs
:
一个基于future的国际象棋时钟,为其他future提供类似于timeout的功能。
除了典型的可配置的基础时间和每回合时间外,ChessClock
还支持 [1, usize::max] 个玩家,这在支持多于两个玩家的计时制回合制游戏中很有用,例如 Hanabi。
根据FIDE规则,每回合时间在第一步移动时增加。
示例用法
extern crate futures;
extern crate tokio;
extern crate chess_clock;
use chess_clock::{ChessClock, BaseTime, TimePerTurn};
use std::thread::sleep;
use std::time::{Duration, Instant};
use futures::{prelude::*, future::{self, ok, err, Either, FutureResult}};
use tokio;
use tokio::timer::Delay;
let mut clock = ChessClock::new(
2,
BaseTime(Duration::new(2, 0)),
TimePerTurn(Duration::new(2, 0)),
);
let when = Instant::now() + Duration::from_secs(2);
let task = Delay::new(when)
.map_err(|_| ());
let clocked_task = clock.bind(task)
.then(|res| {
match res {
Ok(Some(_)) => {
println!("Task succeeded");
ok(())
},
Ok(None) => {
println!("Task timed out");
ok(())
},
_ => {
err(())
}
}
}
);
tokio::run(clocked_task);
输出:任务成功
,因为示例任务持续时间小于第一个玩家的基础时间 + 每回合时间
实现细节
ChessClock
是 ARCed 和 (rw-mutexed)std::sync::RwLock,以便与借用检查器很好地协同工作,但由于其设计本质上是回合的顺序传递,因此不应由两个线程同时使用。
它跟踪每个玩家的计时,一个全局的每回合时间,活跃玩家索引和最后回合传递的时间,因此它可以计算从下一个活跃玩家的时钟中减去的时间。
依赖关系
~3MB
~45K SLoC