mod ansi_rust;
pub use ansi_rust::*;
pub struct GameOfLife{
nb_col:usize,
nb_lig:usize,
grid: Vec<Vec<bool>>,
}
impl GameOfLife{
pub fn new(nb_col:usize, nb_lig:usize) -> GameOfLife{
let mut new_g = GameOfLife{
nb_col:nb_col,
nb_lig:nb_lig,
grid: Vec::with_capacity(nb_lig)
};
for i in 0..nb_lig{
new_g.grid.push(Vec::with_capacity(nb_col));
for _ in 0..nb_col {
new_g.grid[i].push(false);
}
}
new_g
}
pub fn set_element(&mut self, i_col:usize, i_lig:usize){
self.grid[i_lig][i_col] = true;
}
pub fn unset_element(&mut self, i_col:usize, i_lig:usize){
self.grid[i_lig][i_col] = false;
}
pub fn show(&self){
for i in 0..self.nb_lig{
for j in 0..self.nb_col{
if self.grid[i as usize][j as usize] {
show('#', j, i);
}else{
show(' ', j, i);
}
}
}
}
pub fn update(&mut self){
let nb_col:usize = self.nb_col;
let nb_lig:usize = self.nb_lig;
let mut new_grid:Vec<Vec<bool>> = Vec::with_capacity(nb_lig);
for i in 0..nb_lig{
new_grid.push(Vec::with_capacity(nb_col));
for _ in 0..nb_col {
new_grid[i].push(false);
}
}
for ilig in 1..nb_lig-1{
for icol in 1..nb_col-1{
let mut nb_vies = 0;
for i in 0..3{
for j in 0..3{
if !(i==1 && j==1) && self.grid[(ilig+j-1) as usize][(icol+i-1) as usize] {
nb_vies+=1;
}
}
}
if nb_vies == 3 || (nb_vies == 2 && self.grid[ilig as usize][icol as usize]) {
new_grid[ilig as usize][icol as usize] = true;
}
}
}
for ilig in 1..nb_lig-1{
for icol in 1..nb_col-1{
self.grid[ilig as usize][icol as usize] = new_grid[ilig as usize][icol as usize];
}
}
}
pub fn get_grid(&self) -> &Vec<Vec<bool>> {
&self.grid
}
}