aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs103
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));
}
}