use crate::tetromino::TetrominoType; use rand::{rngs::ThreadRng, seq::SliceRandom, thread_rng}; #[derive(Clone, Copy, Debug)] pub struct RandomSystem { rng: ThreadRng, bag: [TetrominoType; 7], cur_pos: usize, } impl RandomSystem { pub fn new() -> Self { let rng = thread_rng(); RandomSystem { rng: rng, bag: [TetrominoType::I; 7], // Default value, should get init on first get cur_pos: 0, } } pub fn get_tetromino(&mut self) -> TetrominoType { if self.cur_pos == 0 { self.refresh_bag(); } let to_return = self.bag[self.cur_pos]; self.cur_pos = (self.cur_pos + 1) % 7; to_return } fn refresh_bag(&mut self) { self.bag = [ TetrominoType::I, TetrominoType::O, TetrominoType::T, TetrominoType::S, TetrominoType::Z, TetrominoType::J, TetrominoType::L, ]; self.bag.shuffle(&mut self.rng); self.cur_pos = 0; } }