]> git.seodisparate.com - EN605.607.81.SP22_ASDM_Project/commitdiff
Tweaks to AI for correctness
authorStephen Seo <seo.disparate@gmail.com>
Thu, 10 Mar 2022 07:39:26 +0000 (16:39 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 10 Mar 2022 07:39:26 +0000 (16:39 +0900)
front_end/src/ai.rs
front_end/src/state.rs

index 65da7a96c9d0f894a2b7654a04b4b69484250e77..1c0d825437ff8bfe72753f528cc8babdecf4bd3b 100644 (file)
@@ -216,7 +216,7 @@ fn get_block_amount(player: Turn, idx: usize, amount: usize, board: &BoardType)
     }
 
     // check right
-    count = 0;
+    // count = 0; // don't reset count, since horizontal may pass through idx
     temp_idx = idx;
     while temp_idx % (COLS as usize) < (COLS - 1) as usize {
         temp_idx += 1;
@@ -260,13 +260,11 @@ fn get_block_amount(player: Turn, idx: usize, amount: usize, board: &BoardType)
         }
     }
 
-    // check diagonal right down
-    count = 0;
+    // check diagonal right up
+    // count = 0; // don't reset count as diagonal may pass through idx
     temp_idx = idx;
-    while temp_idx % (COLS as usize) < (COLS - 1) as usize
-        && temp_idx / (COLS as usize) < (ROWS - 1) as usize
-    {
-        temp_idx = temp_idx + 1 + COLS as usize;
+    while temp_idx % (COLS as usize) < (COLS - 1) as usize && temp_idx / (COLS as usize) > 0 {
+        temp_idx = temp_idx + 1 - COLS as usize;
         if board[temp_idx].get() == opposite.into() {
             count += 1;
             if count >= amount {
@@ -277,11 +275,13 @@ fn get_block_amount(player: Turn, idx: usize, amount: usize, board: &BoardType)
         }
     }
 
-    // check diagonal left up
+    // check diagonal right down
     count = 0;
     temp_idx = idx;
-    while temp_idx % (COLS as usize) > 0 && temp_idx / (COLS as usize) > 0 {
-        temp_idx = temp_idx - 1 - COLS as usize;
+    while temp_idx % (COLS as usize) < (COLS - 1) as usize
+        && temp_idx / (COLS as usize) < (ROWS - 1) as usize
+    {
+        temp_idx = temp_idx + 1 + COLS as usize;
         if board[temp_idx].get() == opposite.into() {
             count += 1;
             if count >= amount {
@@ -292,11 +292,11 @@ fn get_block_amount(player: Turn, idx: usize, amount: usize, board: &BoardType)
         }
     }
 
-    // check diagonal right up
-    count = 0;
+    // check diagonal left up
+    // count = 0; // don't reset count as diagonal may pass through idx
     temp_idx = idx;
-    while temp_idx % (COLS as usize) < (COLS - 1) as usize && temp_idx / (COLS as usize) > 0 {
-        temp_idx = temp_idx + 1 - COLS as usize;
+    while temp_idx % (COLS as usize) > 0 && temp_idx / (COLS as usize) > 0 {
+        temp_idx = temp_idx - 1 - COLS as usize;
         if board[temp_idx].get() == opposite.into() {
             count += 1;
             if count >= amount {
index e9214715a27a310525d41e21d05896bcbdd90344..ea90969d95ee32bd386e7131444e704da5f0dd68 100644 (file)
@@ -197,6 +197,15 @@ pub fn new_empty_board() -> BoardType {
     ]
 }
 
+pub fn board_deep_clone(board: &BoardType) -> BoardType {
+    let cloned_board = new_empty_board();
+    for i in 0..board.len() {
+        cloned_board[i].replace(board[i].get());
+    }
+
+    cloned_board
+}
+
 pub type PlacedType = [Rc<Cell<bool>>; 56];
 
 pub fn new_placed() -> PlacedType {