回 帖 发 新 帖 刷新版面

主题:贪吃蛇

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个回复)

沙发

不错啊,真快啊。我刚想试一下手:)

板凳

我知道楼主很强

3 楼

强强。。。
先说一句。。佩服佩服
你用的啥电脑写的啊。。。。我运行了一下

健步如飞。。。那个速度啊。。。。真叫个快。。。。不会真的是P266吧?  

还好你留了个速度变量.

我发现游戏算法大多都是相通的。以前我也没弄明白这玩意怎么写的。后来看了一个别人写的“雪花飘”的显示雪花的演示程序。才弄明白原来贪食蛇也能这样写啊。包括现在我玩大富翁游戏也能大概猜出里面到底用的是啥方法了。不过限于用QB自带的函数过程也就那显示速度和质量,现在实在是没什么激情了。

雨中飞燕不是玩C++的吗?怎么也有兴趣改行了玩QB了?

4 楼

LS:
一点都不快!
如果你觉得快了把snakespeed改为大一点的数就行了。

5 楼

谢谢,没想到飞燕版主能来,真是太高兴了。

6 楼

偶现在对Console下的游戏都没有什么激情,宁愿用GDI写

7 楼

是啊,DOS确实有些老了

8 楼

这些问题好像怎样实现规则会更重要一些:

强强用图形方式做的的确好看一些.
1. 按反方向的按键在诺基亚里是不是不会死?
2. 万一食物出在蛇身会出现什么现象?会不会有这个可能?
3. 其实如果换成C,就会不出现数组的续个元素往后推的问题了.(小问题可以这样解决,大问题嘛.....)
   问问狱中肺炎就知道了(我发誓这个名字绝对不是我起的)
   其实QB也有类似的办法,那就是字符串

9 楼

[quote]这些问题好像怎样实现规则会更重要一些:

强强用图形方式做的的确好看一些.
1. 按反方向的按键在诺基亚里是不是不会死?
2. 万一食物出在蛇身会出现什么现象?会不会有这个可能?
3. 其实如果换成C,就会不出现数组的续个元素往后推的问题了.(小问题可以这样解决,大问题嘛.....)
   问问狱中肺炎就知道了(我发誓这个名字绝对不是我起的)
   其实QB也有类似的办法,那就是字符串[/quote]
那个是队列,QB一样可以不复制元素的方式实现,
如果复制元素地做,又慢又麻烦。。。

10 楼

谢谢MOZ和飞燕
确实是一个队列,数组一共就60个,当数组元素后移的时候第60个数组的值被覆盖了,只有当ISBODY的值为1的时候才显示圆圈,每循环一次的时候就重新画食物,当蛇身完全走过的时候食物会显示出来,呵呵,MOZ想的很周道,这个问题是当我在玩这个贪吃蛇时无意发现的,你能看出来,呵呵
MOZ字符串用得确实很好,我很佩服

我来回复

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