易码技术论坛

 找回密码
 加入易码
搜索
查看: 129823|回复: 5

for to 的暂停

[复制链接]
发表于 2005-1-9 23:29:00 | 显示全部楼层
原因不在此
在这:c=peek(199)
当还没有遇到inkey$前按了键,这时系统会自动存储你上次按的键作为缓存,在调用inkey$时直接默认用户按了"缓存"的键值
可能我说的不太细:
看这段代码:
10 POKE 199,0
20 IF PEEK(199)<>0 THEN GOTO 40
30 GOTO 20
//上面是一个循环,等待你按任意一个键,在跳转到40
40 C=ASC(INKEY$)
50 PRINT C-128
60 END
运行后在屏幕无任何显示的情况下按输入,则会打印13
按右键则会打印22
你的inkey$用的不好,应该换做c=asc(inkey$),如果单独使用inkey$会造成"字符串太复杂"的错误
楼主的inkey$可以替换成如下代码:
N POKE 199,0
N+1 IF PEEK(199)<>0 THEN POKE 199,0:GOTO N+3
N+2 GOTO N+1
N+3 :继续
另外:楼主要知道:199存放的是上一次按的键值+128,那么运行BAS文件后的199值会为13(你要按输入运行它啊,你按的是输入,所以会是13)所以判断peek(199)只前一定要先poke 199,0
楼主写贪吃蛇的方法并不好
楼主的循环中除非peek(199)满足上下左右的值蛇才能动,如果你在游戏中按了其他键 那么蛇会静止不动,楼主似乎缺乏经验,建议找写别人写过的代码仔细研究一下,注意一下风格以及排版,有助于升级和修改查错
 楼主| 发表于 2005-1-16 15:04:00 | 显示全部楼层
我知道拉!!!!1 多谢指教!!!!!!!
不过laugj你有一点说的不对那就是我写的这段确实很流畅,我的同学有wqx的都在玩我编的这个(自我陶醉中……)
这是我第一次编写正式的程序所以说确实有些经验不足,希望大家多多指教。我也会努力的!!!!!
[em01]
7714_9944_3125.jpg
发表于 2005-1-16 22:15:00 | 显示全部楼层
我的意思是风格和排版
你的程序可以大体分几块,那没在每块的后面或前面至少要留50行的空白行号
好用来日后修整!
7710_9952_3126.bmp
7710_9952_3127.bmp
7710_9952_3128.bmp
发表于 2005-1-22 10:26:00 | 显示全部楼层
[转贴]这里有一个结构不错的贪食蛇
(文件头部——界面的显示)
10 GRAPH:CLEAR:CLS
20 BOX 1,0,160,80,0,1OCATE 2,4RINT "RiverPigFamily";
25 LOCATE 4,5RINT "For SuperMan"
26 LOCATE 3,6RINT "闪电贪食蛇";:POKE 199,0
30 IF PEEK(199)=0 THEN GOTO 30 ELSE POKE 199,0:CLEAR:CLS:HEADX=20:HEADY=10:GOSUB 3000
(游戏的初始变量设定)
40 TAILX=24:TAILY=10
50 DIM BOXS(40,20):BOXS(21,10)=1:BOXS(22,10)=1:BOXS(23,10)=1:BOXS(24,10)=1:GOSUB 2000
60 DIRECT=1:REM 1 LEFT 2 RIGHT 3 UP 4 DOWN
70 POKE 199,0:EAT=1:N=-1
80 BOX 80,40,95,43,1,1
==============================闪电贪食蛇的主体=================================
90 A=PEEK(199)
91 BOX 1,0,160,80,0,1
(蛇头部)
95 HLX=HEADX:HLY=HEADY
100 IF A<>0 THEN POKE 199,0:GOSUB 1000
110 IF DIRECT=1 THEN HEADX=HEADX-1:IF HEADX<0 THEN GOSUB 1500
120 IF DIRECT=2 THEN HEADX=HEADX+1:IF HEADX>39 THEN GOSUB 1500
130 REM
140 IF DIRECT=3 THEN HEADY=HEADY-1:IF HEADY<0 THEN GOSUB 1500
150 IF DIRECT=4 THEN HEADY=HEADY+1:IF HEADY>19 THEN GOSUB 1500
160 BOXS(HLX,HLY)=DIRECT
163 IF PEEK(191)<>255 OR PEEK(195)<>255 OR PEEK(196)<>255 THEN GOTO 170 (延时程序控制,当用户下方向键不放时屏蔽延时)
165 FOR C=1 TO SPEED:NEXT C
170 IF BOXS(HEADX,HEADY)=9 THEN EAT=1:GOTO 250
175 IF BOXS(HEADX,HEADY)<>0 THEN GOTO 1500
(蛇尾部)
180 TDIRECT=BOXS(TAILX,TAILY)
190 BOXS(TAILX,TAILY)=0
200 IF TDIRECT=1 THEN TAILX=TAILX-1
210 IF TDIRECT=2 THEN TAILX=TAILX+1
220 IF TDIRECT=3 THEN TAILY=TAILY-1
230 IF TDIRECT=4 THEN TAILY=TAILY+1
240 BOX TAILX*4,TAILY*4,TAILX*4+3,TAILY*4+3,1,0
250 BOX HEADX*4,HEADY*4,HEADX*4+3,HEADY*4+3,1,1:IF EAT=0 THEN GOTO 290 ELSE EAT=0
260 N=N+1:X=INT(RND(1)*40)
270 Y=INT(RND(1)*20)
280 IF BOXS(X,Y)<>0 THEN GOTO 260 ELSE BOXS(X,Y)=9
290 BOX X*4,Y*4,X*4+3,Y*4+3,0,1
300 GOTO 90
==============================闪电贪食蛇的主体=================================
(按键判断)
1000 IF A=151 AND DIRECT<>2 THEN DIRECT=1:GOTO 1050
1010 IF A=150 AND DIRECT<>1 THEN DIRECT=2:GOTO 1050
1020 IF A=148 AND DIRECT<>4 THEN DIRECT=3:GOTO 1050
1030 IF A=149 AND DIRECT<>3 THEN DIRECT=4:GOTO 1050
1040 POKE 199,0
1045 IF PEEK(199)=0 THEN GOTO 1045 ELSE POKE 199,0
1050 RETURN
(游戏的分数统计部分)
1500 CLS:BOX 1,0,160,80,0,1OCATE 2,6:PRINT "GAME  OVER";OCATE 4,2:PRINT "总分:";
1510 PRINT 1000+N*(HARDR*50+SPEEDR*10);" 共:";N;"个";
1515 N=1000+N*(HARDR*50+SPEEDR*10):POKE 199,0
1518 A=PEEK(199):IF A=0 THEN GOTO 1518 ELSE POKE 199,0
1520 OPEN "SN_WINER" FOR APPEND AS #1
1530 WRITE#1,"RiverPigFamily"
1540 CLOSE#1 :NUM=1000:NAMES$="PLEAR"
1550 OPEN "SN_WINER" FOR INPUT AS #1
1560 INPUT#1,TEMP$:IF TEMP$="RiverPigFamily" THEN CLOSE#1:GOTO 1580
1570 NAMES$=TEMP$:INPUT#1,NUM :CLOSE#1
1580 IF N<=NUM THEN GOTO 1630 ELSE NUM=N
1590 CLS:BOX 1,0,160,80,0,1
1600 POKE 947,0:LOCATE 3,2:
1610 INPUT "YOUR NAME:";NAMES$ :POKE 947,128
1620 IF LEN(NAMES$)>9 THEN NAMES$=LEFT$(NAMES$,9)
1625 IF NAMES$="" THEN NAMES$="PLEAR"
1630 OPEN "SN_WINER" FOR OUTPUT AS #1
1640 WRITE#1,NAMES$,NUM:CLOSE#1
1650 CLS:BOX 1,0,160,80,0,1
1660 LOCATE 2,4:PRINT "最高分:";
1670 LOCATE 3,3:PRINT RIGHT$("        "+NAMES$,9);" ";RIGHT$(STR$(NUM+1000000),6);
1680 POKE 199,0
1690 IF PEEK(199)=0 THEN GOTO 1690 ELSE POKE 199,0:CLS:GOTO 20
(一个简易的地图生成器)
2000 FOR D=1 TO 18 STEP HARD
2010 FOR F=2 TO 39 STEP HARD
2015 FS=F:IF HARDR=7 THEN FS=F+INT(D/2)-INT(INT(D/2)/2)*2-1
2020 BOXS(FS,D)=1
2030 BOX FS*4,D*4,FS*4+3,D*4+3,1,1
2040 NEXT F
2050 NEXT D
2060 RETURN

