#时钟 #国际象棋 #玩家 #future #per #基于future的 #类似于timeout的

nightly chess_clock

一个基于future的国际象棋时钟,为其他future提供类似于timeout的功能。

2个版本

使用旧的Rust 2015

0.1.1 2018年11月1日
0.1.0 2018年11月1日

#45 in #per

GPL-3.0-or-later

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);

输出:任务成功,因为示例任务持续时间小于第一个玩家的基础时间 + 每回合时间

实现细节

ChessClockARCed 和 (rw-mutexed)std::sync::RwLock,以便与借用检查器很好地协同工作,但由于其设计本质上是回合的顺序传递,因此不应由两个线程同时使用。

它跟踪每个玩家的计时,一个全局的每回合时间,活跃玩家索引和最后回合传递的时间,因此它可以计算从下一个活跃玩家的时钟中减去的时间。

依赖关系

~3MB
~45K SLoC