谢谢

DECLARE SUB tree (x%, y%, size%)
DECLARE SUB updatesnow ()
DECLARE SUB updatescroll ()
DECLARE SUB wipe (num%)
DECLARE SUB initmusic ()
DECLARE FUNCTION rand% (upperbound%, lowerbound%)
DECLARE FUNCTION isnum% (a$)
DEFINT A-Z
SCREEN 13
CONST maxflakes = 1000
DIM SHARED x(maxflakes) AS INTEGER
DIM SHARED y(maxflakes) AS INTEGER
DIM SHARED c(maxflakes) AS INTEGER
DIM SHARED t(maxflakes) AS INTEGER
DIM SHARED inc(maxflakes) AS INTEGER
DIM SHARED music$(6)
FOR i = 1 TO maxflakes
    x(i) = RND * 319
    y(i) = RND * -600
    c(i) = rand(27, 31)
    inc(i) = rand(0, 1)
    t(i) = inc(i)
NEXT i
LOCATE 10, 10
COLOR 90
PRINT "  happy holidays!"
LOCATE 12, 10
COLOR 103
PRINT "  new year 2001"
LOCATE 14, 6
COLOR 99
PRINT "best wishes for everyone!"
SLEEP 1
CLS
LINE (1, 10)-(319, 10), 100, , &HAAAA
COLOR 15
tree 40, 140, 3
tree 279, 140, 3
initmusic
ON PLAY(1) GOSUB nextnote
PLAY ON
PLAY "mbp2"
DO
     updatesnow
     updatescroll
     WAIT &H3DA, 8
     WAIT &H3DA, 8, 8
LOOP WHILE INKEY$ = ""
PLAY OFF
wipe rand(1, 3)
END
nextnote:
i = i MOD 7
IF i = 6 THEN
     PLAY "mb" + music$(i) + "p3"
ELSE
PLAY "mb" + music$(i)
END IF
i = i + 1
RETURN





SUB initmusic
music$(i) = "mbmnt200o3l4cfl2fgl4dddgl8gagf"
music$(1) = "l4eccal8ab-agl4fdl8ccl4dgel2f"
music$(2) = "l4cfffl2el4efedl2cl4cagf"
music$(3) = "o4l4co3l4cl8ccl4dgel2f"
music$(4) = "l4cfl8fgfel4dddgl8gagfl4"
music$(5) = "eccal8ab-ag"
music$(6) = "l4fdl8ccl4dgel2f"
END SUB

FUNCTION isnum (a$)
IF ASC(a$) >= 48 AND ASC(a$) <= 57 THEN isnum = -1
END FUNCTION

FUNCTION rand (lowerbound, upperbound)
rand = INT((upperbound - lowerbound + 1) * RND + lowerbound)
END FUNCTION

SUB tree (x, y, size)
LINE (x - 1 * size, y + 15 * size)-(x + 1 * size, y + 21 * size), 6, BF
LINE (x, y)-(x + 10 * size, y + 15 * size), 2
LINE (x, y)-(x - 10 * size, y + 15 * size), 2
LINE (x - 10 * size, y + 15 * size)-(x + 10 * size, y + 15 * size), 2
PAINT (x, y + 10 * size), 2
FOR radius = 1 TO 2 * size
    CIRCLE (x, y), radius, 14
NEXT radius
RANDOMIZE TIMER
FOR i = 1 TO 11
    DO
        xx = rand(x - 10 * size, x + 10 * size)
        yy = rand(y + 3 * size, y + 15 * size)
    flag = -1
    FOR a = xx - 3 TO xx + 3
      FOR b = yy - 4 TO yy + 4
       IF POINT(a, b) <> 2 THEN flag = 0
      NEXT b
    NEXT a
    IF flag THEN
       LINE (xx, yy - 4)-(xx, yy), 8, BF
       CIRCLE (xx, yy), 2, 4
       PAINT (xx, yy), 4
       EXIT DO
    END IF
    LOOP
NEXT i
END SUB



