RandomWithoutDirectRepetition & BagX2 randomizers
This commit is contained in:
parent
3ec1b672bd
commit
fbd10833b2
|
@ -4,15 +4,20 @@ use rand::thread_rng;
|
||||||
use super::{rotation_systems::PiecesData, resources::Piece};
|
use super::{rotation_systems::PiecesData, resources::Piece};
|
||||||
|
|
||||||
pub trait Randomizer{
|
pub trait Randomizer{
|
||||||
fn populate_next(&self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece>;
|
fn create() -> Self where Self: Sized;
|
||||||
|
fn populate_next(&mut self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Bag {}
|
pub struct Bag {}
|
||||||
|
|
||||||
pub struct RandomWithoutDirectRepetition {}
|
pub struct BagX2 {}
|
||||||
|
|
||||||
|
pub struct RandomWithoutDirectRepetition {
|
||||||
|
memory: usize
|
||||||
|
}
|
||||||
|
|
||||||
impl Randomizer for Bag {
|
impl Randomizer for Bag {
|
||||||
fn populate_next(&self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece> {
|
fn populate_next(&mut self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece> {
|
||||||
let mut bag = vec![];
|
let mut bag = vec![];
|
||||||
let mut id: usize = 0;
|
let mut id: usize = 0;
|
||||||
for _ in &pieces_data.pieces{
|
for _ in &pieces_data.pieces{
|
||||||
|
@ -23,11 +28,46 @@ impl Randomizer for Bag {
|
||||||
bag.shuffle(&mut rng);
|
bag.shuffle(&mut rng);
|
||||||
bag
|
bag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create() -> Self where Self: Sized {
|
||||||
|
Bag { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Randomizer for BagX2 {
|
||||||
|
fn populate_next(&mut self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece> {
|
||||||
|
let mut bag = vec![];
|
||||||
|
let mut id: usize = 0;
|
||||||
|
for _ in &pieces_data.pieces{
|
||||||
|
bag.insert(id, Piece::create(pieces_data, id, board_width, board_height));
|
||||||
|
bag.insert(id, Piece::create(pieces_data, id, board_width, board_height));
|
||||||
|
id += 1;
|
||||||
|
}
|
||||||
|
let mut rng = thread_rng();
|
||||||
|
bag.shuffle(&mut rng);
|
||||||
|
bag
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create() -> Self where Self: Sized {
|
||||||
|
BagX2 { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Randomizer for RandomWithoutDirectRepetition {
|
impl Randomizer for RandomWithoutDirectRepetition {
|
||||||
fn populate_next(&self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece> {
|
fn populate_next(&mut self, pieces_data: &PiecesData, board_width: isize, board_height: isize) -> Vec<Piece> {
|
||||||
let random_number = random::<usize>() % pieces_data.pieces.len();
|
let random_number = random::<usize>() % pieces_data.pieces.len();
|
||||||
|
if random_number != self.memory {
|
||||||
|
self.memory = random_number;
|
||||||
|
vec![Piece::create(pieces_data, random_number, board_width, board_height)]
|
||||||
|
}else{
|
||||||
|
let random_number = random::<usize>() % pieces_data.pieces.len();
|
||||||
|
self.memory = random_number;
|
||||||
vec![Piece::create(pieces_data, random_number, board_width, board_height)]
|
vec![Piece::create(pieces_data, random_number, board_width, board_height)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create() -> Self where Self: Sized {
|
||||||
|
RandomWithoutDirectRepetition { memory: 65535 }
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -180,8 +180,9 @@ impl Engine {
|
||||||
self.next_queue.remove(0);
|
self.next_queue.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(&mut self, rotation_system: &str){
|
pub fn init(&mut self, rotation_system: &str, randomizer: Box<dyn Randomizer + Sync + Send>){
|
||||||
self.rotation_system = ROTATION_SYSTEMS[rotation_system].clone();
|
self.rotation_system = ROTATION_SYSTEMS[rotation_system].clone();
|
||||||
|
self.randomizer = randomizer;
|
||||||
while self.next_queue.len() <= self.board.show_next as usize {
|
while self.next_queue.len() <= self.board.show_next as usize {
|
||||||
self.next_queue.append(&mut self.randomizer.populate_next(&self.rotation_system, self.board.width as isize, self.board.height as isize));
|
self.next_queue.append(&mut self.randomizer.populate_next(&self.rotation_system, self.board.width as isize, self.board.height as isize));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use super::{resources::Engine, rotation_systems::LockDelayMode, GameStates, GameloopStates};
|
use super::{resources::Engine, rotation_systems::LockDelayMode, GameStates, GameloopStates, randomizers::*};
|
||||||
use crate::engine::components::*;
|
use crate::engine::components::*;
|
||||||
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ pub fn init_engine(
|
||||||
},
|
},
|
||||||
BoardVisual {},
|
BoardVisual {},
|
||||||
));
|
));
|
||||||
engine.init("NRS");
|
engine.init("SRS", Box::new(BagX2::create()));
|
||||||
next_state.set(GameloopStates::Falling);
|
next_state.set(GameloopStates::Falling);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue