所以我找到了一本旧的 usborne 书,名为 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
Run Code Online (Sandbox Code Playgroud)
首先,那个时代的 BASIC 非常不同,因此您可能会发现 Commodore 64 模拟器(例如虚拟控制台中的模拟器)很有用。也就是说,这看起来不像 Commodore 64 BASIC。C64 TAB 语句是面向行的:它只是在当前行上进行制表操作。这意味着它只需要一个参数 X;没有Y。
\n\n根据 Internet Archive 上的Weird Computer Games版本,该代码并非专门针对 Commodore 64,而是针对 BASIC\xe2\x80\x9d 的 \xe2\x80\x9ca 标准版本(参见第 2 页)。查找标有金字塔符号的更改,以了解 Commodore 64 的更改。在本例中,第 610 行(带有两个参数选项卡的行)需要更改为:
\n\n610 PRINT CHR$(19);FOR LL=1 TO Y:PRINT:NEXT:PRINT TAB(X);A$:RETURN\nRun Code Online (Sandbox Code Playgroud)\n\n我\xe2\x80\x99已经验证了上面模拟器中的这个子例程实际上确实在屏幕上的坐标X和Y处打印。
\n\n在互联网档案馆的本书版本中,您发布的\xe2\x80\x99代码从第10页开始,\xe2\x80\x9cFlying Witches\xe2\x80\x9d。Commodore 64 和其他计算机的必要更改位于第 11 页的 \xe2\x80\x9cConversionlines\xe2\x80\x9d 下。每台计算机都有自己的符号(符号列表请参见第 2 页),Commodore 64 的符号是金字塔。
\n\n如果你想让它在Apple上运行,请查找用圆圈标记的更改。在 的情况下TAB(X,Y),需要将其替换为VTAB(Y)和HTAB(X)。