发表于 2005-1-22 23:47:00 | 显示全部楼层
在蛇行走的时候按与蛇行走方向相反的健回停住
你可以借鉴借鉴这个贪吃蛇
可以设计个循环,一个值FPS,每循环一次FPS+1,在循环中根据FPS的值运行程序和修改FPS
如果你能看的懂的话:
0 CLEAROKE 805,0OKE 806,1OKE 807,255:POKE 808,96:START=45:EAT=9:GAMEO=7
1 :
5 WIN=2IM X,Y,I
10 GRAPH:SD=0:CD=5:SCORE=0:UP=1OWN=2:RIGHT=3EFT=4IM F(4):DIM TOPS(11):SOUND=0
14 FOR Y=0  TO 78  STEP +2INE 1,Y,159,Y:NEXT :FOR X=1  TO 159  STEP +2INE X,0,X,79,2:NEXT
15 BOX 37,30,122,50,1,0:LOCATE 3,6:PRINT "Basic Now!";:BOX 37,30,122,50:POKE 199,0
16 FOR I=39  TO 119  STEP +2:LINE I,32,I,48,2:NEXT :FOR I=120  TO 40  STEP -2:LINE I,32,I,48,2
17 NEXT :DIM TOPN$(11):FOR I=0  TO 6000:IF PEEK(199)<>0  THEN POKE 199,0:GOTO 19
18 NEXT
19 FOR I=0  TO 3:FOR Y=0  TO 19:LINE 1,Y*4+I,159,Y*4+I,1:NEXT :NEXT
20 FOR I=3  TO 0  STEP -1:FOR Y=0  TO 19:LINE 1,Y*4+I,159,Y*4+I,0:NEXT :NEXT :CLS
21 PRINT "贪吃蛇 V0.15A"," [JD]laugj":DIM SET(3)
22 DIM MAXSET(3):F(1)=2:F(2)=1:F(3)=4:F(4)=3:MAXSET(1)=10:MAXSET(2)=21:MAXSET(3)=3
23 PRINT "[帮助]"," <方向>  控制方向"," 赞停 <跳出>退出";:BOX 2,32,158,78,1,2
30 BOX 1,0,159,79:FOR I=0  TO 1500:IF PEEK(199)<>0  THEN POKE 199,0:GOTO 32
31 NEXT
32 IF PEEK(199)>0  THEN C=ASC (INKEY$ )
34 FOR I=0  TO 3:FOR Y=0  TO 19:LINE 1,Y*4+I,159,Y*4+I,1:NEXT :NEXT
35 FOR I=3  TO 0  STEP -1:FOR Y=0  TO 19:LINE 1,Y*4+I,159,Y*4+I,0:NEXT :NEXT :CLS
36 Y=1:C=0
39 GRAPH:PRINT "[参数设定]","等级","长度","声音","<输入>OK <跳出>退出";
40 BOX 1,0,159,79:BOX 2,1,158,15,1,2:BOX 2,64,158,78,1,2
41 FOR I=1  TO 3:FOR II=0  TO MAXSET(I):LINE 40+II*3,I*16,39+II*3,I*16+14:NEXT :NEXT
42 FOR I=1  TO 3:LINE 40,I*16+1,40,I*16+13:NEXT
43 IF Y=0  THEN Y=3
44 IF Y=4  THEN Y=1
45 BOX 2,Y*16,32,Y*16+15,1,2
50 :
51 C=ASC (INKEY$ )
52 IF C=20  THEN BOX 2,Y*16,32,Y*16+15,1,2:Y=Y-1:GOTO 43
53 IF C=21  THEN BOX 2,Y*16,32,Y*16+15,1,2:Y=Y+1:GOTO 43
54 IF C=13  THEN GOTO 65
55 IF C=27  THEN TEXT :PRINT "GOOD BYE!";:END
56 IF C=22  THEN SET(Y)=SET(Y)+1:GOTO 59
57 IF C=23  THEN SET(Y)=SET(Y)-1:GOTO 59
58 GOTO 51
59 IF SET(Y)>=MAXSET(Y) THEN SET(Y)=MAXSET(Y)
60 IF SET(Y)<0 THEN SET(Y)=0
61 LINE SET(Y)*3+40,Y*16+1,SET(Y)*3+40,Y*16+13,1
62 LINE SET(Y)*3+43,Y*16+1,SET(Y)*3+43,Y*16+13,0
63 GOTO 51
65 SD=SET(1):CD=5+INT(SD*1.4):SOUND=SET(3)
66 GOTO 1000
120 SCORE=SCORE+SD+3:LOCATE 5,7:PRINT SCORE;:LINE 1,64,159,64
125 BOX CX*4+1,CY*4,CX*4+4,CY*4+3,1,1
126 IF SOUND>0  THEN POKE 806,EAT:CALL 805
130 M=INT(RND(1)*640)
140 IF MAP(M)<>0  THEN GOTO 130
145 CY=INT(M/40):CX=M-CY*40:BOX CX*4+1,CY*4,CX*4+4,CY*4+3
150 CD=CD+1:G=1
160 IF CD>=20+INT(SD*2.3)+SD  THEN SD=SD+1:CD=5+INT(SD*1.4):GOTO 161  ELSE GOTO 170
161 IF SD=11  THEN GOTO 1280  ELSE GOTO 162
162 POP :GOTO 1001
170 RETURN
1000 DIM MAP(640):HEADX=0:HEADY=0:TAILX=0:TAILY=0
1001 D=MAP(TAILX+TAILY*40):MAP(TAILX+TAILY*40)=0
1002 IF TAILX=HEADX  AND TAILY=HEADY  THEN GOTO 1011
1003 ON D GOTO 1004,1005,1006,1007
1004 TAILY=TAILY-1:GOTO 1001
1005 TAILY=TAILY+1:GOTO 1001
1006 TAILX=TAILX+1:GOTO 1001
1007 TAILX=TAILX-1
1008 GOTO 1001
1011 IF SOUND>1 THEN POKE 806,START:CALL 805
1012 FOR X=1  TO 175  STEP +2:LINE X*(X<160),0,X*(X<160),79,0:
1013 IF X>16  THEN LINE X-15,0,X-15,79,0
1014 NEXT :CLS:LOCATE 5,1:PRINT "Score:";SCORE;:LOCATE 5,11:PRINT "Level:";SD;
1020 LINE 1,64,159,64
1030 FOR I=0  TO CD+SET(2)-1:MAP(I)=RIGHT:BOX I*4+1,0,I*4+4,3,1,1:NEXT :HEADX=CD+SET(2)-1
1031 HEADY=0:D=RIGHT
1040 TAILX=0:TAILY=0:CX=INT(RND(1)*39+1):CY=INT(RND(1)*14+2):BOX CX*4+1,CY*4,CX*4+4,CY*4+3
1050 A=(10-SD)+1:POKE 199,0
1055 FOR FPS=0  TO 65535
1070 IF FPS>=A  THEN GOTO 1080  ELSE GOTO 1160
1080 IF MAP(HEADX+HEADY*40)=F(D) THEN MAP(HEADX+HEADY*40)=D:FPS=FPS+1:GOTO 1070
1081 FPS=0:IF SOUND>2  THEN PLAY "L 100 C B"
1090 D=MAP(HEADX+HEADY*40):ON D GOTO 1100,1101,1102,1103
1100 HEADY=HEADY-1:GOTO 1104
1101 HEADY=HEADY+1:GOTO 1104
1102 HEADX=HEADX+1:GOTO 1104
1103 HEADX=HEADX-1
1104 IF HEADX>=40  OR HEADX<0  THEN GOTO 1230
1105 IF HEADY>=16  OR HEADY<0  THEN GOTO 1230
1106 IF MAP(HEADX+HEADY*40)<>0  THEN GOTO 1230
1107 MAP(HEADX+HEADY*40)=D
1108 IF HEADX=CX  AND HEADY=CY  THEN GOSUB 120
1109 IF G=0  THEN BOX TAILX*4+1,TAILY*4,TAILX*4+4,TAILY*4+3,1,0
1110 BOX HEADX*4+1,HEADY*4,HEADX*4+4,HEADY*4+3,1,1
1111 E=MAP(TAILX+TAILY*40):IF G=0  THEN MAP(TAILX+TAILY*40)=0
1112 IF G=0  THEN GOTO 1113  ELSE G=0:GOTO 1160
1113 ON E GOTO 1120,1130,1140,1150
1120 TAILY=TAILY-1:GOTO 1160
1130 TAILY=TAILY+1:GOTO 1160
1140 TAILX=TAILX+1:GOTO 1160
1150 TAILX=TAILX-1
1160 IF PEEK(199)=240  THEN C=ASC (INKEY$ ):C=ASC (INKEY$ ):GOTO 1220
1170 IF PEEK(199)=148  THEN MAP(HEADX+HEADY*40)=UP:POKE 199,0:GOTO 1080
1180 IF PEEK(199)=149  THEN MAP(HEADX+HEADY*40)=DOWN:POKE 199,0:GOTO 1080
1190 IF PEEK(199)=150  THEN MAP(HEADX+HEADY*40)=RIGHT:POKE 199,0:GOTO 1080
1200 IF PEEK(199)=151  THEN MAP(HEADX+HEADY*40)=LEFT:POKE 199,0:GOTO 1080
1220 NEXT
1230 FOR I=784  TO 803:POKE I,0:NEXT
1235 IF SOUND>1  THEN POKE 806,GAMECALL 805
1240 FOR Y=0  TO 78  STEP 2:LINE 1,Y,159,Y:NEXT :FOR X=1  TO 159  STEP 2:LINE X,0,X,79,2
1241 NEXT :FOR X=160  TO 1  STEP -3:LINE X,0,X,79:NEXT :FOR Y=78  TO 0  STEP -3
1242 LINE 1,Y,159,Y:NEXT
1243 LOCATE 3,6:PRINT "GAME  OVER"
1250 :
1260 :
1270 FOR I=0  TO 10000:NEXT :GOTO 2015
1280 FOR I=784  TO 803:POKE I,0:NEXT :BOX 32,31,128,48,1,0:LOCATE 3,5:PRINT "STAGE CLEAR!";
1281 IF SOUND>1  THEN POKE 806,WIN:CALL 805
1290 BOX 32,31,128,48:POKE 199,0:FOR X=34  TO 126:LINE X,34,X,46,2
1300 IF PEEK(199)<>0  THEN GOTO 2015
2000 NEXT
2001 :
2010 :
2015 OPEN "Snake" FOR RANDOM AS #1:L=LOF(1):CLOSE #1:IF L=0 THEN OPEN "Snake" FOR OUTPUT AS #1
2016 FOR I=0 TO 9:WRITE #1,"NOBODY",0:NEXT:CLOSE #1
2019 OPEN "Snake" FOR INPUT AS #1
2020 FOR I=1  TO 10:INPUT #1,TOPN$(I),TOPS(I):NEXT :CLOSE #1
2030 FOR I=10  TO 1  STEP -1
2040 IF SCORE>TOPS(I) THEN TOPS(I+1)=TOPS(I):TOPN$(I+1)=TOPN$(I):S=I:FLAG=1
2070 NEXT :IF FLAG=0  THEN GOTO 2090
2071 TEXT :PRINT "恭喜!你上榜了!":INPUT "大名:";TOPN$(S):TOPS(S)=SCORE
2072 IF TOPN$(S)="" THEN BEEP :GOTO 2071
2080 OPEN "Snake"FOR OUTPUT AS #1
2085 FOR I=1  TO 10:?1,TOPN$(I),TOPS(I):NEXT :CLOSE #1
2090 GRAPH
2100 FOR Y=1  TO 5:BOX 1,(Y-1)*16,159,Y*16-1,1,1:BOX 1,(Y-1)*16,159,Y*16-1,1,0
2110 LOCATE Y,1:PRINT Y;".";TOPN$(Y);:LOCATE Y,11:PRINT TOPS(Y);:NEXT
2115 POKE 199,0:FOR D=0  TO 65335:IF PEEK(199)<>0  THEN CLS:GOTO 2120
2116 NEXT :CLS
2120 FOR Y=1  TO 5:BOX 1,(Y-1)*16,159,Y*16-1,1,1:BOX 1,(Y-1)*16,159,Y*16-1,1,0
2125 LOCATE Y,1:PRINT Y+5;".";TOPN$(Y+5);:LOCATE Y,11:PRINT TOPS(Y+5);:NEXT
2130 C=ASC (INKEY$ ):C=ASC (INKEY$ )
2140 CLEAR:GOTO 0
 楼主| 发表于 2005-1-9 15:45:39 | 显示全部楼层 |阅读模式
