diff --git a/snake-game/src/gameplay.rs b/snake-game/src/gameplay.rs index 6a670df..186abf5 100644 --- a/snake-game/src/gameplay.rs +++ b/snake-game/src/gameplay.rs @@ -83,6 +83,40 @@ fn find_grid_bound(old: f32, new: f32, grid: f32) -> f32 { } } +/// Разбиение изменения координаты по границам сетки +fn split_by_grid(src: f32, dst: f32, grid: f32) -> Vec<(f32, f32)> { + if grid <= 0.0 { + return Vec::default(); + }; + + let old_grid = src / grid; + let new_grid = dst / grid; + + let old_grid_right = old_grid.ceil(); + let new_grid_right = new_grid.ceil(); + + let mut output = Vec::with_capacity(2); + if src < dst { + let mut src: f32 = src; + for step in old_grid_right as i32..new_grid_right as i32 { + let step = step as f32 * grid; + output.push((step, step - src)); + src = step; + } + output.push((dst, dst - src)); + } else { + let mut dst: f32 = dst; + for step in new_grid_right as i32..old_grid_right as i32 { + let step = step as f32 * grid; + output.push((dst, dst - step)); + dst = step; + } + output.push((dst, dst - src)); + output.reverse(); + } + output +} + #[cfg(test)] mod test { use crate::gameplay::*; @@ -126,4 +160,51 @@ mod test { assert!(find_grid_bound(1.0, 2.0, -0.0).is_nan()); assert!(find_grid_bound(1.0, 2.0, -0.1).is_nan()); } + + #[test] + fn test_split_by_grid() { + // движение вправо + assert_eq!(split_by_grid(1.0, 4.0, 5.0), vec![(4.0, 3.0)]); + assert_eq!(split_by_grid(3.0, 5.0, 5.0), vec![(5.0, 2.0)]); + assert_eq!(split_by_grid(3.0, 6.0, 5.0), vec![(5.0, 2.0), (6.0, 1.0)]); + assert_eq!(split_by_grid(3.0, 10.0, 5.0), vec![(5.0, 2.0), (10.0, 5.0)]); + assert_eq!( + split_by_grid(3.0, 11.0, 5.0), + vec![(5.0, 2.0), (10.0, 5.0), (11.0, 1.0)] + ); + assert_eq!(split_by_grid(-2.0, 3.0, 5.0), vec![(0.0, 2.0), (3.0, 3.0)]); + assert_eq!( + split_by_grid(-6.0, 7.0, 5.0), + vec![(-5.0, 1.0), (0.0, 5.0), (5.0, 5.0), (7.0, 2.0)] + ); + assert_eq!( + split_by_grid(-6.0, -2.0, 5.0), + vec![(-5.0, 1.0), (-2.0, 3.0)] + ); + + // движение влево + assert_eq!(split_by_grid(4.0, 1.0, 5.0), vec![(1.0, -3.0)]); + assert_eq!(split_by_grid(5.0, 3.0, 5.0), vec![(3.0, -2.0)]); + assert_eq!(split_by_grid(6.0, 3.0, 5.0), vec![(5.0, -1.0), (3.0, -2.0)]); + assert_eq!( + split_by_grid(10.0, 3.0, 5.0), + vec![(5.0, -5.0), (3.0, -2.0)] + ); + assert_eq!( + split_by_grid(11.0, 3.0, 5.0), + vec![(10.0, -1.0), (5.0, -5.0), (3.0, -2.0)] + ); + assert_eq!( + split_by_grid(3.0, -2.0, 5.0), + vec![(0.0, -3.0), (-2.0, -2.0)] + ); + assert_eq!( + split_by_grid(7.0, -6.0, 5.0), + vec![(5.0, -2.0), (0.0, -5.0), (-5.0, -5.0), (-6.0, -1.0)] + ); + assert_eq!( + split_by_grid(-2.0, -6.0, 5.0), + vec![(-5.0, -3.0), (-6.0, -1.0)] + ); + } } diff --git a/snake-game/tests/rust_learning.rs b/snake-game/tests/rust_learning.rs index a8252e7..345aa87 100644 --- a/snake-game/tests/rust_learning.rs +++ b/snake-game/tests/rust_learning.rs @@ -36,3 +36,10 @@ fn test_floor() { fn test_zero() { dbg!(-0.0_f32 == 0.0_f32); } + +#[test] +fn test_ranges() { + for x in 0..5 { + dbg!(x); + } +}