Advertisement
Guest User

Untitled

a guest
May 25th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.58 KB | None | 0 0
  1. #![allow(dead_code)]
  2. extern crate rand;
  3.  
  4. use rand::prelude::*;
  5.  
  6. const locations: [[i32; 2]; 8] = [
  7.     [-1, -1],
  8.     [0, -1],
  9.     [1, -1],
  10.     [1, 0],
  11.     [1, 1],
  12.     [0, 1],
  13.     [-1, 1],
  14.     [-1, -1],
  15. ];
  16.  
  17. #[derive(Clone)]
  18. enum PieceState {
  19.     Alive,
  20.     Dead,
  21. }
  22.  
  23. struct Piece {
  24.     state: PieceState,
  25.     change_to: PieceState,
  26. }
  27.  
  28. impl Piece {
  29.     fn update_state(&mut self) {
  30.         self.state = self.change_to.clone();
  31.     }
  32.  
  33.     fn randomize(&mut self) {
  34.         self.state = if random() {
  35.             PieceState::Alive
  36.         } else {
  37.             PieceState::Dead
  38.         };
  39.     }
  40. }
  41.  
  42. struct Board {
  43.     pieces: Vec<Vec<Piece>>,
  44. }
  45.  
  46. impl Board {
  47.     fn draw(&mut self) {
  48.         for row in &self.pieces {
  49.             let mut row_string = String::new();
  50.             for piece in row {
  51.                 row_string += &String::from(match piece.state {
  52.                     PieceState::Alive => "#",
  53.                     PieceState::Dead => " ",
  54.                 })
  55.             }
  56.             println!("{}", row_string);
  57.         }
  58.     }
  59.  
  60.     fn init(&mut self, size: usize) {
  61.         self.pieces = vec![];
  62.         for y in 0..size {
  63.             self.pieces.push(vec![]);
  64.             for _ in 0..size {
  65.                 let p = Piece {
  66.                     state: PieceState::Dead,
  67.                     change_to: PieceState::Dead,
  68.                 };
  69.                 self.pieces[y].push(p);
  70.             }
  71.         }
  72.     }
  73.  
  74.     fn randomize(&mut self) {
  75.         for row in &mut self.pieces {
  76.             for piece in row {
  77.                 piece.randomize();
  78.             }
  79.         }
  80.     }
  81.  
  82.     fn update_pieces(&mut self) {
  83.         for row in &mut self.pieces {
  84.             for mut piece in row {
  85.                 piece.update_state();
  86.             }
  87.         }
  88.     }
  89.  
  90.     fn run_cycle(&mut self) {
  91.         for (y, row) in &mut self.pieces.iter().enumerate() {
  92.             for (x, mut piece) in row.iter().enumerate() {
  93.                 let mut total = 0;
  94.                 for check in locations.iter() {
  95.                     let yloc: i32 = (y as i32) + check[1] as i32;
  96.                     let xloc: i32 = (x as i32) + check[0] as i32;
  97.                     if yloc < 0 || xloc < 0 {
  98.                         continue;
  99.                     }
  100.                     let max_index = row.len() as i32 - 1;
  101.                     if yloc > max_index || xloc > max_index {
  102.                         continue;
  103.                     }
  104.                     total += match self.pieces[yloc as usize][xloc as usize].state {
  105.                         PieceState::Alive => 1,
  106.                         PieceState::Dead => 0,
  107.                     }
  108.                 }
  109.                 piece.change_to = match piece.state {
  110.                     PieceState::Alive => {
  111.                         if total < 2 {
  112.                             PieceState::Dead
  113.                         } else if total <= 3 {
  114.                             PieceState::Alive
  115.                         } else if total > 3 {
  116.                             PieceState::Dead
  117.                         } else {
  118.                             PieceState::Dead
  119.                         }
  120.                     }
  121.                     PieceState::Dead => {
  122.                         if total == 3 {
  123.                             PieceState::Alive
  124.                         } else {
  125.                             PieceState::Dead
  126.                         }
  127.                     }
  128.                 };
  129.             }
  130.         }
  131.     }
  132. }
  133.  
  134. fn main() {
  135.     let mut b = Board { pieces: vec![] };
  136.     b.init(10);
  137.     b.randomize();
  138.     b.draw();
  139.     loop {
  140.         b.run_cycle();
  141.         b.draw();
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement