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$ <> ""
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.