我正编basic的入门游戏贪吃蛇,很菜的 遇到了一个问题  我很菜,但正在努力学,希望高手多多指教,不要想着这问题很菜就不说,照顾照顾新手麻。[em11]

大家先看原码(还没有完成,吃豆的语句还没有加入):

10 n=5:a=100:v=2:graph      我这里让a=100原因是将来吃住一个豆后建立新的数据简单,大侠不要笑啊

30 dim x(a),y(a),xx(a),yy(a),px(a),py(a)               px   py是方向

40 for e=1 to n

41 x(e)=15-2*(e-1) : y(e)=4

50 xx(e)=x(e):yy(e)=y(e)

51 px(e)=1 : py(e)=0

60 next e

70 for e= 1 to n

80  box x(e),y(e),x(e)+1,y(e)+1

90 x(e)=x(e)+1

100 next e

110 for e=1 to n

111 if peek(199)>128 then gosub 200

120 box x(e),y(e),x(e)+1,y(e)+1

130 box xx(e),yy(e),xx(e)+1,yy(e)+1,0,0

140 xx(e)=x(e):yy(e)=y(e)

150 d=(px(e)=-1)+(px(e)=1)*2+(py(e)=-1)*3+(py(e)=1)*4

151 on d goto 152,153,154,155

152 x(e)=x(e)-v : goto 156

153 x(e)=x(e)+v : goto 156

154 y(e)=y(e)-v : goto 156

155 y(e)=y(e)+v : goto 156

156 if e=n then x(1)=x(e):y(1)=y(e):goto 160

157 x(e+1)=x(e):y(e+1)=y(e)

160 next e

170 goto 110

200 c=peek(199)

210 if c=249 then py(e)=1:px(e)=0

220 if c=231 then py(e)=-1:px(e)=0

230 if c=232 then px(e)=-1:py(e)=0

240 if c=249 then px(e)=1:py(e)=0

250 if c=240 goto 270

260 return                                                       关键是这几局

270 locate 2,1:print"暂停状态,任意键继续"

280 inkey$

290 return

首先很感谢您能看玩圆码

我的问题是程序中如果按P键,只是在屏幕上显出那句话来,而蛇还在动(就是下画线的那几句)!!!1

我想问一下是不是inkey$不能使for   to的进程停下来。希望有人能解答。我在这里先谢了。


而我根据这个现象又做了个小游戏,过几天完全做好之后再与大家分享。

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-6-16 01:54 , Processed in 0.015559 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表