Created
June 25, 2017 00:24
-
-
Save mdamien/185aae4ed1283d6554f6c2a5cc2eddc7 to your computer and use it in GitHub Desktop.
game of life in rust
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extern crate rand; | |
| use std::{thread, time}; | |
| use rand::Rng; | |
| /* | |
| RULES | |
| For a space that is 'populated': | |
| Each cell with one or no neighbors dies, as if by solitude. | |
| Each cell with four or more neighbors dies, as if by overpopulation. | |
| Each cell with two or three neighbors survives. | |
| For a space that is 'empty' or 'unpopulated' | |
| Each cell with three neighbors becomes populated. | |
| */ | |
| fn print_grid(grid: &Vec<bool>, width: usize) { | |
| for row in 0..(grid.len() / width) { | |
| print!("|"); | |
| for col in 0..width { | |
| let cell = grid[row * width + col]; | |
| print!("{}", if cell {"x"} else {" "}); | |
| } | |
| println!("|"); | |
| } | |
| println!("-"); | |
| } | |
| fn step(new_grid: &mut Vec<bool>, width: usize) { | |
| let grid = new_grid.clone(); | |
| let height = grid.len() / width; | |
| for row in 0..height { | |
| for col in 0..width { | |
| let cell = grid[row * width + col]; | |
| let mut neighbors = 0; | |
| for dx in [-1, 0, 1].iter() { | |
| for dy in [-1, 0, 1].iter() { | |
| if *dx == 0 && *dy == 0 { | |
| continue | |
| } | |
| let new_row = ((row as i32) + dy) % (height as i32); | |
| let new_col = ((col as i32) + dx) % (width as i32); | |
| if new_col >= (width as i32) || new_col < 0 { | |
| continue | |
| } | |
| if new_row >= (height as i32) || new_row < 0 { | |
| continue | |
| } | |
| if grid[(new_row as usize) * width + (new_col as usize)] { | |
| neighbors += 1; | |
| } | |
| } | |
| } | |
| if cell { | |
| if neighbors < 2 || neighbors > 3 { | |
| new_grid[row * width + col] = false; | |
| } | |
| } else { | |
| if neighbors == 3 { | |
| new_grid[row * width + col] = true; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| fn main() { | |
| let mut grid: Vec<bool> = vec![]; | |
| let width = 100; | |
| let rows = 100; | |
| let mut rng = rand::thread_rng(); | |
| for _ in 0..(width*rows) { | |
| grid.push(rng.gen()); | |
| } | |
| /* | |
| let mut grid: Vec<bool> = vec![ | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, | |
| false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false | |
| ]; | |
| let width = 20; | |
| */ | |
| for _ in 0..200 { | |
| print!("{}[2J", 27 as char); // clear screen | |
| print_grid(&grid, width); | |
| step(&mut grid, width); | |
| let sleep_time = time::Duration::from_millis(100); | |
| thread::sleep(sleep_time); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment