diff --git a/iced-tetris/src/main.rs b/iced-tetris/src/main.rs index 5ffef32..15b64ac 100644 --- a/iced-tetris/src/main.rs +++ b/iced-tetris/src/main.rs @@ -18,6 +18,7 @@ struct Tetris { blocks: BlockGrid, ticks: usize, paused: bool, + lines_removed: u32, } impl Tetris { @@ -27,6 +28,7 @@ impl Tetris { blocks: BlockGrid::new(), ticks: 0, paused: false, + lines_removed: 0, } } } @@ -77,6 +79,9 @@ impl Application for Tetris { } } }; + + let lines_removed = self.blocks.clear_pieces(); + self.lines_removed += lines_removed; Command::none() } @@ -344,6 +349,39 @@ impl BlockGrid { } } + /// Returns number of lines removed + fn clear_pieces(&mut self) -> u32 { + let mut new_state = [[None; 20]; 10]; + let mut offset = 0; + for row in (0..=19).rev() { + let mut all_filled = true; + let mut all_empty = true; + for col in 0..10 { + if self.state[col][row].is_none() { + all_filled = false; + } + if self.state[col][row].is_some() { + all_empty = false; + } + } + + if all_filled && !all_empty { + offset += 1; + } else { + if offset != 0 { + println!("Offset {} row {}", offset, row); + } + for col in 0..10 { + new_state[col][row+offset] = self.state[col][row]; + } + } + } + + self.state = new_state; + println!("OFFSET: {}", offset); + offset as u32 + } + fn iter<'a>(&'a self) -> BlockGridIter<'a> { let active_piece_blocks = self.active_piece.as_ref().map(|piece| { let b = Self::piece_blocks(piece);