TAB 子例程 Applesoft BASIC 出错
Error with TAB subroutine Applesoft BASIC
所以我找到了一本叫做 Weird Computer Games 的旧书,里面有 commodore 64 的 BASIC 文字游戏列表,我想输入 运行,并可能用 C# 或重写一些JS.
问题是,我没有 commodore 64 或任何其他老式机器,所以我使用基于在线 JavaScript 的 Aplesoft BASIC 解释器,我已经到了一个地步错误我不明白 - 我认为这是由于使用了不同的基本方言。或者我看错了一些字符。
我得到的错误是:ParseError: Syntax error: Expected ')', saw {"operator":","} in line 610
但是我找不到关于此 TAB 功能的文档。
下面是代码
10 GOSUB 700 : GOSUB 620
19 REM 20 Set up variables (See if you can work outwhat they are.)
20 LET NW=4 : LET M=0 : LET FM=50
29 REM Choose new height "NH". "H" is heigh
30 GOSUB 530 : LET H=NH
40 GOSUB 550
50 LET EF=0 : LET FF=0 : LET HH=H
60 FOR I=1 TO 4 : LET G(I)=0 : NEXT I
70 FOR I=1 TO 4 : LET A$=P$(I)+":" : LET X=1
80 LET Y=1+I : GOSUB 610 : NEXT I
90 GOSUB 490 : GOSUB 430
100 IF M=FM THEN GOTO 250
110 IF EF=1 THEN GOTO 230
120 IF INKEY$(0)="" THEN GOTO 90
130 LET HH=H-1 : GOSUB 510
140 GOSUB 490 : GOSUB 430
150 LET H=HH
160 IF H>0 THEN GOTO 130
170 IF P=17 THEN GOSUB 320
180 IF FF=1 THEN GOTO 240
190 GOSUB 530
200 LET HH=H+1 : GOSUB 510 : GOSUB 490
210 LET H=HH : IF H=NH THEN GOTO 90
220 GOSUB 430 : GOTO 200
230 LET A$="WELL DONE! SUPERWITCH IS PLEASED WITH YOU"
240 LET A$="OUT OF BROOMSTICKS!" : GOTO 260
250 LET A$="TOO LATE!"
260 LET X=1 : LET Y=15 : GOSUB 610
270 STOP
280 LET A$="W" : LET X=P : GOSUB 610
290 FOR T=1 TO 1000 : NEXT T
300 LET NW=NW-1 : IF NW=0 THEN LET FF=1
310 RETURN
320 IF W=1 THEN GOSUB 280 : RETURN
330 LET G(R)=G(R)+1
340 LET A$=STR$(G(R)) : LET X=17
350 LET Y=1+R : GOSUB 610
360 LET P=19 : GOSUB 430
370 LET F=0
380 FOR I=1 TO 4
390 IF G(I)>=N(I) THEN LET F=F+1
400 NEXT I
410 IF F=4 THEN LET EF=1
420 RETURN
430 LET GD=GD+1 : IF GD=6 THEN LET GD=1
440 LET A$=G$(GD) : LET X=1 : LET Y=15 : GOSUB 610
450 LET A$=" " : LET X=P : LET Y=14 : GOSUB 610
460 LET P=P+1 : IF P=20 THEN GOSUB 550
470 LET X=P : LET A$=C$ : GOSUB 610
480 RETURN
490 LET A$="-Y-=" : LET X=16 : LET Y=14-HH
500 GOSUB 610 : RETURN
510 LET A$=" " : LET X=16 : LET Y=14-H
520 GOSUB 610 : RETURN
529 REM 530-540: Choose new height for witch.
530 LET NH = INT(RND(1)*5+3)
540 RETURN
549 REM 550: Chooses an object.
550 LET R=INT(RND(1)*4)+1
559 REM 560: Random chance of object being Broomstick Snatcher.
560 LET W=0 : IF RND(1)>0.8 THEN LET W=1
570 LET C$=LEFT$(P$(R),1) : LET P=1
580 LET M=M+1
590 IF M=FM THEN LET C$="CAULDRON"
600 RETURN
610 PRINT TAB(X,Y); A$ : RETURN
620 CLS : PRINT : PRINT
630 PRINT "THE POTION MUST HAVE" : PRINT
640 FOR I=1 TO 4
650 LET N=INT(RND(1)*3)+2 : LET N(I)=N
660 PRINT : PRINT; N; " "; P$(I)
670 NEXT I : PRINT : PRINT
680 PRINT "PRESS RETURN TO PLAY"
690 INPUT X$ : CLS : RETURN
700 DIM P$(4) : DIM N(4) : DIM G(4)
710 DIM G$(5)
720 FOR I=1 TO 4 : READ P$(I) : NEXT I
730 DATA "TOES OF NEWTS", "EYES OF LIZARDS", "ROOTS OF IVY", "BRAINS OF BATS"
740 LET H$=">====>====>====>====>===="
750 FOR I=1 TO 5 : LET G$(6-I)=MID$(H$,I,I+20)
760 NEXT I : LET GD=1
770 RETURN
首先,那个时代的 BASIC 非常不同,因此您可能会发现 Commodore 64 仿真器(例如 Virtual Consoles useful. That said, this doesn’t look like Commodore 64 BASIC. The C64 TAB statement 中的仿真器)是面向行的:它只是在当前行上标记了那么多.这意味着它只需要一个参数,X;没有Y.
根据 Internet Archive 上 Weird Computer Games 的版本,该代码并非专门针对 Commodore 64,而是针对“BASIC 的标准版本”(参见第 2 页)。查找标有金字塔符号的更改,以了解 Commodore 64 的更改。在这种情况下,第 610 行(带有双参数选项卡的行)需要更改为:
610 PRINT CHR$(19);FOR LL=1 TO Y:PRINT:NEXT:PRINT TAB(X);A$:RETURN
我已经验证了上面模拟器中的这个子例程确实在屏幕上的坐标 X 和 Y 处打印。
在互联网档案馆的本书版本中,您发布的代码从第 10 页“飞行女巫”开始。 Commodore 64 和其他计算机的必要更改位于第 11 页的“转换线”下。每台计算机都有自己的符号(请参阅第 2 页的符号列表),Commodore 64 的符号是金字塔。
如果您想在 Apple 上实现 运行,请查找标有圆圈的更改。在TAB(X,Y)
的情况下,需要替换为VTAB(Y)
和HTAB(X)
。
所以我找到了一本叫做 Weird Computer Games 的旧书,里面有 commodore 64 的 BASIC 文字游戏列表,我想输入 运行,并可能用 C# 或重写一些JS.
问题是,我没有 commodore 64 或任何其他老式机器,所以我使用基于在线 JavaScript 的 Aplesoft BASIC 解释器,我已经到了一个地步错误我不明白 - 我认为这是由于使用了不同的基本方言。或者我看错了一些字符。
我得到的错误是:ParseError: Syntax error: Expected ')', saw {"operator":","} in line 610
但是我找不到关于此 TAB 功能的文档。 下面是代码
10 GOSUB 700 : GOSUB 620
19 REM 20 Set up variables (See if you can work outwhat they are.)
20 LET NW=4 : LET M=0 : LET FM=50
29 REM Choose new height "NH". "H" is heigh
30 GOSUB 530 : LET H=NH
40 GOSUB 550
50 LET EF=0 : LET FF=0 : LET HH=H
60 FOR I=1 TO 4 : LET G(I)=0 : NEXT I
70 FOR I=1 TO 4 : LET A$=P$(I)+":" : LET X=1
80 LET Y=1+I : GOSUB 610 : NEXT I
90 GOSUB 490 : GOSUB 430
100 IF M=FM THEN GOTO 250
110 IF EF=1 THEN GOTO 230
120 IF INKEY$(0)="" THEN GOTO 90
130 LET HH=H-1 : GOSUB 510
140 GOSUB 490 : GOSUB 430
150 LET H=HH
160 IF H>0 THEN GOTO 130
170 IF P=17 THEN GOSUB 320
180 IF FF=1 THEN GOTO 240
190 GOSUB 530
200 LET HH=H+1 : GOSUB 510 : GOSUB 490
210 LET H=HH : IF H=NH THEN GOTO 90
220 GOSUB 430 : GOTO 200
230 LET A$="WELL DONE! SUPERWITCH IS PLEASED WITH YOU"
240 LET A$="OUT OF BROOMSTICKS!" : GOTO 260
250 LET A$="TOO LATE!"
260 LET X=1 : LET Y=15 : GOSUB 610
270 STOP
280 LET A$="W" : LET X=P : GOSUB 610
290 FOR T=1 TO 1000 : NEXT T
300 LET NW=NW-1 : IF NW=0 THEN LET FF=1
310 RETURN
320 IF W=1 THEN GOSUB 280 : RETURN
330 LET G(R)=G(R)+1
340 LET A$=STR$(G(R)) : LET X=17
350 LET Y=1+R : GOSUB 610
360 LET P=19 : GOSUB 430
370 LET F=0
380 FOR I=1 TO 4
390 IF G(I)>=N(I) THEN LET F=F+1
400 NEXT I
410 IF F=4 THEN LET EF=1
420 RETURN
430 LET GD=GD+1 : IF GD=6 THEN LET GD=1
440 LET A$=G$(GD) : LET X=1 : LET Y=15 : GOSUB 610
450 LET A$=" " : LET X=P : LET Y=14 : GOSUB 610
460 LET P=P+1 : IF P=20 THEN GOSUB 550
470 LET X=P : LET A$=C$ : GOSUB 610
480 RETURN
490 LET A$="-Y-=" : LET X=16 : LET Y=14-HH
500 GOSUB 610 : RETURN
510 LET A$=" " : LET X=16 : LET Y=14-H
520 GOSUB 610 : RETURN
529 REM 530-540: Choose new height for witch.
530 LET NH = INT(RND(1)*5+3)
540 RETURN
549 REM 550: Chooses an object.
550 LET R=INT(RND(1)*4)+1
559 REM 560: Random chance of object being Broomstick Snatcher.
560 LET W=0 : IF RND(1)>0.8 THEN LET W=1
570 LET C$=LEFT$(P$(R),1) : LET P=1
580 LET M=M+1
590 IF M=FM THEN LET C$="CAULDRON"
600 RETURN
610 PRINT TAB(X,Y); A$ : RETURN
620 CLS : PRINT : PRINT
630 PRINT "THE POTION MUST HAVE" : PRINT
640 FOR I=1 TO 4
650 LET N=INT(RND(1)*3)+2 : LET N(I)=N
660 PRINT : PRINT; N; " "; P$(I)
670 NEXT I : PRINT : PRINT
680 PRINT "PRESS RETURN TO PLAY"
690 INPUT X$ : CLS : RETURN
700 DIM P$(4) : DIM N(4) : DIM G(4)
710 DIM G$(5)
720 FOR I=1 TO 4 : READ P$(I) : NEXT I
730 DATA "TOES OF NEWTS", "EYES OF LIZARDS", "ROOTS OF IVY", "BRAINS OF BATS"
740 LET H$=">====>====>====>====>===="
750 FOR I=1 TO 5 : LET G$(6-I)=MID$(H$,I,I+20)
760 NEXT I : LET GD=1
770 RETURN
首先,那个时代的 BASIC 非常不同,因此您可能会发现 Commodore 64 仿真器(例如 Virtual Consoles useful. That said, this doesn’t look like Commodore 64 BASIC. The C64 TAB statement 中的仿真器)是面向行的:它只是在当前行上标记了那么多.这意味着它只需要一个参数,X;没有Y.
根据 Internet Archive 上 Weird Computer Games 的版本,该代码并非专门针对 Commodore 64,而是针对“BASIC 的标准版本”(参见第 2 页)。查找标有金字塔符号的更改,以了解 Commodore 64 的更改。在这种情况下,第 610 行(带有双参数选项卡的行)需要更改为:
610 PRINT CHR$(19);FOR LL=1 TO Y:PRINT:NEXT:PRINT TAB(X);A$:RETURN
我已经验证了上面模拟器中的这个子例程确实在屏幕上的坐标 X 和 Y 处打印。
在互联网档案馆的本书版本中,您发布的代码从第 10 页“飞行女巫”开始。 Commodore 64 和其他计算机的必要更改位于第 11 页的“转换线”下。每台计算机都有自己的符号(请参阅第 2 页的符号列表),Commodore 64 的符号是金字塔。
如果您想在 Apple 上实现 运行,请查找标有圆圈的更改。在TAB(X,Y)
的情况下,需要替换为VTAB(Y)
和HTAB(X)
。