Snowfall Part II
Well, here is version where snow that has allready "landed" spreads and no that kind of high "towers" cant be formed than on my 20 line combo version did. Considering that there is practically 3 chars to use for presenting spreading with ASCII, i think this is pretty cool for as my first try. *oh this good smell of my ego* :D
' public domain
Option Explicit
Randomize Timer
SCREEN 13
Color 15, 0 : CLS
Const SF = 5
Const Full = 4
Const Medium = 3
Const Low = 2
Const Empty = 1
SUB RandNew(X, DemoScreen() AS Integer)
DIM AS Integer XLoc, YLoc
XLoc = INT(RND * X) + 1
YLoc = INT(RND * 40) + 1
DemoScreen(XLoc, YLoc) = SF
END SUB
DIM AS Integer Chars(5)
Chars(5) = 46
Chars(4) = 219
Chars(3) = 220
Chars(2) = 95
Chars(1) = 32
DIM AS Integer CounterX, CounterY
DIM AS Integer DemoScreen(25, 40)
For CounterX = 1 TO 25
For CounterY = 1 TO 40
DemoScreen(CounterX, CounterY) = Empty
Next CounterY
Next CounterX
For CounterY = 1 TO 40
DemoScreen(25, CounterY) = Full
LOCATE 25, CounterY: Print CHR$(Full);
Next CounterY
For CounterY = 1 TO 25
RandNew(23, DemoScreen())
Next CounterY
DO
SLEEP 100
For CounterX = 24 TO 1 STEP -1
For CounterY = 1 TO 40
LOCATE CounterX, CounterY : Color 15, 0
Print CHR$(Chars(DemoScreen(CounterX, CounterY)));
IF DemoScreen(CounterX, CounterY) = Full OR DemoScreen(CounterX, CounterY) = Medium THEN
IF DemoScreen((CounterX + 1), (CounterY + 1)) < Full AND CounterY < 40 THEN
DemoScreen((CounterX + 1), (CounterY + 1)) = DemoScreen((CounterX + 1), (CounterY + 1)) + 1
DemoScreen(CounterX, CounterY) = DemoScreen(CounterX, CounterY) - 1
END IF
IF DemoScreen((CounterX + 1), (CounterY - 1)) < Full AND CounterY > 1 THEN
DemoScreen((CounterX + 1), (CounterY - 1)) = DemoScreen((CounterX + 1), (CounterY - 1))+ 1
DemoScreen(CounterX, CounterY) = DemoScreen(CounterX, CounterY) - 1
END IF
END IF
IF DemoScreen((CounterX + 1), CounterY) > Empty AND DemoScreen(CounterX, CounterY) < SF THEN
IF DemoScreen((CounterX + 1), CounterY) = Empty THEN
DemoScreen((CounterX + 1), CounterY) = DemoScreen((CounterX), CounterY)
DemoScreen((CounterX), CounterY) = Empty
END IF
END IF
IF DemoScreen(CounterX, CounterY) = SF THEN
IF DemoScreen((CounterX + 1), CounterY) = Empty THEN
DemoScreen((CounterX + 1), CounterY) = SF
DemoScreen(CounterX, CounterY) = Empty
END IF
IF DemoScreen((CounterX + 1), CounterY) = Full THEN
DemoScreen(CounterX, CounterY) = Low
RandNew(1, DemoScreen())
END IF
IF DemoScreen((CounterX + 1), CounterY) = Medium THEN
DemoScreen((CounterX + 1), CounterY) = Full
DemoScreen(CounterX, CounterY) = Empty
RandNew(1, DemoScreen())
END IF
IF DemoScreen((CounterX + 1), CounterY) = Low THEN
DemoScreen((CounterX + 1), CounterY) = Medium
DemoScreen(CounterX, CounterY) = Empty
RandNew(1, DemoScreen())
END IF
END IF
Next CounterY
Next CounterX
LOOP UNTIL INKEY$ <> ""