clean options and implement undo
This commit is contained in:
parent
256c56d841
commit
fb9e31c9af
|
@ -9,7 +9,7 @@ use std::io::*;
|
||||||
use std::result::Result;
|
use std::result::Result;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use chess::{Board, ChessMove, Game};
|
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(120 * 60)), None);
|
||||||
|
@ -60,12 +60,9 @@ pub enum Player {
|
||||||
Engine { elo: Option<u32> },
|
Engine { elo: Option<u32> },
|
||||||
}
|
}
|
||||||
pub enum GameOption {
|
pub enum GameOption {
|
||||||
WhiteTotalTime { value: Option<Duration> },
|
TotalTime { color: Color, value: Option<Duration> },
|
||||||
BlackTotalTime { value: Option<Duration> },
|
Increment { color: Color, value: Option<Duration> },
|
||||||
WhiteIncrement { value: Option<Duration> },
|
Player {color: Color, value: Player},
|
||||||
BlackIncrement { value: Option<Duration> },
|
|
||||||
WhitePlayer { value: Player },
|
|
||||||
BlackPlayer { value: Player },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
|
@ -88,41 +85,26 @@ impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
pub fn game_option(&mut self, option: GameOption) -> GameOption {
|
pub fn game_option(&mut self, option: GameOption) -> GameOption {
|
||||||
let old_value: GameOption;
|
let old_value: GameOption;
|
||||||
match option {
|
match option {
|
||||||
GameOption::WhiteTotalTime { value } => {
|
GameOption::TotalTime { color, value } => {
|
||||||
old_value = GameOption::WhiteTotalTime {
|
old_value = GameOption::TotalTime {
|
||||||
value: self.time[Color::White.to_index()].0,
|
color,
|
||||||
|
value: self.time[color.to_index()].0,
|
||||||
};
|
};
|
||||||
self.time[Color::White.to_index()].0 = value
|
self.time[color.to_index()].0 = value
|
||||||
}
|
}
|
||||||
GameOption::BlackTotalTime { value } => {
|
GameOption::Increment { color, value } => {
|
||||||
old_value = GameOption::BlackTotalTime {
|
old_value = GameOption::Increment {
|
||||||
value: self.time[Color::Black.to_index()].0,
|
color,
|
||||||
|
value: self.time[color.to_index()].1,
|
||||||
};
|
};
|
||||||
self.time[Color::Black.to_index()].0 = value
|
self.time[color.to_index()].1 = value
|
||||||
}
|
}
|
||||||
GameOption::WhiteIncrement { value } => {
|
GameOption::Player { color, value } => {
|
||||||
old_value = GameOption::WhiteIncrement {
|
old_value = GameOption::Player {
|
||||||
value: self.time[Color::White.to_index()].1,
|
color,
|
||||||
|
value: self.player[color.to_index()],
|
||||||
};
|
};
|
||||||
self.time[Color::White.to_index()].1 = value
|
self.player[color.to_index()] = value
|
||||||
}
|
|
||||||
GameOption::BlackIncrement { value } => {
|
|
||||||
old_value = GameOption::BlackIncrement {
|
|
||||||
value: self.time[Color::Black.to_index()].1,
|
|
||||||
};
|
|
||||||
self.time[Color::Black.to_index()].1 = value
|
|
||||||
}
|
|
||||||
GameOption::WhitePlayer { value } => {
|
|
||||||
old_value = GameOption::WhitePlayer {
|
|
||||||
value: self.player[Color::White.to_index()],
|
|
||||||
};
|
|
||||||
self.player[Color::White.to_index()] = value
|
|
||||||
}
|
|
||||||
GameOption::BlackPlayer { value } => {
|
|
||||||
old_value = GameOption::WhitePlayer {
|
|
||||||
value: self.player[Color::Black.to_index()],
|
|
||||||
};
|
|
||||||
self.player[Color::Black.to_index()] = value
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,6 +165,29 @@ impl<Fi: Read, Fo: Write> UciEngine<Fi, Fo> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn back_move(&mut self) -> Option<ChessMove> {
|
||||||
|
let mut actions = self.game.actions().clone();
|
||||||
|
let mut last_move = None;
|
||||||
|
loop{
|
||||||
|
match actions.pop() {
|
||||||
|
Some(Action::MakeMove(last)) => {
|
||||||
|
last_move = Some(last);
|
||||||
|
break;
|
||||||
|
},
|
||||||
|
None => break,
|
||||||
|
_ => continue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.new_game();
|
||||||
|
for action in actions {
|
||||||
|
if let Action::MakeMove(chessmove) = action {
|
||||||
|
self.make_move(chessmove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
last_move
|
||||||
|
}
|
||||||
|
|
||||||
fn terminate(&mut self, reason: &str) {
|
fn terminate(&mut self, reason: &str) {
|
||||||
self.uciok = false;
|
self.uciok = false;
|
||||||
info!("UCI termination: {}", reason);
|
info!("UCI termination: {}", reason);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
extern crate chess;
|
extern crate chess;
|
||||||
extern crate chess_uci;
|
extern crate chess_uci;
|
||||||
|
|
||||||
use chess::ChessMove;
|
use chess::{ChessMove, Color};
|
||||||
use chess_uci::uci_command::EngineCommand;
|
use chess_uci::uci_command::EngineCommand;
|
||||||
use chess_uci::*;
|
use chess_uci::*;
|
||||||
|
|
||||||
|
@ -28,10 +28,12 @@ pub fn main() {
|
||||||
process.stdout.expect("Program stdout"),
|
process.stdout.expect("Program stdout"),
|
||||||
);
|
);
|
||||||
let mut uci = UciEngine::new(Some(sf_out), Some(sf_in));
|
let mut uci = UciEngine::new(Some(sf_out), Some(sf_in));
|
||||||
uci.game_option(GameOption::WhitePlayer {
|
uci.game_option(GameOption::Player {
|
||||||
|
color: Color::White,
|
||||||
value: Player::Human { elo: None },
|
value: Player::Human { elo: None },
|
||||||
});
|
});
|
||||||
uci.game_option(GameOption::BlackPlayer {
|
uci.game_option(GameOption::Player {
|
||||||
|
color: Color::Black,
|
||||||
value: Player::Engine { elo: Some(1500) },
|
value: Player::Engine { elo: Some(1500) },
|
||||||
});
|
});
|
||||||
uci.init();
|
uci.init();
|
||||||
|
|
Loading…
Reference in New Issue