SUB updatescroll
STATIC i, n, a() AS INTEGER, init, s$
IF init = 0 THEN
      er = 4 + INT(((319 - 1) + 1) * (8) + 7) / 8 * 1 * ((9 - 0) + 1)
      DIM a(er) AS INTEGER
      init = 1
      i = 1
      s$ = "\100best wishes for you!                             "
      s$ = s$ + "\33t+34h\35i\36s\42\43p\44r\45o\75g\76r\77a\78m\79w\80r\81i\82t\83t\84e\85n\93by\96shangjun."
      s$ = s$ + "\55h\56e\57l\58l\59o\60!\103welcome to see mr."
      s$ = s$ + "shang in class 8 grade 3 in shanxi chenggu teachers' school!\89h\90a\91p\92p\93y\94n\95e\96w\97y\98e\99a\100r\101!"
      s$ = s$ + "                                                                                                                    "
      END IF
      IF i = LEN(s$) + 1 THEN i = 1
      IF n = 8 THEN
           LOCATE 1, 40
           q$ = MID$(s$, i, 1)
      IF q$ = "\" THEN
           b$ = MID$(s$, i + 1, 3)
           FOR z = 1 TO LEN(b$)
               IF NOT (isnum(MID$(b$, z, 1))) THEN EXIT FOR
           NEXT z
      COLOR VAL(MID$(b$, 1, z - 1))
      i = i + LEN(MID$(b$, 1, z - 1)) + 1
      END IF
      PRINT MID$(s$, i, 1)
      n = 0
      i = i + 1
      ELSE
      GET (1, 0)-(319, 9), a(0)
      PUT (0, 0), a(0), PSET
          n = n + 1
      END IF
END SUB

SUB updatesnow
FOR i = 0 TO maxflakes
    IF t(i) = 0 THEN
    IF y(i) > 10 THEN
         lastx = x(i)
         lasty = y(i)
    IF POINT(lastx, lasty + 1) = 0 THEN
        y(i) = y(i) + 1
        PSET (lastx, lasty), 0
        PSET (x(i), y(i)), c(i)
    ELSE
    IF POINT(lastx - 1, lasty) = 0 AND POINT(lastx - 1, lasty + 1) = 0 THEN
        IF POINT(lastx + 1, lasty) = 0 AND POINT(lastx + 1, lasty + 1) = 0 THEN
        IF RND > .5 THEN
            x(i) = x(i) - 1
            y(i) = y(i) + 1
            PSET (lastx, lasty), 0
            PSET (x(i), y(i)), c(i)
            ELSE
            x(i) = x(i) + 1
            y(i) = y(i) + 1
            PSET (lastx, lasty), 0
            PSET (x(i), y(i)), c(i)
        END IF
        ELSE
            x(i) = x(i) - 1
            y(i) = y(i) + 1
            PSET (lastx, lasty), 0
            PSET (x(i), y(i)), c(i)
        END IF
        ELSEIF POINT(lastx + 1, lasty) = 0 AND POINT(lastx + 1, lasty + 1) = 0 THEN
        x(i) = x(i) + 1
        y(i) = y(i) + 1
        PSET (lastx, lasty), 0
        PSET (x(i), y(i)), c(i)
      ELSE
        x(i) = RND * 319
        y(i) = RND * -600
        c(i) = rand(27, 31)
        inc(i) = rand(0, 1)
        t(i) = inc(i)
      END IF
    END IF
  ELSE
  y(i) = y(i) + 1
  END IF
  t(i) = inc(i)
  ELSE
  t(i) = t(i) - 1
  END IF
  NEXT i
END SUB

SUB wipe (num)
SELECT CASE num
CASE 1
FOR i = 10 TO 1 STEP -1
  FOR x = 0 TO 319
   FOR y = 0 TO 199
    IF x MOD i = 0 AND y MOD i = 0 THEN
     PSET (x, y), 0
    END IF
   NEXT y
  NEXT x
  WAIT &H3DA, 8
  WAIT &H3DA, 8, 8
  IF INKEY$ <> "" THEN CLS : EXIT FOR
NEXT i
CASE 2
  FOR i = 10 TO 1 STEP -1
   FOR x = 0 TO 319 STEP i
    LINE (x, 0)-(x, 199), 0
   NEXT x
   WAIT &H3DA, 8
   WAIT &H3DA, 8, 8
   IF INKEY$ <> "" THEN CLS : EXIT FOR
  NEXT i
  CASE 3
   FOR i = 0 TO 100
   LINE (i, 0)-(i, 199), 0
   LINE (319 - i, 0)-(319 - i, 199), 0
   LINE (0, i)-(319, i), 0
   LINE (0, 199 - i)-(319, 199 - i), 0
   WAIT &H3DA, 8
   WAIT &H3DA, 8, 8
   IF INKEY$ <> "" THEN CLS : EXIT FOR
   NEXT i
  END SELECT
END SUB