소스 검색

better king safety

Nicolas Winkler 2 년 전
부모
커밋
f5b6ab7001
2개의 변경된 파일23개의 추가작업 그리고 14개의 파일을 삭제
  1. 5 2
      src/engine.rs
  2. 18 12
      src/evaluate.rs

+ 5 - 2
src/engine.rs

@@ -96,7 +96,7 @@ impl Engine {
     }
 
     pub fn run(&mut self) {
-        panic::set_hook(Box::new(|panic_info| {
+        /*panic::set_hook(Box::new(|panic_info| {
             if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
                 info!("panic occurred: {s:?}");
                 println!("panic occurred: {s:?}");
@@ -104,7 +104,7 @@ impl Engine {
                 info!("panic occurred");
                 println!("panic occurred");
             }
-        }));
+        }));*/
         while let Some(msg) = self.dequeue_message() {
             match msg {
                 EngineMsg::SetBoard{ pos, moves } => {
@@ -313,6 +313,9 @@ impl Engine {
                     let infostring = format!("info depth {} score mate {} time {} nodes {} nps {} hashfull {} pv{}", depth, turns, elapsed.as_millis(), nodes, nps, hashfull, pv);
                     println!("{}", infostring);
                     info!("{}", infostring);
+                    if si.depth.is_none() {
+                        break;
+                    }
                 }
                 else {
                     let infostring = format!("info depth {} score cp {} time {} nodes {} nps {} hashfull {} pv{}", depth, cp, elapsed.as_millis(), nodes, nps, hashfull, pv);

+ 18 - 12
src/evaluate.rs

@@ -158,27 +158,33 @@ fn castling_rights(game: &Game, side: Side) -> PosValue {
 
 fn king_safety(game: &Game, side: Side) -> PosValue {
     let king = game.get_piece(KING, side);
-    let area = north_one(king)
-             | south_one(king)
-             | northeast_one(king)
-             | northwest_one(king)
-             | southwest_one(king)
-             | southeast_one(king);
+    let king_leftright = west_one(king) | king | east_one(king);
+    let area = north_one(king_leftright) | king_leftright | south_one(king_leftright);
     
     let guards = game.get_all_side(side) & area;
     let attackers = game.get_all_side(!side) & area;
 
-    let backrow =  if king & (ROW_1 | ROW_8) != 0 { 50 } else { 0 };
+    let backrow =  if king & ((ROW_1 | ROW_8) & !(FILE_D | FILE_E)) != 0 { 20 } else { 0 };
+    let pawn_shield_mask = north_one(king_leftright) | north_one(north_one(king_leftright));
+    let pawn_shield = ((pawn_shield_mask & game.pawns(side)).count_ones() * 8) as PosValue;
 
-    let kneighbors = guards.count_ones() as PosValue * 8 - attackers.count_ones() as PosValue * 15;
+    let kneighbors = guards.count_ones() as PosValue * 3 - attackers.count_ones() as PosValue * 12;
 
     let enemies = game.get_all_side(!side);
 
-    let row_opponents = enemies & (populate_rows(king));
-    let dang_row_opponents = row_opponents & (ROW_1 | ROW_2 | ROW_7 | ROW_8);
-    let danger_value = (dang_row_opponents.count_ones() * 50) as PosValue;
+    if king != 0 {
+        let diag_rays = generate_sliding_destinations(king, 0, king, false, true);
+        let straight_rays = generate_sliding_destinations(0, 0, king, true, false); 
 
-    return kneighbors + danger_value + backrow;
+        let bishops_in_rays = diag_rays & game.bishops(!side);
+        let rooks_in_rays = straight_rays & game.rooks(!side);
+        let queens_in_rays = (straight_rays | diag_rays) & game.queens(!side);
+        let possible_pin_score = (bishops_in_rays | rooks_in_rays | queens_in_rays).count_ones() as PosValue * -4;
+        return kneighbors + possible_pin_score + backrow + pawn_shield;
+    }
+    else {
+        return kneighbors + backrow + pawn_shield;
+    }
 }
 
 fn king_there(game: &Game, side: Side) -> PosValue {