forest_fire_old.sf 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/ruby
  2. define w = Number(`tput cols` || 80)
  3. define h = Number(`tput lines` || 24)
  4. define r = "\033[H"
  5. define red = "\033[31m"
  6. define green = "\033[32m"
  7. define yellow = "\033[33m"
  8. define chars = [' ', green+'*', yellow+'&', red+'&']
  9. define tree_prob = 0.05f
  10. define burn_prob = 0.0002f
  11. enum |Empty, Tree, Heating, Burning|
  12. define dirs = [
  13. %n(-1 -1), %n(-1 0), %n(-1 1), %n(0 -1),
  14. %n(0 1), %n(1 -1), %n(1 0), %n(1 1),
  15. ]
  16. var forest = h.of { w.of { 1.rand < tree_prob ? Tree : Empty } }
  17. var range_h = h.range
  18. var range_w = w.range
  19. func iterate {
  20. var new_forest = h.of{ w.of(0) }
  21. for i = range_h, j = range_w {
  22. given (new_forest[i][j] = forest[i][j]) {
  23. when (Tree) {
  24. 1.rand < burn_prob && (new_forest[i][j] = Heating; next)
  25. for y,x in (dirs) {
  26. y += i; x += j
  27. range_h.contains(y) || next
  28. range_w.contains(x) || next
  29. new_forest[i][j] = Heating if (forest[y][x] == Heating)
  30. }
  31. }
  32. when (Heating) { new_forest[i][j] = Burning }
  33. when (Burning) { new_forest[i][j] = Empty }
  34. case (1.rand < tree_prob) { new_forest[i][j] = Tree }
  35. }
  36. }
  37. forest = new_forest
  38. }
  39. STDOUT.autoflush(true)
  40. func init_forest {
  41. print r
  42. forest.each { |row|
  43. print chars[row...]
  44. print "\033[E\033[1G"
  45. }
  46. iterate()
  47. }
  48. loop { init_forest() }