GUST NOTCH? DIARY

スタートレックのソースを読む その1

Mike Mayfield が1972年に書いた HP BASIC 用のコードを読みながら、プチコンの命令を確認していこうかと思います。オリジナルのソースはこちら。

プチコンのサイトはこちらです。

  • 予備知識

Star Trek というゲームは、銀河系にいるクリンゴンを決められた年数のうちにすべて倒すのが目的です。エンタープライズ号で銀河系を移動しながらクリンゴンを探し、魚雷やフェーザーという武器でクリンゴンを倒します。魚雷の数やエネルギーには限りがあるので、銀河系内にある基地に停泊することで、それらの補充ができます。
なんでクリンゴンと戦っているのかとかは、以下のあたりから自分で調べてください。

銀河系は、宇宙域(Quadrant)と呼ばれる領域で区切られています。ゲーム中では、銀河系は8x8の宇宙域で構成されています。ひとつの宇宙域の中も8x8のフィールドから構成されています。同じ宇宙域中にクリンゴンが存在すると戦闘状態となります。クリンゴンからも攻撃があります。
攻撃を受けたり、ワープ中に宇宙嵐に遭遇したりすると、計器が故障してしばらく使えなくなったりします。
すべてのクリンゴンを倒せば任務終了。エネルギーが0になったり、エンタープライズ号が破壊されたり、決められた年数を過ぎてしまったりするとゲームオーバーです。

  • コメントとインストラクション

順番に読んでいきましょう。


1 REM **** HP BASIC PROGRAM LIBRARY ******************************
2 REM
3 REM STTR1: STAR TREK
4 REM
5 REM 36243 REV B -- 10/73
6 REM
7 REM **** CONTRIBUTED PROGRAM ***********************************
昔の BASIC は、行番号があってその順番に命令が実行されるのが一般的でした。しかし、プチコンには行番号はありません。
「REM」はコメントを表します。「'」もコメントに使えます。改行まで命令は無視されます*1
1行は100文字まで、プログラムは9999行までだそうです*2

100 REM *****************************************************************
110 REM *** ***
120 REM *** STAR TREK: BY MIKE MAYFIELD, CENTERLINE ENGINEERING ***
130 REM *** ***
140 REM *** TOTAL INTERACTION GAME - ORIG. 20 OCT 1972
150 REM *** ***
160 REM *****************************************************************
170 GOSUB 5460
180 PRINT " STAR TREK "
190 PRINT "DO YOU WANT INSTRUCTIONS (THEY'RE LONG!)";
200 INPUT A$
210 IF A$ <> "YES" THEN 230
220 GOSUB 5820
230 REM ***** PROGRAM STARTS HERE *****

5460 FOR I=1 TO 11
5470 PRINT
5480 NEXT I
5490 PRINT
5500 RETURN
ここまででやっているのは、画面にタイトルを表示して、説明を読むかを聞いています。「YES」とタイプした場合は説明が表示されます。それ以外の入力ではゲームが開始されます。
「GOSUB」はサブルーチンの呼び出しです*3。飛んだ先で「RETURN」になると、呼び出した次の命令に戻って処理を続けます*4。ここで呼ばれているのは12行改行するだけの処理ですね。
プチコンでは行番号がないので、どこに移動するかの指定には「@」ではじまる「ラベル」を使います。ラベル名は、「@」の後、空白か改行が現れるか8文字まで。8文字を超えると実行時に Syntax Error になるようです。「@」の行で空白以降に命令を書いても無視されます*5

「PRINT」は文字列や変数の値を表示します。文字列を表示する場合は「"」でくくります。「;」で終わると、次の文字列が連続して表示されます*6 *7
往年の BASIC と同様、「PRINT」は「?」で代用できるそうです*8

「INPUT」はキーボードからの、数値や文字列の入力を変数で受け取ります。プチコンでも文字変数は後ろに「$」をつけます。変数名はアルファベットで始まる8文字まで。*9
「INPUT」には説明文をつけられますので*10、190行と200行はまとめて以下のように書けます。


INPUT "DO YOU WANT INSTRUCTIONS (THEY'RE LONG!)";A$

「IF...THEN」は「IF」の後の式が真の場合に「THEN」の後の命令が実行されます*11。「ELSE」はありません。
210行で直接行番号を書いているようように、プチコンでも直接「@ラベル名」を書くことができます*12
また、ラベルに飛ぶだけの場合は「IF...GOTO」という命令もあります*13

比較演算子はCのようなスタイルを使うので、not equal は"!="になります*14 *15

「FOR...NEXT」は同じです。「STEP」の指定も可能です。一般的な BASIC では、必ず一回はループ内が実行されたらしいのですが、プチコンではループの実行前に評価が行われるそうで、STEP の値が初期値よりも小さい場合は、ループ内が実行されないそうです*16 *17 *18

今日の最後に、インストラクションを読んでおきましょう。


5820 PRINT " INSTRUCTIONS:"
5830 PRINT "<*> = ENTERPRISE"
5840 PRINT "+++ = KLINGON"
5850 PRINT ">!< = STARBASE"
5860 PRINT " * = STAR"
5870 PRINT "COMMAND 0 = WARP ENGINE CONTROL"
5880 PRINT " 'COURSE' IS IN A CIRCULAR NUMERICAL 4 3 2"
5890 PRINT " VECTOR ARRANGEMENT AS SHOWN. \ ^ /"
5900 PRINT " INTERGER AND REAL VALUES MAY BE \^/"
5910 PRINT " USED. THEREFORE COURSE 1.5 IS 5 ----- 1"
5920 PRINT " HALF WAY BETWEEN 1 AND 2. /^\"
5930 PRINT " / ^ \"
5940 PRINT " A VECTOR OF 9 IS UNDEFINED, BUT 6 7 8"
5950 PRINT " VALUES MAY APPROACH 9."
5960 PRINT " COURSE"
5970 PRINT " ONE 'WARP FACTOR' IS THE SIZE OF"
5980 PRINT " ONE QUADRANT. THEREFORE TO GET"
5990 PRINT " FROM QUADRANT 6,5 TO 5,5 YOU WOULD"
6000 PRINT " USE COURSE 3, WARP FACTOR 1"
6010 PRINT "COMMAND 1 = SHORT RANGE SENSOR SCAN"
6020 PRINT " PRINTS THE QUADRANT YOU ARE CURRENTLY IN, INCLUDING"
6030 PRINT " STARS, KLINGONS, STARBASES, AND THE ENTERPRISE; ALONG"
6040 PRINT " WITH OTHER PERTINATE INFORMATION."
6050 PRINT "COMMAND 2 = LONG RANGE SENSOR SCAN"
6060 PRINT " SHOWS CONDITIONS IN SPACE FOR ONE QUADRANT ON EACH SIDE"
6070 PRINT " OF THE ENTERPRISE IN THE MIDDLE OF THE SCAN. THE SCAN"
6080 PRINT " IS CODED IN THE FORM XXX, WHERE THE UNITS DIGIT IS THE"
6090 PRINT " NUMBER OF STARS, THE TENS DIGIT IS THE NUMBER OF STAR-"
6100 PRINT " BASES, THE HUNDREDS DIGIT IS THE NUMBER OF KLINGONS."
6110 PRINT "COMMAND 3 = PHASER CONTROL"
6120 PRINT " ALLOWS YOU TO DESTROY THE KLINGONS BY HITTING HIM WITH"
6130 PRINT " SUITABLY LARGE NUMBERS OF ENERGY UNITS TO DEPLETE HIS "
6140 PRINT " SHIELD POWER. KEEP IN MIND THAT WHEN YOU SHOOT AT"
6150 PRINT " HIM, HE GONNA DO IT TO YOU TOO."
6160 PRINT "COMMAND 4 = PHOTON TORPEDO CONTROL"
6170 PRINT " COURSE IS THE SAME AS USED IN WARP ENGINE CONTROL"
6180 PRINT " IF YOU HIT THE KLINGON, HE IS DESTROYED AND CANNOT FIRE"
6190 PRINT " BACK AT YOU. IF YOU MISS, HE WILL SHOOT HIS PHASERS AT"
6200 PRINT " YOU."
6210 PRINT " NOTE: THE LIBRARY COMPUTER (COMMAND 7) HAS AN OPTION"
6220 PRINT " TO COMPUTE TORPEDO TRAJECTORY FOR YOU (OPTION 2)."
6230 PRINT "COMMAND 5 = SHIELD CONTROL"
6240 PRINT " DEFINES NUMBER OF ENERGY UNITS TO BE ASSIGNED TO SHIELDS"
6250 PRINT " ENERGY IS TAKEN FROM TOTAL SHIP'S ENERGY."
6260 PRINT "COMMAND 6 = DAMAGE CONTROL REPORT"
6270 PRINT " GIVES STATE OF REPAIRS OF ALL DEVICES. A STATE OF REPAIR"
6280 PRINT " LESS THAN ZERO SHOWS THAT THAT DEVICE IS TEMPORARALY"
6290 PRINT " DAMAGED."
6300 PRINT "COMMAND 7 = LIBRARY COMPUTER"
6310 PRINT " THE LIBRARY COMPUTER CONTAINS THREE OPTIONS:"
6320 PRINT " OPTION 0 = CUMULATIVE GALACTIC RECORD"
6330 PRINT " SHOWS COMPUTER MEMORY OF THE RESULTS OF ALL PREVIOUS"
6340 PRINT " LONG RANGE SENSOR SCANS"
6350 PRINT " OPTION 1 = STATUS REPORT"
6360 PRINT " SHOWS NUMBER OF KLINGONS, STARDATES AND STARBASES"
6370 PRINT " LEFT."
6380 PRINT " OPTION 2 = PHOTON TORPEDO DATA"
6390 PRINT " GIVES TRAJECTORY AND DISTANCE BETWEEN THE ENTERPRISE"
6400 PRINT " AND ALL KLINGONS IN YOUR QUADRANT"
6410 RETURN
このバージョンでの機能は

    • ワープ
    • 短距離センサ
    • 長距離センサ
    • フェーザ
    • 光子魚雷
    • シールド制御
    • ダメージレポート
    • コンピュータ
      • 銀河系地図
      • 状況レポート
      • 魚雷弾道計算

です。
ワープは右側が1で、左周りに8.9までの値で方向と移動量を指定します。
短距離センサは、宇宙域内の状況を表示します。
長距離センサは、周囲の宇宙域の状況を表示します。
フェーザは、エネルギーを放出する武器です。複数のクリンゴンに同時に攻撃ができます。
光子魚雷は、コースを指定して命中すると、確実にクリンゴンを倒すことができます。
シールド制御は、攻撃を防御するためにシールドに回すエネルギーを決定します。
ダメージレポートは、計器の故障状況と復旧状況を示します。
コンピュータが利用可能な場合は以下の機能が使えます。銀河系地図は、これまでに長距離センサで探査した範囲の状況をまとめてみることができます。状況レポートは、残りのクリンゴンの数や残り年数などの確認ができます。魚雷弾道計算は、現在いる宇宙域内のクリンゴンの座標と魚雷のコースを示します。

次回は変数の用途についてです。その2に続きます。