time control
This commit is contained in:
parent
4dd643f66b
commit
26a15985a8
|
@ -12,7 +12,7 @@ use std::time::Duration;
|
||||||
use chess::{Board, ChessMove, Game, Action};
|
use chess::{Board, ChessMove, Game, Action};
|
||||||
|
|
||||||
const DEFAULT_TIME: (Option<Duration>, Option<Duration>) =
|
const DEFAULT_TIME: (Option<Duration>, Option<Duration>) =
|
||||||
(Some(Duration::from_secs(120 * 60)), None);
|
(Some(Duration::from_secs(90 * 60)), None);
|
||||||
|
|
||||||
/// Structure used to manage a chess game with a uci engine.
|
/// Structure used to manage a chess game with a uci engine.
|
||||||
///
|
///
|
||||||
|
@ -44,7 +44,7 @@ pub struct UciEngine<Fi: Read, Fo: Write> {
|
||||||
initial: Board,
|
initial: Board,
|
||||||
game: Game,
|
game: Game,
|
||||||
/// white (total, incr), black (total, incr)
|
/// white (total, incr), black (total, incr)
|
||||||
time: [(Option<Duration>, Option<Duration>); 2],
|
timer: [(Option<Duration>, Option<Duration>); 2],
|
||||||
/// white, black
|
/// white, black
|
||||||
player: [Player; 2],
|
player: [Player; 2],
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
uciok: false,
|
uciok: false,
|
||||||
initial: Board::default(),
|
initial: Board::default(),
|
||||||
game: Game::new(),
|
game: Game::new(),
|
||||||
time: [DEFAULT_TIME; 2],
|
timer: [DEFAULT_TIME; 2],
|
||||||
player: [Player::Human { elo: None }; 2],
|
player: [Player::Human { elo: None }; 2],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,16 +88,16 @@ impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
GameOption::TotalTime { color, value } => {
|
GameOption::TotalTime { color, value } => {
|
||||||
old_value = GameOption::TotalTime {
|
old_value = GameOption::TotalTime {
|
||||||
color,
|
color,
|
||||||
value: self.time[color.to_index()].0,
|
value: self.timer[color.to_index()].0,
|
||||||
};
|
};
|
||||||
self.time[color.to_index()].0 = value
|
self.timer[color.to_index()].0 = value
|
||||||
}
|
}
|
||||||
GameOption::Increment { color, value } => {
|
GameOption::Increment { color, value } => {
|
||||||
old_value = GameOption::Increment {
|
old_value = GameOption::Increment {
|
||||||
color,
|
color,
|
||||||
value: self.time[color.to_index()].1,
|
value: self.timer[color.to_index()].1,
|
||||||
};
|
};
|
||||||
self.time[color.to_index()].1 = value
|
self.timer[color.to_index()].1 = value
|
||||||
}
|
}
|
||||||
GameOption::Player { color, value } => {
|
GameOption::Player { color, value } => {
|
||||||
old_value = GameOption::Player {
|
old_value = GameOption::Player {
|
||||||
|
@ -359,8 +359,8 @@ impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
option: Opt::UCIElo { value: elo },
|
option: Opt::UCIElo { value: elo },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
let (wtime, wincr) = self.time[Color::White.to_index()];
|
let (wtime, wincr) = self.timer[Color::White.to_index()];
|
||||||
let (btime, bincr) = self.time[Color::Black.to_index()];
|
let (btime, bincr) = self.timer[Color::Black.to_index()];
|
||||||
self.push(GuiCommand::Go {
|
self.push(GuiCommand::Go {
|
||||||
wtime,
|
wtime,
|
||||||
wincr,
|
wincr,
|
||||||
|
@ -397,5 +397,19 @@ impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
pub fn side_to_move(&self) -> Color {
|
pub fn side_to_move(&self) -> Color {
|
||||||
self.game.side_to_move()
|
self.game.side_to_move()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clock(&self, color: Color) -> Option<Duration> {
|
||||||
|
self.timer[if color == Color::White {0} else {1}].0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_clock(&mut self, elapsed: Duration) {
|
||||||
|
let index = if self.side_to_move() == Color::White {0} else {1};
|
||||||
|
self.timer[index] =
|
||||||
|
match self.timer[index] {
|
||||||
|
(Some(base), None) => (Some(base - elapsed), None),
|
||||||
|
(Some(base), Some(incr)) => (Some(base - elapsed + incr), Some(incr)),
|
||||||
|
_ => (None, None)
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// LocalWords: uci
|
// LocalWords: uci
|
||||||
|
|
Loading…
Reference in New Issue