GUST NOTCH? DIARY

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

その2からの続きです。

  • 変数定義と初期化の続き


490 B9=K9=0
500 FOR I=1 TO 8
510 FOR J=1 TO 8
520 R1=RND(1)
530 IF R1>.98 THEN 580
540 IF R1>.95 THEN 610
550 IF R1>.8 THEN 640
560 K3=0
570 GOTO 660
580 K3=3
590 K9=K9+3
600 GOTO 660
610 K3=2
620 K9=K9+2
630 GOTO 660
640 K3=1
650 K9=K9+1
660 R1=RND(1)
670 IF R1>.96 THEN 700
680 B3=0
690 GOTO 720
700 B3=1
710 B9=B9+1
720 S3=INT(RND(1)*8+1)
730 G[I,J]=K3*100+B3*10+S3
740 Z[I,J]=0
750 NEXT J
760 NEXT I
770 K7=K9
775 IF B9 <= 0 OR K9 <= 0 THEN 490
780 PRINT "YOU MUST DESTROY"K9;" KLINGONS IN"T9;" STARDATES WITH"B9;" STARBASES"
ここからは銀河系の状態を設定します。8x8の宇宙域のそれぞれの、クリンゴン、基地、星の数を決めていきます。

490行の B9 は基地の数、K9 はクリンゴンの数が入ります。まずは0で初期化します。

500行から760行で、8x8の各宇宙域の状態を決めます。二重のFOR...NEXTで、各宇宙域ごとにクリンゴンの数、基地の数、星の数を決めていきます。

まずは520行から650行のところで、クリンゴンの数を決めます。変数 R1 は乱数を求めるときに使われます。Random の Rですね。
RND(1) は0から1の値の乱数が得られます。これに応じて、

となります。前にも述べましたが、ひとつの宇宙域には、クリンゴンは最大でも3です。
K3 は宇宙域内のクリンゴンの数を表すのに使われます。全体での数 K9 に K3 を追加します。
プチコンの RND() は整数しか返しませんので、こんな感じになるでしょうか。


R1=RND(100)
IF R1>98 THEN K3=3:GOTO @K_TOTAL
IF R1>95 THEN K3=2:GOTO @K_TOTAL
IF R1>80 THEN K3=1:GOTO @K_TOTAL
K3=0
@K_TOTAL
K9=K9+K3
次に基地の数を決めます。660行から710行です。ひとつの宇宙域に複数の基地があることはありません。R1 に乱数を求めて、

  • R1>0.96 の時は基地あり
  • R1<=0.96 の時は基地なし

となります。
B3 が宇宙域内の基地の数を表し、銀河系全体での数は B9 になります。こちらもこんな感じになます。


R1=RND(100)
IF R1>96 THEN B3=1:GOTO @B_TOTAL
B3=0
@B_TOTAL
B9=B9+B3

720行で宇宙域内の星の数を決めます。最大でも8個です。必ず1個以上あります。星の数は S3 に入ります。星の数はゲームの終了に関係ありませんので、銀河系全体の星の数は管理されていません。


S3=RND(8)+1

730行で、座標(I,J)の宇宙域の情報を3桁の数値としてZ[I,J]に保存します。100の位がクリンゴンの数、10の位が基地の数、1の位が星の数です。

740行は、銀河系地図の初期化です。プチコンでは DIM で宣言したときに0で初期化されているのでここで初期化する必要はないはずです。

この処理を8x8の宇宙域の分繰り返します。

770行は、スタート時のクリンゴンの数を K7 に保存しておきます。ゲーム終了時に、撃墜したクリンゴンの数がパラメータとして用いられるためです。

775行で、クリンゴンと基地の数を確認します。どちらかが0の場合は、この作業をやり直します。

以上で、スタート時のパラメータが決定です。
780行で任務を表示します。プチコンでは変数の前にも「;」が必要になりますね。適宜スペースも追加しましょう。


YOU MUST DESTROY 13 KLINGONS IN 30 STARDATES WITH 2 STARBASES

次は、現在いる宇宙域の状態の初期化です。その4に続きます。