回 帖 发 新 帖 刷新版面

主题:贪吃蛇

CONST snakespeed = 150, maxlenth = 200
DECLARE SUB food ()
DECLARE SUB judge ()
DECLARE SUB changearry ()
DECLARE SUB movesnake (x$)
DECLARE SUB showsnake ()
DECLARE SUB initiate ()
SCREEN 12
TYPE snaketype
x AS INTEGER
y AS INTEGER
isbody AS INTEGER
END TYPE
DIM SHARED snake(maxlenth) AS snaketype, snakelenth, foodx, foody, havefood
LINE (0, 0)-(639, 460), 3, B
CALL initiate
DO
  CALL showsnake
  DO
    LOCATE 1, 1
    PRINT "."
    xx$ = INKEY$
    i = i + 1
  LOOP UNTIL xx$ <> "" OR i > snakespeed
  i = 0
  IF xx$ <> "" THEN x$ = xx$
  IF x$ = "t" THEN
    END
  END IF
  CALL movesnake(x$)
  CALL judge
  CALL food
  IF snakelenth = maxlenth THEN
    CLS
    LOCATE 10, 30
    PRINT "GOOD JOB!"
    LOCATE 12, 30
    PRINT "CONGRATULATIONS!!!"
    END
  END IF
LOOP

SUB changearry
FOR i = maxlenth TO 2 STEP -1
  snake(i).x = snake(i - 1).x
  snake(i).y = snake(i - 1).y
NEXT i
END SUB

SUB food
RANDOMIZE TIMER
IF havefood = 0 THEN
foodx = INT(RND * 63) + 1: foody = INT(RND * 45) + 1
havefood = 1
END IF
IF snake(1).x = foodx AND snake(1).y = foody THEN
  havefood = 0
  snakelenth = snakelenth + 1
  snake(snakelenth).isbody = 1
END IF
CIRCLE (foodx * 10, foody * 10), 4, 5
END SUB

SUB initiate
snakelenth = 3
snake(1).x = 10: snake(1).y = 10: snake(1).isbody = 1
snake(2).x = 9: snake(2).y = 10: snake(2).isbody = 1
snake(3).x = 8: snake(3).y = 10: snake(3).isbody = 1
END SUB

SUB judge
IF snake(1).x = 0 OR snake(1).y = 0 OR snake(1).x = 64 OR snake(1).y = 46 THEN
END
END IF
FOR i = 2 TO snakelenth
  IF snake(1).x = snake(i).x AND snake(1).y = snake(i).y AND snake(i).isbody = 1 THEN
    END
  END IF
NEXT i
END SUB

SUB movesnake(x$)
IF x$ = "w" THEN
  CALL changearry
  snake(1).y = snake(1).y - 1
ELSEIF x$ = "s" THEN
  CALL changearry
  snake(1).y = snake(1).y + 1
ELSEIF x$ = "a" THEN
  CALL changearry
  snake(1).x = snake(1).x - 1
ELSEIF x$ = "d" THEN
  CALL changearry
  snake(1).x = snake(1).x + 1
END IF
END SUB

SUB showsnake
FOR i = 1 TO maxlenth
  IF snake(i).isbody = 1 THEN
    CIRCLE (snake(i).x * 10, snake(i).y * 10), 4, 3
  END IF
NEXT i
CIRCLE (snake(snakelenth + 1).x * 10, snake(snakelenth + 1).y * 10), 4, 0
END SUB

编过一个,本来不想再编了,大家对这个问题如此热情,连MOZ版主都讲话了,就写了一个,权当是抛砖引玉了。希望大家多来QB版,支持QB版的发展。
WSAD控制方向,T退出,根据电脑配置不同修改程序第一行SNAKESPEED的值控制蛇的速度,当蛇长到MAXLENTH个长度时通关退出。
程序还有不足的地方,有些变量设置得多余,有些地方效率不高

回复列表 (共16个回复)

11 楼

QB这东西,哪有用得好的说法? 更不会有值得佩服的地方.
而且我对于图形的东西实在没有什么经验(也许是图形模式对算法要求太高了)
我也来献献丑:

DECLARE FUNCTION Getas$ (s$)
DEFLNG A-Z

  COLOR 7, 0
  CLS
  PRINT chr$(218); STRING$(78, 196); chr$(191);
  LOCATE 25, 1: PRINT chr$(192); STRING$(78, 196); chr$(217);
  FOR i = 2 TO 24
      LOCATE i, 1: PRINT chr$(179);
      LOCATE i,80: PRINT chr$(179);
  NEXT
  COLOR 1, 14
  LOCATE 12, 30
  PRINT "      ";
  F = 1
  E# = .9
  s$ = "-12+30-12+31-12+32-12+33-12+34-12+35"
  a$ = Getas$(s$)

  DO
    T1# = TIMER
    DO
         k$ = INKEY$
    LOOP UNTIL k$ <> "" OR ABS(TIMER - T1#) > E#
    SELECT CASE k$
    CASE CHR$(0) + CHR$(75): IF F <> 3 THEN F = 1
    CASE CHR$(0) + CHR$(72): IF F <> 4 THEN F = 2
    CASE CHR$(0) + CHR$(77): IF F <> 1 THEN F = 3
    CASE CHR$(0) + CHR$(80): IF F <> 2 THEN F = 4
    CASE CHR$(27):           F = 0
    END SELECT
    X = VAL(MID$(s$, 2, 2))
    y = VAL(MID$(s$, 5, 2))
    X2 = X
    Y2 = y
    SELECT CASE F
    CASE 1: Y2 = Y2 - 1
    CASE 2: X2 = X2 - 1
    CASE 3: Y2 = Y2 + 1
    CASE 4: X2 = X2 + 1
    END SELECT
    z$ = "-" + RIGHT$(STR$(X2), 2) + "+" + RIGHT$(STR$(Y2), 2)
    IF X2 < 2 OR X2 > 24 OR Y2 < 2 OR Y2 > 79 OR INSTR(s$, z$) THEN
       F = 0
    ELSE
       COLOR 1, 14
       LOCATE X2, Y2
       PRINT " ";
       IF a$ = z$ THEN
          s$ = a$ + s$
          a$ = Getas$(z$)
          T3 = T3 + 1
          IF T3 > 5 THEN
             T3 = 0
             E# = E# - .1
          END IF
       ELSE
          COLOR 7, 0
          LOCATE VAL(RIGHT$(s$, 5)), VAL(RIGHT$(s$, 2))
          PRINT " ";
          MID$(s$, 1) = z$ + s$
       END IF
    END IF
  LOOP WHILE F

FUNCTION Getas$ (s$)
DO
   X = 2 + RND * 22
   y = 2 + RND * 77
   a$ = "-" + RIGHT$(STR$(X), 2) + "+" + RIGHT$(STR$(y), 2)
LOOP WHILE INSTR(s$, a$)
COLOR 0, 4
LOCATE X, y
PRINT "*";
Getas$ = a$
END FUNCTION

12 楼

厉害厉害,比我的强多了。不好意思,我记差了,我记着前面好象加了40了,就点了10分,应该30分。
不过MOZ你这程序太过精深,给小朋友看是不是……
呵呵,开个玩笑

13 楼

道吾好者是吾贼

14 楼

呵呵,MOZ此言差矣

15 楼

先说一声谢谢了!!你们都是高手呀!!!!![em5]

16 楼

不错,同意MATO观点

我来回复

您尚未登录,请登录后再回复。点此登录或注册