Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.26 KB | None | 0 0
  1. use rand::Rng;
  2. use std::fmt;
  3. use std::io;
  4.  
  5. #[derive(Clone)]
  6. enum TreeStage {
  7. Sapling,
  8. Mature,
  9. Elder,
  10. }
  11.  
  12. impl fmt::Display for TreeStage {
  13. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  14. match *self {
  15. TreeStage::Sapling => write!(f, "S"),
  16. TreeStage::Mature => write!(f, "M"),
  17. TreeStage::Elder => write!(f, "D"),
  18. }
  19. }
  20. }
  21. #[derive(Clone)]
  22. struct Tree {
  23. age: u16,
  24. stage: TreeStage,
  25. }
  26.  
  27. impl Tree {
  28. fn new(age: u16) -> Tree {
  29. match age {
  30. 0...11 => Tree {
  31. age,
  32. stage: TreeStage::Sapling,
  33. },
  34. 12...120 => Tree {
  35. age,
  36. stage: TreeStage::Mature,
  37. },
  38. _ => Tree {
  39. age,
  40. stage: TreeStage::Elder,
  41. },
  42. }
  43. }
  44.  
  45. fn add_month(&self) -> Tree {
  46. let new_age = self.age + 1;
  47. Tree::new(new_age)
  48. }
  49. }
  50.  
  51. impl fmt::Display for Tree {
  52. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  53. self.stage.fmt(f)
  54. }
  55. }
  56.  
  57. #[derive(Copy, Clone)]
  58. struct LumberJack {
  59. lumber_collected: u16,
  60. // potential to store the amount of times wandered
  61. }
  62.  
  63. impl fmt::Display for LumberJack {
  64. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  65. write!(f, "{}", self)
  66. }
  67. }
  68. #[derive(Clone)]
  69. enum ForestFeature {
  70. Tree(Tree),
  71. LumberJack(LumberJack),
  72. Bear,
  73. Empty,
  74. LumberSap(u16),
  75. BearTree(Tree),
  76. }
  77.  
  78. impl fmt::Display for ForestFeature {
  79. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  80. match self {
  81. ForestFeature::Bear => write!(f, "B"),
  82. ForestFeature::Empty => write!(f, "E"),
  83. ForestFeature::Tree(x) => x.fmt(f),
  84. ForestFeature::LumberJack(_) => write!(f, "J"),
  85. ForestFeature::LumberSap(_) => write!(f, "L"),
  86. ForestFeature::BearTree(_) => write!(f, "R"),
  87. }
  88. }
  89. }
  90.  
  91. struct TreePosition {
  92. tree: Tree,
  93. x: usize,
  94. y: usize,
  95. }
  96.  
  97. fn main() {
  98. let dimensions = get_dimensions();
  99.  
  100. let forest = generate_forest(dimensions);
  101.  
  102. print_forest(&forest);
  103.  
  104. simulate(forest);
  105. }
  106.  
  107. fn simulate(mut forest: Vec<Vec<ForestFeature>>) {
  108. for year in 0..400 {
  109. for month in 0..12 {
  110. forest = age_trees(&forest);
  111. print_forest(&forest);
  112. }
  113. }
  114. }
  115.  
  116. fn spawn_trees(forest: &[Vec<ForestFeature>]) -> Vec<Vec<ForestFeature>> {
  117. // get a list of all tree positions
  118. let trees_positions: Vec<Vec<Option<TreePosition>>> = forest
  119. .iter()
  120. .enumerate()
  121. .map(move |(i, x)| {
  122. x.iter()
  123. .enumerate()
  124. .map(move |(j, y)| match y {
  125. ForestFeature::Tree(tre) => Some(TreePosition {
  126. tree: tre.clone(),
  127. x: i,
  128. y: j,
  129. }),
  130. ForestFeature::BearTree(tre) => Some(TreePosition {
  131. tree: tre.clone(),
  132. x: i,
  133. y: j,
  134. }),
  135. _ => None,
  136. })
  137. .collect()
  138. })
  139. .collect();
  140.  
  141. let trees_positions: Vec<TreePosition> =
  142. trees_positions.into_iter().flatten().flatten().collect();
  143.  
  144. // set new spawn locations
  145. let new_spawned_locations: Vec<(usize, usize)> = trees_positions
  146. .into_iter()
  147. .map(|x| get_new_spawning_locations(&x, &forest))
  148. .flatten()
  149. .collect();
  150.  
  151. let newForest = forest.clone();
  152.  
  153. //Add new spawned locations
  154. newForest
  155. .iter_mut()
  156. .enumerate()
  157. .map(|(i, tree_line)| {
  158. tree_line
  159. .iter_mut()
  160. .enumerate()
  161. .map(|(j, currentTree)| {
  162. let tree_info = new_spawned_locations
  163. .into_iter()
  164. .find(|&(new_y, new_x)| new_y == i && new_x == j);
  165. match tree_info {
  166. None => currentTree.clone(),
  167. Some(loc) => match currentTree {
  168. ForestFeature::Empty => ForestFeature::Tree(Tree {
  169. age: 0,
  170. stage: TreeStage::Sapling,
  171. }),
  172. ForestFeature::Bear => ForestFeature::BearTree(Tree {
  173. age: 0,
  174. stage: TreeStage::Sapling,
  175. }),
  176. _ => currentTree.clone(),
  177. },
  178. }
  179. })
  180. .collect()
  181. })
  182. .collect()
  183. }
  184.  
  185. fn get_new_spawning_locations(
  186. currentTree: &TreePosition,
  187. forest: &[Vec<ForestFeature>],
  188. ) -> Option<(usize, usize)> {
  189. let max_y = forest.len();
  190. let max_x = forest[0].len();
  191.  
  192. //generate a list of valid positions
  193. let adjacent_positions: Vec<Vec<Option<(usize, usize)>>> = (0..2)
  194. .map(|offset_y| {
  195. let offset_y = offset_y - 1;
  196. let new_y = currentTree.y + offset_y;
  197.  
  198. if new_y < 0 || new_y > max_y {
  199. return vec![None, None, None];
  200. }
  201. return (0..2)
  202. .map(|offset_x| {
  203. let offset_x = offset_x - 1;
  204. let new_x = currentTree.x + offset_x;
  205.  
  206. if new_x < 0 || new_x > max_x {
  207. return None;
  208. }
  209.  
  210. match &forest[new_y][new_y] {
  211. ForestFeature::Tree(tre) | ForestFeature::BearTree(tre) => {
  212. return Some((new_y, new_x))
  213. }
  214. _ => return None,
  215. }
  216. })
  217. .collect::<_>();
  218. })
  219. .collect();
  220.  
  221. //Filter out invalid positions
  222. let potential_positions: Vec<(usize, usize)> =
  223. adjacent_positions.into_iter().flatten().flatten().collect();
  224.  
  225. match potential_positions.len() {
  226. 0 => None,
  227. _ => {
  228. let chosen_index = rand::thread_rng().gen_range(0, potential_positions.len());
  229.  
  230. let (chosen_y, chosen_x) = potential_positions[chosen_index];
  231.  
  232. match forest[chosen_y][chosen_x] {
  233. ForestFeature::Empty => Some((chosen_y, chosen_x)),
  234. _ => None,
  235. }
  236. }
  237. }
  238. }
  239.  
  240. fn age_trees(forest: &[Vec<ForestFeature>]) -> Vec<Vec<ForestFeature>> {
  241. forest
  242. .iter()
  243. .map(|x| {
  244. x.iter()
  245. .map(|y| match y {
  246. ForestFeature::Tree(tre) => ForestFeature::Tree(tre.add_month()),
  247. ForestFeature::LumberSap(age) => ForestFeature::LumberSap(age + 1),
  248. ForestFeature::BearTree(tre) => ForestFeature::BearTree(tre.add_month()),
  249. ForestFeature::Bear => ForestFeature::Bear,
  250. ForestFeature::Empty => ForestFeature::Empty,
  251. ForestFeature::LumberJack(l) => ForestFeature::LumberJack(*l),
  252. })
  253. .collect()
  254. })
  255. .collect::<_>()
  256. }
  257.  
  258. fn print_forest(forest: &[Vec<ForestFeature>]) {
  259. for f in forest {
  260. for t in f {
  261. print!("{}", t)
  262. }
  263. println!()
  264. }
  265. }
  266.  
  267. fn get_dimensions() -> isize {
  268. println!("please enter your dimensions");
  269.  
  270. let mut dimensions = String::new();
  271.  
  272. io::stdin()
  273. .read_line(&mut dimensions)
  274. .expect("Error in input");
  275.  
  276. dimensions.trim().parse::<isize>().unwrap()
  277. }
  278.  
  279. fn generate_forest(dimensions: isize) -> Vec<Vec<ForestFeature>> {
  280. (0..dimensions)
  281. .map(|_| {
  282. (0..dimensions)
  283. .map(|_| {
  284. let num = rand::thread_rng().gen_range(1, 101);
  285.  
  286. match num {
  287. 1..=50 => ForestFeature::Tree(Tree {
  288. age: 12,
  289. stage: TreeStage::Mature,
  290. }),
  291. 51..=61 => ForestFeature::LumberJack(LumberJack {
  292. lumber_collected: 0,
  293. }),
  294. 62..=64 => ForestFeature::Bear,
  295. _ => ForestFeature::Empty,
  296. }
  297. })
  298. .collect()
  299. })
  300. .collect::<_>()
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement