diff options
-rw-r--r-- | src/main.rs | 103 |
1 files changed, 66 insertions, 37 deletions
diff --git a/src/main.rs b/src/main.rs index 13af134..88e878d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,54 +1,83 @@ use std::{f32::INFINITY, time::{Duration, Instant}}; +use std::env; + +use chessnost::board::{Board, Color}; + +fn opponent_move(board: &mut Board) { + let mov = match board.read_move() { + Ok(m) => m, + Err(e) => { + println!("Error: {}", e); + return opponent_move(board); + } + }; + print!("{:?}", mov); + board.make_move(mov); + board.print(); +} + +fn computer_move(board: &mut Board, time_left: &mut Duration) { + let allowed_move_duration = *time_left / 20; + let max_depth = 6 + (board.ply as i32 / 15) as u8; + println!("~{:?} left, allocating {:?} for a move", time_left, allowed_move_duration); + + let move_start = Instant::now(); + let (score, pv) = board.iterative_deepening(max_depth, allowed_move_duration); + let elapsed = move_start.elapsed(); + + if *time_left >= elapsed { + *time_left -= elapsed; + } else { + println!("You are probably out of time. I will keep going anyway..."); + } + + println!("Finished in {:?}: score={:?}", elapsed, score); + + let mov = pv[0]; + println!("{:?}", mov); + board.make_move(mov); + board.print(); +} -use chessnost::board::Board; fn main() { - let increment = Duration::from_secs(0); - let mut time_left = Duration::from_secs(60 * 10); + let args: Vec<String> = env::args().collect(); + assert!(args.len() >= 3, "Provide all arguments [COLOR] [TIME_MINUTES] [INCREMENT_SECONDS]"); + + let color = match args[1].as_str() { + "w" => Color::White, + "b" => Color::Black, + _ => panic!("Please provide a color [w|b]") + }; + + let mut time_left = Duration::from_secs(match args[2].parse() { + Ok(x) => x, + Err(..) => 15 + }); + + let increment = Duration::from_secs(match args[3].parse() { + Ok(x) => x, + Err(..) => 10 + }); let manual_decrement = Duration::from_secs(7); // Time to sync moves with the game + // let fen = String::from("8/8/8/1r6/3NK3/5Q2/5p2/5k2 w - - 0 1"); let mut board = Board::new(); board.print(); - loop { time_left += increment; time_left -= manual_decrement; - let mov = match board.read_move() { - Ok(m) => m, - Err(e) => { - println!("Error: {}", e); - continue; + match color { + Color::White => { + computer_move(&mut board, &mut time_left); + opponent_move(&mut board); + } + Color::Black => { + opponent_move(&mut board); + computer_move(&mut board, &mut time_left); } - }; - print!("{:?}", mov); - board.make_move(mov); - board.print(); - - let allowed_move_duration = time_left / 20; - let max_depth = 6 + (board.ply as i32 / 15) as u8; - println!("~{:?} left, allocating {:?} for a move", time_left, allowed_move_duration); - - let move_start = Instant::now(); - let (score, pv) = board.iterative_deepening(max_depth, allowed_move_duration); - let elapsed = move_start.elapsed(); - - if time_left >= elapsed { - time_left -= elapsed; - } else { - println!("You are probably out of time. I will keep going anyway..."); } - - println!("Finished in {:?}: score={:?}", elapsed, score); - - let mov = pv[0]; - println!("{:?}", mov); - board.make_move(mov); - board.print(); - println!("Score for {:?} is now: {}", board.color(), board.quiscence(-INFINITY, INFINITY)); - - println!("\nPondering for 3 seconds..."); - board.iterative_deepening(max_depth - 1, Duration::from_secs(3)); } } |