Skip to content

Instantly share code, notes, and snippets.

@mdamien
Created June 25, 2017 00:24
Show Gist options
  • Select an option

  • Save mdamien/185aae4ed1283d6554f6c2a5cc2eddc7 to your computer and use it in GitHub Desktop.

Select an option

Save mdamien/185aae4ed1283d6554f6c2a5cc2eddc7 to your computer and use it in GitHub Desktop.
game of life in rust
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