diff --git a/src/gamedata/mod.rs b/src/gamedata/mod.rs index 7c2b05b..8900012 100644 --- a/src/gamedata/mod.rs +++ b/src/gamedata/mod.rs @@ -4,7 +4,7 @@ mod tests; use array2d::Array2D; -use self::score_checkers::{one_direction, two_direction}; +use self::score_checkers::scan; #[derive(Clone)] pub struct Board { p1_score: i32, @@ -42,17 +42,17 @@ impl Board { unimplemented!() } } -pub fn get_indices( - index: &(usize, usize), - op: fn(&(usize, usize), usize) -> (usize, usize), - values: Vec, -) -> Vec<(usize, usize)> { - let mut indices: Vec<(usize, usize)> = Vec::with_capacity(3); - for num in values { - indices.push(op(index, num)); - } - indices -} +// pub fn get_indices( +// index: &(usize, usize), +// op: fn(&(usize, usize), usize) -> (usize, usize), +// values: Vec, +// ) -> Vec<(usize, usize)> { +// let mut indices: Vec<(usize, usize)> = Vec::with_capacity(3); +// for num in values { +// indices.push(op(index, num)); +// } +// indices +// } pub fn inc_row((row, col): &(usize, usize), value: usize) -> (usize, usize) { (row + value as usize, *col) diff --git a/src/gamedata/score_checkers.rs b/src/gamedata/score_checkers.rs index 53c4bc5..bb51580 100644 --- a/src/gamedata/score_checkers.rs +++ b/src/gamedata/score_checkers.rs @@ -1,143 +1,144 @@ use array2d::Array2D; -use super::{dec_col, get_indices, inc_col, Disk}; +use crate::gamedata::{dec_both, dec_inc, dec_row, inc_both, inc_dec, inc_row}; -pub fn one_direction(board: &Array2D, index: &(usize, usize), direction: Direction) -> i32 { - // let current_disk: &Disk; - // match board.get(index.0, index.1) { - // Some(disk) => current_disk = disk, - // None => return 0, - // }; - // let mut current_index = *index; - // let mut in_a_row = 0; - // for _num in 0..4 { - // match board.get(current_index.0, current_index.1) { - // Some(_disk) => { - // if variant_eq(current_disk, _disk) && !matches!(_disk, Disk::EMPTY) { - // // add in a row by 1 - // in_a_row += 1; - // //go to next element - // match direction { - // Direction::DOWN => { - // if current_index.0 == 0 { - // break; - // } - // current_index.0 -= 1; - // } - // Direction::UP => { - // if current_index.0 == board.num_columns() - 1 { - // break; - // } - // current_index.0 += 1; - // } - // Direction::BACKWARD => { - // if current_index.1 == 0 { - // break; - // } - // current_index.1 -= 1; - // } - // Direction::FORWARD => { - // if current_index.1 == board.num_rows() - 1 { - // break; - // } - // current_index.1 += 1; - // } - // Direction::UPFORW => { - // if current_index.0 == board.num_columns() - 1 - // || current_index.1 == board.num_rows() - 1 - // { - // break; - // } - // current_index.1 += 1; - // current_index.0 += 1; - // } - // Direction::UPBACK => { - // if current_index.0 == board.num_columns() - 1 || current_index.1 == 0 { - // break; - // } - // current_index.1 -= 1; - // current_index.0 += 1; - // } - // Direction::DOWNFORW => { - // if current_index.0 == 0 || current_index.1 == board.num_columns() - 1 { - // break; - // } - // current_index.1 += 1; - // current_index.0 -= 1; - // } - // Direction::DOWNBACK => { - // if current_index.0 == 0 || current_index.1 == 0 { - // break; - // } - // current_index.1 -= 1; - // current_index.0 -= 1; - // } - // } - // } else { - // break; - // } - // } - // - // None => break, - // } - // } - // if in_a_row == 4 { - // //score added - // return 1; - // } else { - // return 0; - // } - // //+-3 - todo!() -} -// board[(2,3)]; +use super::{dec_col, inc_col, Disk}; -pub fn two_direction(board: &Array2D, index: &(usize, usize), direction: Direction) -> i32 { - let mut added_score = 0; +pub fn scan( + board: &Array2D, + index: &(usize, usize), + direction: Direction, + depth: i32, +) -> i32 { let current_disk: &Disk; match board.get(index.0, index.1) { Some(disk) => current_disk = disk, None => return 0, }; - match direction { - Direction::HORIZONTAL => { - //get values to increase/decrease by - let two = vec![1, 2]; - let one = vec![1]; - //get surrounding indices - let mut indices: Vec<(usize, usize)> = vec![]; - indices.append(&mut get_indices(index, inc_col, two)); - indices.append(&mut get_indices(index, dec_col, one)); - dbg!(indices.clone()); - let mut neighbours: Vec = vec![]; - //get neighbours - for index in indices { - match board.get(index.0, index.1) { - Some(disk) => neighbours.push(*disk), - None => break, + let mut current_index = *index; + let mut in_a_row = 0; + for _num in 0..depth { + match board.get(current_index.0, current_index.1) { + Some(_disk) => { + dbg!(_disk, current_disk); + if variant_eq(current_disk, _disk) && !variant_eq(_disk, &Disk::EMPTY) { + // add in a row by 1 + in_a_row += 1; + dbg!(current_index); + //go to next element + match direction { + Direction::DOWN => { + if current_index.0 == 0 { + break; + } + current_index = dec_row(¤t_index, 1); + //current_index.0 -= 1; + } + Direction::UP => { + if current_index.0 == board.num_rows() - 1 { + break; + } + current_index = inc_row(¤t_index, 1); + // current_index.0 += 1; + } + Direction::LEFT => { + if current_index.1 == 0 { + break; + } + current_index = dec_col(¤t_index, 1); + // current_index.1 -= 1; + } + Direction::RIGHT => { + if current_index.1 == board.num_columns() - 1 { + break; + } + current_index = inc_col(¤t_index, 1); + // current_index.1 += 1; + } + Direction::UPRIGHT => { + if current_index.0 == board.num_rows() - 1 + || current_index.1 == board.num_columns() - 1 + { + break; + } + current_index = inc_both(¤t_index, 1); + // current_index.1 += 1; + // current_index.0 += 1; + } + Direction::UPLEFT => { + if current_index.0 == board.num_columns() - 1 || current_index.1 == 0 { + break; + } + + // current_index.1 -= 1; + // current_index.0 += 1; + current_index = inc_dec(¤t_index, 1); + } + Direction::DOWNRIGHT => { + if current_index.0 == 0 || current_index.1 == board.num_columns() - 1 { + break; + } + current_index = dec_inc(¤t_index, 1); + // current_index.1 += 1; + // current_index.0 -= 1; + } + Direction::DOWNLEFT => { + if current_index.0 == 0 || current_index.1 == 0 { + break; + } + current_index = dec_both(¤t_index, 1); + } + } + } else { + break; } } - let in_a_row = neighbours - .iter() - .filter(|&a| variant_eq(a, current_disk)) - .count(); - if in_a_row == 3 { - added_score += 1; - } - added_score + None => break, } - Direction::VERTICAL => todo!(), - Direction::DIAGONAL => todo!(), } + in_a_row + // //+-3 +} +// board[(2,3)]; +pub fn get_legal_moves( + (row, col): &(usize, usize), + direction: Direction, + (nrow, ncol): (usize, usize), +) -> Vec { + let max_col = nrow - 1; + let max_row = ncol - 1; + let mut moves: Vec = vec![]; + match *row { + 0 => moves.push(Direction::UP), + max_row => moves.push(Direction::DOWN), + _ => { + moves.push(Direction::UP); + moves.push(Direction::DOWN); + } + }; + match *col { + 0 => moves.push(Direction::RIGHT), + max_row => moves.push(Direction::LEFT), + _ => { + moves.push(Direction::LEFT); + moves.push(Direction::RIGHT) + } + }; + moves } pub enum Direction { - HORIZONTAL, - VERTICAL, - DIAGONAL, + UP, + DOWN, + LEFT, + RIGHT, + UPLEFT, + UPRIGHT, + DOWNLEFT, + DOWNRIGHT, } // serves nothing except do what matches!() should have done all along -fn variant_eq(a: &T, b: &T) -> bool { +pub fn variant_eq(a: &T, b: &T) -> bool { std::mem::discriminant(a) == std::mem::discriminant(b) } diff --git a/src/gamedata/tests.rs b/src/gamedata/tests.rs index 2fba6ad..fc4a15e 100644 --- a/src/gamedata/tests.rs +++ b/src/gamedata/tests.rs @@ -1,6 +1,6 @@ -use crate::gamedata::{dec_col, score_checkers::Direction, Board}; +use crate::gamedata::score_checkers::Direction; -use super::{get_indices, inc_col, score_checkers::two_direction, Disk}; +use super::*; // #[test] // fn board_default() { @@ -47,7 +47,7 @@ fn play() { assert!(!board.play(Disk::BLU, 3)); } #[test] -fn one_direction_updown() { +fn scan_updown() { let mut board = Board::default(); board.play(Disk::BLU, 0); board.play(Disk::BLU, 0); @@ -56,54 +56,42 @@ fn one_direction_updown() { board.play(Disk::BLU, 0); board.play(Disk::BLU, 0); board.play(Disk::BLU, 0); - // assert_eq!(1, one_direction(&board.columns, &(4, 0), Direction::DOWN)); - // assert_eq!(1, one_direction(&board.columns, &(3, 0), Direction::DOWN)); + assert_eq!(3, scan(&board.columns, &(4, 0), Direction::DOWN, 3)); + assert_eq!(3, scan(&board.columns, &(3, 0), Direction::DOWN, 3)); } #[test] -fn one_direction_updown2() { +fn scan_updown2() { let mut board = Board::default(); board.play(Disk::BLU, 0); board.play(Disk::RED, 0); board.play(Disk::BLU, 0); board.play(Disk::BLU, 0); - // assert_eq!(0, one_direction(&board.columns, &(3, 0), Direction::DOWN)); + assert_eq!(0, scan(&board.columns, &(0, 0), Direction::UP, 3)); } #[test] -fn one_direction_forwardback() { +fn scan_forwardback() { let mut board = Board::default(); board.play(Disk::BLU, 0); board.play(Disk::BLU, 1); board.play(Disk::BLU, 2); board.play(Disk::BLU, 3); - // assert!(!matches!(Disk::RED, Disk::BLU)); - // assert_eq!( - // 1, - // one_direction(&board.columns, &(0, 0), Direction::FORWARD) - // ); - // assert_eq!( - // 1, - // one_direction(&board.columns, &(0, 3), Direction::BACKWARD) - // ); + assert!(!matches!(Disk::RED, Disk::BLU)); + assert_eq!(1, scan(&board.columns, &(0, 0), Direction::RIGHT, 3)); + assert_eq!(1, scan(&board.columns, &(0, 3), Direction::LEFT, 3)); } #[test] -fn one_direction_forwardback2() { +fn scan_forwardback2() { let mut board = Board::default(); board.play(Disk::BLU, 0); board.play(Disk::BLU, 1); board.play(Disk::RED, 2); board.play(Disk::BLU, 3); - // assert_eq!( - // 0, - // one_direction(&board.columns, &(0, 0), Direction::FORWARD) - // ); - // assert_eq!( - // 0, - // one_direction(&board.columns, &(0, 3), Direction::BACKWARD) - // ); + assert_eq!(0, scan(&board.columns, &(0, 0), Direction::RIGHT, 3)); + assert_eq!(0, scan(&board.columns, &(0, 3), Direction::LEFT, 3)); } #[test] -fn one_direction_diag1() { +fn scan_diag1() { let mut board = Board::default(); board.play(Disk::BLU, 0); board.play(Disk::RED, 1); @@ -115,14 +103,11 @@ fn one_direction_diag1() { board.play(Disk::RED, 3); board.play(Disk::RED, 3); board.play(Disk::BLU, 3); - // assert_eq!(1, one_direction(&board.columns, &(0, 0), Direction::UPFORW)); - // assert_eq!( - // 1, - // one_direction(&board.columns, &(3, 3), Direction::DOWNBACK) - // ); + assert_eq!(1, scan(&board.columns, &(0, 0), Direction::UPRIGHT, 3)); + assert_eq!(1, scan(&board.columns, &(3, 3), Direction::DOWNLEFT, 3)); } #[test] -fn one_direction_diag2() { +fn scan_diag2() { let mut board = Board::default(); board.play(Disk::BLU, 3); board.play(Disk::RED, 2); @@ -135,30 +120,13 @@ fn one_direction_diag2() { board.play(Disk::RED, 0); board.play(Disk::BLU, 0); dbg!(&board.columns.as_columns()); - // assert_eq!(1, one_direction(&board.columns, &(0, 3), Direction::UPBACK)); - // assert_eq!( - // 1, - // one_direction(&board.columns, &(3, 0), Direction::DOWNFORW) - // ); + assert_eq!(1, scan(&board.columns, &(0, 3), Direction::UPLEFT, 3)); + assert_eq!(1, scan(&board.columns, &(3, 0), Direction::DOWNRIGHT, 3)); } #[test] -fn get_indices_test() { - let values: Vec = vec![1, 2]; - let indices = get_indices(&(2, 1), inc_col, values); - assert_eq!(vec![(2, 2), (2, 3)], indices); - let indices = get_indices(&(2, 1), dec_col, vec![1]); - assert_eq!(vec![(2, 0)], indices); -} - -#[test] -fn two_direction_test() { - let mut board = Board::default(); - board.play(Disk::BLU, 0); - board.play(Disk::BLU, 1); - board.play(Disk::BLU, 2); - board.play(Disk::BLU, 3); - board.play(Disk::BLU, 4); - board.play(Disk::BLU, 5); - let added = two_direction(&board.columns, &(0, 3), Direction::HORIZONTAL); - assert_eq!(1, added) +fn variant_eq_test() { + assert!(score_checkers::variant_eq(&Disk::RED, &Disk::RED)); + assert!(matches!(Disk::RED, Disk::RED)); + assert!(!score_checkers::variant_eq(&Disk::BLU, &Disk::RED)); + assert!(!matches!(Disk::BLU, Disk::RED)); }