Bläddra i källkod

working on it

Nicolas Winkler 3 år sedan
förälder
incheckning
dfbf01b553
5 ändrade filer med 68 tillägg och 6 borttagningar
  1. 1 1
      Cargo.toml
  2. 11 5
      src/engine.rs
  3. 28 0
      src/game.rs
  4. 18 0
      src/interface.rs
  5. 10 0
      src/movegen.rs

+ 1 - 1
Cargo.toml

@@ -3,4 +3,4 @@ name = "bishop"
 version = "0.1.0"
 authors = ["Nicolas Winkler <nicolas.winkler@gmx.ch>"]
 
-[dependencies]
+[dependencies]

+ 11 - 5
src/engine.rs

@@ -7,7 +7,7 @@ use movegen::*;
 use std::sync::mpsc::{Receiver, Sender};
 
 pub enum EngineMsg {
-    SetBoard([Bitboard; 12]),
+    SetBoard(Game),
     SetPiece(Bitboard),
     Search(i32),
     Ping,
@@ -38,11 +38,19 @@ pub fn run_engine(r: Receiver<EngineMsg>, s: Sender<InterfaceMsg>) {
         //game.pieces[10] = 0x4000_0000_0000_0000;
 
         match msg {
-            EngineMsg::SetBoard(_) => { println!("SetBoard") },
+            EngineMsg::SetBoard(g) => {
+                println!("SetBoard");
+                game = g;
+            },
             EngineMsg::SetPiece(_) => { println!("SetPiece") },
-            EngineMsg::Search(depth) => { println!("Search {}", depth) },
+            EngineMsg::Search(depth) => {
+                println!("Search {}", depth);
+                let best_move = search(&game, depth);
+                println!("bestmove {:?}", best_move);
+            },
             EngineMsg::Ping => { println!("Ping") },
             EngineMsg::Stop => { println!("Stop") },
+            EngineMsg::NewGame => { println!("NewGame") },
             EngineMsg::GetState => { println!("GetState") },
             EngineMsg::GetInfo => { println!("GetInfo") },
         }
@@ -50,8 +58,6 @@ pub fn run_engine(r: Receiver<EngineMsg>, s: Sender<InterfaceMsg>) {
         println!("{}", game.beautiful_print());
 
         //let moves = generate_moves(&game, WHITE);
-        let best_move = search(&game, 2);
-        println!("bestmove {:?}", best_move);
     }
 }
 

+ 28 - 0
src/game.rs

@@ -84,6 +84,34 @@ impl Game {
         None
     }
 
+    pub fn parse_move(&self, mov: &str) -> Result<Move, ()> {
+        if mov.len() < 4 {
+            Err(())
+        }
+        else {
+            let origin = Move::parse_square(&mov[0..2]);
+            let target = Move::parse_square(&mov[2..4]);
+
+            if let (Some(from), Some(to)) = (origin, target) {
+                let (piece_type, side) = self.get_square(from);
+
+                if side != self.turn { // wrong side to move
+                    return Err(());
+                }
+                
+                if mov.len() == 5 {
+                    Err(())
+                }
+                else {
+                    Ok(Move::Default{ mov: SimpleMove{ from, to }, piece_type })
+                }
+            }
+            else {
+                Err(())
+            }
+        }
+    }
+
     pub fn bitboard(&self, pt: PieceType, side: Side) -> Bitboard {
         if side == BLACK {
             self.pieces[(pt + 6) as usize]

+ 18 - 0
src/interface.rs

@@ -4,6 +4,7 @@ use std::sync::mpsc::{Receiver, Sender};
 use std::process::exit;
 
 use engine::{EngineMsg, InterfaceMsg};
+use game::{Game};
 
 
 pub fn run(r: Receiver<InterfaceMsg>, s: Sender<EngineMsg>) {
@@ -22,6 +23,7 @@ fn run_command(mut cmd: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<Engine
         match command {
             "uci" => cmd_uci(cmd),
             "isready" => cmd_isready(cmd),
+            "position" => cmd_position(cmd, r, s),
             "go" => cmd_go(cmd, r, s),
             "ucinewgame" => cmd_newgame(cmd, r, s),
             "quit" | "exit" => cmd_quit(cmd, r, s),
@@ -40,6 +42,22 @@ fn cmd_isready(_args: Vec<&str>) {
     println!("readyok");
 }
 
+fn cmd_position(mut args: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
+    let position = args[0];
+    args.drain(0..1);
+
+    let mut game = Game::default();
+    if position == "startpos" {
+
+    }
+    else if position == "fen" {
+        let fen_parts: Vec<String> = Vec::from(&args[1..6]).into_iter().map(|x| x.to_owned()).collect::<Vec<String>>();
+        
+        // "3N4/5P2/2K1P1pP/p2PNn2/1p3r2/2P4P/4k2B/8 w - - 0 1"
+    }
+    s.send(EngineMsg::SetBoard(game)).unwrap();
+}
+
 fn cmd_go(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
     s.send(EngineMsg::Search(3)).unwrap();
 }

+ 10 - 0
src/movegen.rs

@@ -38,6 +38,16 @@ impl Default for Move {
     }
 }
 
+
+impl Move {
+    pub fn parse_square(sq: &str) -> Option<Square> {
+        let col = sq.chars().nth(0)?;
+        let row = sq.chars().nth(1)?;
+
+        Some((row as u8 - '1' as u8) * 8 + (col as u8 - 'a' as u8))
+    }
+}
+
 /**
  * @brief Iterator to serialize bitboard bit for bit
  *